diff --git a/.env b/.env index c72c189..56d4893 100644 --- a/.env +++ b/.env @@ -4,4 +4,5 @@ WDS_SOCKET_PORT=0 NODE_PATH=src/ REACT_APP_API_ROOT=http://localhost:8080 REACT_APP_HOME_URL=http://localhost:3000 - +REACT_APP_API_URL=http://readyvery.com/api/v1 +REACT_APP_KAKAO_LOGIN=http://localhost:8080/oauth2/authorization/kakao \ No newline at end of file diff --git a/.github/workflows/test_merge.yml b/.github/workflows/test_merge.yml index 1f31915..b828986 100644 --- a/.github/workflows/test_merge.yml +++ b/.github/workflows/test_merge.yml @@ -18,11 +18,7 @@ jobs: - name: Set .env from secrets run: | - echo "PORT=${{ secrets.TEST_PORT }}" > .env - echo "WDS_SOCKET_PORT=0" >> .env - echo "NODE_PATH=src/" >> .env - echo "REACT_APP_API_ROOT=${{ secrets.TEST_REACT_APP_API_ROOT }}" >> .env - echo "REACT_APP_HOME_URL=${{ secrets.TEST_REACT_APP_HOME_URL }}" >> .env + echo "${{ secrets.TEST_ENV }}" > .env - name: cat env file run: cat .env @@ -30,31 +26,43 @@ jobs: - name: Generate build # React Build run: npm run build - - name: file copy - uses: actions/upload-artifact@v3 - with: - name: build - path: build - deploy: - needs: build - runs-on: ubuntu-latest - steps: - - name: file download - uses: actions/download-artifact@v3 - with: - name: build - path: build + # - name: file copy + # uses: actions/upload-artifact@v3 + # with: + # name: build + # path: build + # deploy: + # needs: build + # runs-on: ubuntu-latest + # steps: + # - name: file download + # uses: actions/download-artifact@v3 + # with: + # name: build + # path: build + # - name: Upload to Cloudflare + # env: + # AWS_ACCESS_KEY_ID: ${{ secrets.CF_ACCESS_KEY_ID }} + # AWS_SECRET_ACCESS_KEY: ${{ secrets.CF_SECRET_ACCESS_KEY }} + # AWS_DEFAULT_REGION: us-east-1 + # BUCKET_NAME: ${{ secrets.CF_BUCKET_NAME }} + # ENDPOINT_URL: ${{ secrets.CF_ENDPOINT_URL }} + # run: | + # aws s3 sync build s3://$BUCKET_NAME/build_ceo \ + # --endpoint-url $ENDPOINT_URL --delete \ + # --exact-timestamps - name: Upload to Cloudflare + uses: jakejarvis/s3-sync-action@v0.5.1 + with: + args: --delete --exact-timestamps env: AWS_ACCESS_KEY_ID: ${{ secrets.CF_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.CF_SECRET_ACCESS_KEY }} - AWS_DEFAULT_REGION: us-east-1 - BUCKET_NAME: ${{ secrets.CF_BUCKET_NAME }} - ENDPOINT_URL: ${{ secrets.CF_ENDPOINT_URL }} - run: | - aws s3 sync build s3://$BUCKET_NAME/build_ceo \ - --endpoint-url $ENDPOINT_URL --delete \ - --exact-timestamps + AWS_S3_ENDPOINT: ${{ secrets.CF_ENDPOINT_URL }} + AWS_REGION: us-east-1 + AWS_S3_BUCKET: ${{ secrets.CF_BUCKET_NAME }} + SOURCE_DIR: 'build' + DEST_DIR: 'build_ceo' - name: SSH and deploy uses: appleboy/ssh-action@v1.0.0 diff --git a/package-lock.json b/package-lock.json index 52e864a..e88f4d9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,16 +8,27 @@ "name": "readyveryfront", "version": "0.1.0", "dependencies": { + "@emotion/react": "^11.11.1", + "@emotion/styled": "^11.11.0", + "@mui/icons-material": "^5.14.18", + "@mui/material": "^5.14.18", + "@nivo/bar": "^0.83.1", "@testing-library/jest-dom": "^5.17.0", "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^13.5.0", - "axios": "^1.5.1", + "axios": "^1.6.2", + "bootstrap": "^5.3.2", + "moment": "^2.29.4", "react": "^18.2.0", + "react-bootstrap": "^2.9.1", + "react-cookie": "^6.1.1", "react-dom": "^18.2.0", "react-icons": "^4.11.0", + "react-modal": "^3.16.1", "react-redux": "^8.1.3", "react-router-dom": "^6.16.0", "react-scripts": "5.0.1", + "recoil": "^0.7.7", "redux": "^4.2.1", "redux-promise": "^0.6.0", "redux-thunk": "^2.4.2", @@ -2052,9 +2063,9 @@ "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" }, "node_modules/@babel/runtime": { - "version": "7.23.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.1.tgz", - "integrity": "sha512-hC2v6p8ZSI/W0HUzh3V8C5g+NwSKzKPtJwSpTjwl0o297GP9+ZLQSkdvHz46CM3LqyoXxq+5G9komY+eSqSO0g==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz", + "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -2383,6 +2394,75 @@ "postcss-selector-parser": "^6.0.10" } }, + "node_modules/@emotion/babel-plugin": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz", + "integrity": "sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==", + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/serialize": "^1.1.2", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + }, + "node_modules/@emotion/babel-plugin/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" + }, + "node_modules/@emotion/cache": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz", + "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==", + "dependencies": { + "@emotion/memoize": "^0.8.1", + "@emotion/sheet": "^1.2.2", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/cache/node_modules/stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" + }, + "node_modules/@emotion/hash": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", + "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" + }, "node_modules/@emotion/is-prop-valid": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz", @@ -2396,11 +2476,91 @@ "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" }, + "node_modules/@emotion/react": { + "version": "11.11.1", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.1.tgz", + "integrity": "sha512-5mlW1DquU5HaxjLkfkGN1GA/fvVGdyHURRiX/0FHl2cfIfRxSOfmxEH5YS43edp0OldZrZ+dkBKbngxcNCdZvA==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/cache": "^11.11.0", + "@emotion/serialize": "^1.1.2", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.2.tgz", + "integrity": "sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA==", + "dependencies": { + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/unitless": "^0.8.1", + "@emotion/utils": "^1.2.1", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/sheet": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz", + "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==" + }, + "node_modules/@emotion/styled": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.0.tgz", + "integrity": "sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/is-prop-valid": "^1.2.1", + "@emotion/serialize": "^1.1.2", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1" + }, + "peerDependencies": { + "@emotion/react": "^11.0.0-rc.0", + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/@emotion/unitless": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz", + "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@emotion/utils": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz", + "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", + "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", @@ -2494,6 +2654,40 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/@floating-ui/core": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.0.tgz", + "integrity": "sha512-kK1h4m36DQ0UHGj5Ah4db7R0rHemTqqO0QLvUqi1/mUUp3LuAWbWxdxSIf/XsnH9VS6rRVPLJCncjRzUvyCLXg==", + "dependencies": { + "@floating-ui/utils": "^0.1.3" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.3.tgz", + "integrity": "sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==", + "dependencies": { + "@floating-ui/core": "^1.4.2", + "@floating-ui/utils": "^0.1.3" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.4.tgz", + "integrity": "sha512-CF8k2rgKeh/49UrnIBs4BdxPUV6vize/Db1d/YbCLyp9GiVZ0BEwf5AiDSxJRCr6yOkGqTFHtmrULxkEfYZ7dQ==", + "dependencies": { + "@floating-ui/dom": "^1.5.1" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.6.tgz", + "integrity": "sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==" + }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.11", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", @@ -3268,6 +3462,261 @@ "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==" }, + "node_modules/@mui/base": { + "version": "5.0.0-beta.24", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.24.tgz", + "integrity": "sha512-bKt2pUADHGQtqWDZ8nvL2Lvg2GNJyd/ZUgZAJoYzRgmnxBL9j36MSlS3+exEdYkikcnvVafcBtD904RypFKb0w==", + "dependencies": { + "@babel/runtime": "^7.23.2", + "@floating-ui/react-dom": "^2.0.4", + "@mui/types": "^7.2.9", + "@mui/utils": "^5.14.18", + "@popperjs/core": "^2.11.8", + "clsx": "^2.0.0", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/core-downloads-tracker": { + "version": "5.14.18", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.14.18.tgz", + "integrity": "sha512-yFpF35fEVDV81nVktu0BE9qn2dD/chs7PsQhlyaV3EnTeZi9RZBuvoEfRym1/jmhJ2tcfeWXiRuHG942mQXJJQ==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + } + }, + "node_modules/@mui/icons-material": { + "version": "5.14.18", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.14.18.tgz", + "integrity": "sha512-o2z49R1G4SdBaxZjbMmkn+2OdT1bKymLvAYaB6pH59obM1CYv/0vAVm6zO31IqhwtYwXv6A7sLIwCGYTaVkcdg==", + "dependencies": { + "@babel/runtime": "^7.23.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@mui/material": "^5.0.0", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/material": { + "version": "5.14.18", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.14.18.tgz", + "integrity": "sha512-y3UiR/JqrkF5xZR0sIKj6y7xwuEiweh9peiN3Zfjy1gXWXhz5wjlaLdoxFfKIEBUFfeQALxr/Y8avlHH+B9lpQ==", + "dependencies": { + "@babel/runtime": "^7.23.2", + "@mui/base": "5.0.0-beta.24", + "@mui/core-downloads-tracker": "^5.14.18", + "@mui/system": "^5.14.18", + "@mui/types": "^7.2.9", + "@mui/utils": "^5.14.18", + "@types/react-transition-group": "^4.4.8", + "clsx": "^2.0.0", + "csstype": "^3.1.2", + "prop-types": "^15.8.1", + "react-is": "^18.2.0", + "react-transition-group": "^4.4.5" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/material/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, + "node_modules/@mui/private-theming": { + "version": "5.14.18", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.14.18.tgz", + "integrity": "sha512-WSgjqRlzfHU+2Rou3HlR2Gqfr4rZRsvFgataYO3qQ0/m6gShJN+lhVEvwEiJ9QYyVzMDvNpXZAcqp8Y2Vl+PAw==", + "dependencies": { + "@babel/runtime": "^7.23.2", + "@mui/utils": "^5.14.18", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/styled-engine": { + "version": "5.14.18", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.14.18.tgz", + "integrity": "sha512-pW8bpmF9uCB5FV2IPk6mfbQCjPI5vGI09NOLhtGXPeph/4xIfC3JdIX0TILU0WcTs3aFQqo6s2+1SFgIB9rCXA==", + "dependencies": { + "@babel/runtime": "^7.23.2", + "@emotion/cache": "^11.11.0", + "csstype": "^3.1.2", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@emotion/react": "^11.4.1", + "@emotion/styled": "^11.3.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + } + } + }, + "node_modules/@mui/system": { + "version": "5.14.18", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.14.18.tgz", + "integrity": "sha512-hSQQdb3KF72X4EN2hMEiv8EYJZSflfdd1TRaGPoR7CIAG347OxCslpBUwWngYobaxgKvq6xTrlIl+diaactVww==", + "dependencies": { + "@babel/runtime": "^7.23.2", + "@mui/private-theming": "^5.14.18", + "@mui/styled-engine": "^5.14.18", + "@mui/types": "^7.2.9", + "@mui/utils": "^5.14.18", + "clsx": "^2.0.0", + "csstype": "^3.1.2", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/types": { + "version": "7.2.9", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.9.tgz", + "integrity": "sha512-k1lN/PolaRZfNsRdAqXtcR71sTnv3z/VCCGPxU8HfdftDkzi335MdJ6scZxvofMAd/K/9EbzCZTFBmlNpQVdCg==", + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/utils": { + "version": "5.14.18", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.14.18.tgz", + "integrity": "sha512-HZDRsJtEZ7WMSnrHV9uwScGze4wM/Y+u6pDVo+grUjt5yXzn+wI8QX/JwTHh9YSw/WpnUL80mJJjgCnWj2VrzQ==", + "dependencies": { + "@babel/runtime": "^7.23.2", + "@types/prop-types": "^15.7.10", + "prop-types": "^15.8.1", + "react-is": "^18.2.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/utils/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, "node_modules/@nicolo-ribaudo/chokidar-2": { "version": "2.1.8-no-fsevents.3", "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz", @@ -3302,6 +3751,181 @@ "node": ">=4.0" } }, + "node_modules/@nivo/annotations": { + "version": "0.83.1", + "resolved": "https://registry.npmjs.org/@nivo/annotations/-/annotations-0.83.1.tgz", + "integrity": "sha512-GaHw3AGs9hukXD6pCHFj6y01EhGf5ja/m8Pk9qLllqlOogsOhKKDuwMToHsVLywwdjtau1gQ3+PRdqa9BhghEA==", + "dependencies": { + "@nivo/colors": "0.83.1", + "@nivo/core": "0.83.1", + "@react-spring/web": "9.4.5 || ^9.7.2", + "@types/prop-types": "^15.7.2", + "lodash": "^4.17.21", + "prop-types": "^15.7.2" + }, + "peerDependencies": { + "react": ">= 16.14.0 < 19.0.0" + } + }, + "node_modules/@nivo/axes": { + "version": "0.83.1", + "resolved": "https://registry.npmjs.org/@nivo/axes/-/axes-0.83.1.tgz", + "integrity": "sha512-A1wzSIJbeefFjAUluvr1pAQqEJWEFu2dIurJLNXety1pWtAIvdR44pyYZ6ovOTtmM7TFOSBHsOHvxDHnJQhQKg==", + "dependencies": { + "@nivo/core": "0.83.1", + "@nivo/scales": "0.83.0", + "@react-spring/web": "9.4.5 || ^9.7.2", + "@types/d3-format": "^1.4.1", + "@types/d3-time-format": "^2.3.1", + "@types/prop-types": "^15.7.2", + "d3-format": "^1.4.4", + "d3-time-format": "^3.0.0", + "prop-types": "^15.7.2" + }, + "peerDependencies": { + "react": ">= 16.14.0 < 19.0.0" + } + }, + "node_modules/@nivo/bar": { + "version": "0.83.1", + "resolved": "https://registry.npmjs.org/@nivo/bar/-/bar-0.83.1.tgz", + "integrity": "sha512-ALHmfcZrTn8NqumUWiEv3Kqh8i4zkKWy1KJ9GUxGyFBxESZFCtBHy8pktEQHQ/JJGEJLZLx64S1rKj0TZcuB3A==", + "dependencies": { + "@nivo/annotations": "0.83.1", + "@nivo/axes": "0.83.1", + "@nivo/colors": "0.83.1", + "@nivo/core": "0.83.1", + "@nivo/legends": "0.83.1", + "@nivo/scales": "0.83.0", + "@nivo/tooltip": "0.83.1", + "@react-spring/web": "9.4.5 || ^9.7.2", + "@types/d3-scale": "^3.2.3", + "@types/d3-shape": "^2.0.0", + "d3-scale": "^3.2.3", + "d3-shape": "^1.3.5", + "lodash": "^4.17.21" + }, + "peerDependencies": { + "react": ">= 16.14.0 < 19.0.0" + } + }, + "node_modules/@nivo/colors": { + "version": "0.83.1", + "resolved": "https://registry.npmjs.org/@nivo/colors/-/colors-0.83.1.tgz", + "integrity": "sha512-l9Snze6xN29RKOufM3k3Po9KmBkkF5B7lnbFE9LDrcJO8fcNAd6JLSPLAz3ax51ACOlbIzJUvEd7I1nGBH8XEQ==", + "dependencies": { + "@nivo/core": "0.83.1", + "@types/d3-color": "^2.0.0", + "@types/d3-scale": "^3.2.3", + "@types/d3-scale-chromatic": "^2.0.0", + "@types/prop-types": "^15.7.2", + "d3-color": "^3.1.0", + "d3-scale": "^3.2.3", + "d3-scale-chromatic": "^2.0.0", + "lodash": "^4.17.21", + "prop-types": "^15.7.2" + }, + "peerDependencies": { + "react": ">= 16.14.0 < 19.0.0" + } + }, + "node_modules/@nivo/core": { + "version": "0.83.1", + "resolved": "https://registry.npmjs.org/@nivo/core/-/core-0.83.1.tgz", + "integrity": "sha512-1PunY9sH+ieCVVqB3pMjkYEMCsuiDU45CEvkfaNIYbbeeQfgVFuqGquHZXlWeBUqaDHMLRUQqpazh/95tK7Q/g==", + "dependencies": { + "@nivo/recompose": "0.83.0", + "@nivo/tooltip": "0.83.1", + "@react-spring/web": "9.4.5 || ^9.7.2", + "@types/d3-shape": "^2.0.0", + "d3-color": "^3.1.0", + "d3-format": "^1.4.4", + "d3-interpolate": "^3.0.1", + "d3-scale": "^3.2.3", + "d3-scale-chromatic": "^3.0.0", + "d3-shape": "^1.3.5", + "d3-time-format": "^3.0.0", + "lodash": "^4.17.21" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nivo/donate" + }, + "peerDependencies": { + "prop-types": ">= 15.5.10 < 16.0.0", + "react": ">= 16.14.0 < 19.0.0" + } + }, + "node_modules/@nivo/core/node_modules/d3-scale-chromatic": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", + "integrity": "sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==", + "dependencies": { + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@nivo/legends": { + "version": "0.83.1", + "resolved": "https://registry.npmjs.org/@nivo/legends/-/legends-0.83.1.tgz", + "integrity": "sha512-cvGv72yCr8I+LLiNe+xgWN5V1fkKoP7cL+MGYoVc4JP5X4b6DN8xS6ZnoMS5ngChyWMup7CvhHt6mDdyxpHMbg==", + "dependencies": { + "@nivo/colors": "0.83.1", + "@nivo/core": "0.83.1", + "@types/d3-scale": "^3.2.3", + "@types/prop-types": "^15.7.2", + "d3-scale": "^3.2.3", + "prop-types": "^15.7.2" + }, + "peerDependencies": { + "react": ">= 16.14.0 < 19.0.0" + } + }, + "node_modules/@nivo/recompose": { + "version": "0.83.0", + "resolved": "https://registry.npmjs.org/@nivo/recompose/-/recompose-0.83.0.tgz", + "integrity": "sha512-3cLEoi9ZoE4LTn6B98oUVd0MRAy5bWK7W3yb0u4EkjLoXXCRvUAI08Wr2AAagOzVOg5PmvghIDgvkz1tlFZTGQ==", + "dependencies": { + "@types/prop-types": "^15.7.2", + "@types/react-lifecycles-compat": "^3.0.1", + "prop-types": "^15.7.2", + "react-lifecycles-compat": "^3.0.4" + }, + "peerDependencies": { + "react": ">= 16.14.0 < 19.0.0" + } + }, + "node_modules/@nivo/scales": { + "version": "0.83.0", + "resolved": "https://registry.npmjs.org/@nivo/scales/-/scales-0.83.0.tgz", + "integrity": "sha512-DZn5IcMJErCURDuQPmYltu6GTPphTDVLMvbeN/Id/VSVbD1uYKvdXPKUNOe/N2IvnE8wjjCPv88DLcRhw6VTVg==", + "dependencies": { + "@types/d3-scale": "^3.2.3", + "@types/d3-time": "^1.1.1", + "@types/d3-time-format": "^3.0.0", + "d3-scale": "^3.2.3", + "d3-time": "^1.0.11", + "d3-time-format": "^3.0.0", + "lodash": "^4.17.21" + } + }, + "node_modules/@nivo/scales/node_modules/@types/d3-time-format": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-3.0.4.tgz", + "integrity": "sha512-or9DiDnYI1h38J9hxKEsw513+KVuFbEVhl7qdxcaudoiqWWepapUen+2vAriFGexr6W5+P4l9+HJrB39GG+oRg==" + }, + "node_modules/@nivo/tooltip": { + "version": "0.83.1", + "resolved": "https://registry.npmjs.org/@nivo/tooltip/-/tooltip-0.83.1.tgz", + "integrity": "sha512-r266BQhWWtb8FOWyYD0HrlF+xdiKo1XR4uhCYXqARtWSuCUmovBKFUmDGdfMDvLTFnUQYJ6hUbFO7VYp+5AQ9g==", + "dependencies": { + "@nivo/core": "0.83.1", + "@react-spring/web": "9.4.5 || ^9.7.2" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -3383,6 +4007,89 @@ } } }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@react-aria/ssr": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.8.0.tgz", + "integrity": "sha512-Y54xs483rglN5DxbwfCPHxnkvZ+gZ0LbSYmR72LyWPGft8hN/lrl1VRS1EW2SMjnkEWlj+Km2mwvA3kEHDUA0A==", + "dependencies": { + "@swc/helpers": "^0.5.0" + }, + "engines": { + "node": ">= 12" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + } + }, + "node_modules/@react-spring/animated": { + "version": "9.7.3", + "resolved": "https://registry.npmjs.org/@react-spring/animated/-/animated-9.7.3.tgz", + "integrity": "sha512-5CWeNJt9pNgyvuSzQH+uy2pvTg8Y4/OisoscZIR8/ZNLIOI+CatFBhGZpDGTF/OzdNFsAoGk3wiUYTwoJ0YIvw==", + "dependencies": { + "@react-spring/shared": "~9.7.3", + "@react-spring/types": "~9.7.3" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@react-spring/core": { + "version": "9.7.3", + "resolved": "https://registry.npmjs.org/@react-spring/core/-/core-9.7.3.tgz", + "integrity": "sha512-IqFdPVf3ZOC1Cx7+M0cXf4odNLxDC+n7IN3MDcVCTIOSBfqEcBebSv+vlY5AhM0zw05PDbjKrNmBpzv/AqpjnQ==", + "dependencies": { + "@react-spring/animated": "~9.7.3", + "@react-spring/shared": "~9.7.3", + "@react-spring/types": "~9.7.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/react-spring/donate" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@react-spring/shared": { + "version": "9.7.3", + "resolved": "https://registry.npmjs.org/@react-spring/shared/-/shared-9.7.3.tgz", + "integrity": "sha512-NEopD+9S5xYyQ0pGtioacLhL2luflh6HACSSDUZOwLHoxA5eku1UPuqcJqjwSD6luKjjLfiLOspxo43FUHKKSA==", + "dependencies": { + "@react-spring/types": "~9.7.3" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@react-spring/types": { + "version": "9.7.3", + "resolved": "https://registry.npmjs.org/@react-spring/types/-/types-9.7.3.tgz", + "integrity": "sha512-Kpx/fQ/ZFX31OtlqVEFfgaD1ACzul4NksrvIgYfIFq9JpDHFwQkMVZ10tbo0FU/grje4rcL4EIrjekl3kYwgWw==" + }, + "node_modules/@react-spring/web": { + "version": "9.7.3", + "resolved": "https://registry.npmjs.org/@react-spring/web/-/web-9.7.3.tgz", + "integrity": "sha512-BXt6BpS9aJL/QdVqEIX9YoUy8CE6TJrU0mNCqSoxdXlIeNcEBWOfIyE6B14ENNsyQKS3wOWkiJfco0tCr/9tUg==", + "dependencies": { + "@react-spring/animated": "~9.7.3", + "@react-spring/core": "~9.7.3", + "@react-spring/shared": "~9.7.3", + "@react-spring/types": "~9.7.3" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/@remix-run/router": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.9.0.tgz", @@ -3391,6 +4098,45 @@ "node": ">=14.0.0" } }, + "node_modules/@restart/hooks": { + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.4.11.tgz", + "integrity": "sha512-Ft/ncTULZN6ldGHiF/k5qt72O8JyRMOeg0tApvCni8LkoiEahO+z3TNxfXIVGy890YtWVDvJAl662dVJSJXvMw==", + "dependencies": { + "dequal": "^2.0.3" + }, + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@restart/ui": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/@restart/ui/-/ui-1.6.6.tgz", + "integrity": "sha512-eC3puKuWE1SRYbojWHXnvCNHGgf3uzHCb6JOhnF4OXPibOIPEkR1sqDSkL643ydigxwh+ruCa1CmYHlzk7ikKA==", + "dependencies": { + "@babel/runtime": "^7.21.0", + "@popperjs/core": "^2.11.6", + "@react-aria/ssr": "^3.5.0", + "@restart/hooks": "^0.4.9", + "@types/warning": "^3.0.0", + "dequal": "^2.0.3", + "dom-helpers": "^5.2.0", + "uncontrollable": "^8.0.1", + "warning": "^4.0.3" + }, + "peerDependencies": { + "react": ">=16.14.0", + "react-dom": ">=16.14.0" + } + }, + "node_modules/@restart/ui/node_modules/uncontrollable": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-8.0.4.tgz", + "integrity": "sha512-ulRWYWHvscPFc0QQXvyJjY6LIXU56f0h8pQFvhxiKk5V1fcI8gp9Ht9leVAhrVjzqMw0BgjspBINx9r6oyJUvQ==", + "peerDependencies": { + "react": ">=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", @@ -3709,6 +4455,14 @@ "url": "https://github.com/sponsors/gregberge" } }, + "node_modules/@swc/helpers": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.3.tgz", + "integrity": "sha512-FaruWX6KdudYloq1AHD/4nU+UsMTdNE8CKyrseXWEcgjDAbvkwJg2QGPAnfIJLIWsjZOSPLOAykK6fuYp4vp4A==", + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@testing-library/dom": { "version": "9.3.3", "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.3.tgz", @@ -4103,6 +4857,62 @@ "@types/node": "*" } }, + "node_modules/@types/cookie": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.5.4.tgz", + "integrity": "sha512-7z/eR6O859gyWIAjuvBWFzNURmf2oPBmJlfVWkwehU5nzIyjwBsTh7WMmEEV4JFnHuQ3ex4oyTvfKzcyJVDBNA==" + }, + "node_modules/@types/d3-color": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-2.0.6.tgz", + "integrity": "sha512-tbaFGDmJWHqnenvk3QGSvD3RVwr631BjKRD7Sc7VLRgrdX5mk5hTyoeBL6rXZaeoXzmZwIl1D2HPogEdt1rHBg==" + }, + "node_modules/@types/d3-format": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-1.4.5.tgz", + "integrity": "sha512-mLxrC1MSWupOSncXN/HOlWUAAIffAEBaI4+PKy2uMPsKe4FNZlk7qrbTjmzJXITQQqBHivaks4Td18azgqnotA==" + }, + "node_modules/@types/d3-path": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-2.0.4.tgz", + "integrity": "sha512-jjZVLBjEX4q6xneKMmv62UocaFJFOTQSb/1aTzs3m3ICTOFoVaqGBHpNLm/4dVi0/FTltfBKgmOK1ECj3/gGjA==" + }, + "node_modules/@types/d3-scale": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-3.3.5.tgz", + "integrity": "sha512-YOpKj0kIEusRf7ofeJcSZQsvKbnTwpe1DUF+P2qsotqG53kEsjm7EzzliqQxMkAWdkZcHrg5rRhB4JiDOQPX+A==", + "dependencies": { + "@types/d3-time": "^2" + } + }, + "node_modules/@types/d3-scale-chromatic": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-2.0.3.tgz", + "integrity": "sha512-/G5A5ioXNfOAb6E4X6YkJ9u0ryWLVrSkTwvO2DohXQ2zSvgqDOhWU/uj3JVhBrEnGiG+nQSjqXujsl710jSfMw==" + }, + "node_modules/@types/d3-scale/node_modules/@types/d3-time": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-2.1.4.tgz", + "integrity": "sha512-BTfLsxTeo7yFxI/haOOf1ZwJ6xKgQLT9dCp+EcmQv87Gox6X+oKl4mLKfO6fnWm3P22+A6DknMNEZany8ql2Rw==" + }, + "node_modules/@types/d3-shape": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-2.1.6.tgz", + "integrity": "sha512-UvUXi3uJk7i9gstNlyh/+lidKy96AVp6lG6it586lYVIHjS2oRKkOSfaWdON6+Ziu+EqB8kbN3onxk+eP2wSmw==", + "dependencies": { + "@types/d3-path": "^2" + } + }, + "node_modules/@types/d3-time": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-1.1.4.tgz", + "integrity": "sha512-JIvy2HjRInE+TXOmIGN5LCmeO0hkFZx5f9FZ7kiN+D+YTcc8pptsiLiuHsvwxwC7VVKmJ2ExHUgNlAiV7vQM9g==" + }, + "node_modules/@types/d3-time-format": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-2.3.4.tgz", + "integrity": "sha512-xdDXbpVO74EvadI3UDxjxTdR6QIxm1FKzEA/+F8tL4GWWUg/hgvBqf6chql64U5A9ZUGWo7pEu4eNlyLwbKdhg==" + }, "node_modules/@types/eslint": { "version": "8.44.4", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.4.tgz", @@ -4474,9 +5284,9 @@ "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==" }, "node_modules/@types/prop-types": { - "version": "15.7.8", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.8.tgz", - "integrity": "sha512-kMpQpfZKSCBqltAJwskgePRaYRFukDkm1oItcAbC3gNELR20XIBcN9VRgg4+m8DKsTfkWeA4m4Imp4DDuWy7FQ==" + "version": "15.7.10", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.10.tgz", + "integrity": "sha512-mxSnDQxPqsZxmeShFH+uwQ4kO4gcJcGahjjMFeLbKE95IAZiiZyiEepGZjtXJ7hN/yfu0bu9xN2ajcU0JcxX6A==" }, "node_modules/@types/q": { "version": "1.5.6", @@ -4511,6 +5321,22 @@ "@types/react": "*" } }, + "node_modules/@types/react-lifecycles-compat": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", + "integrity": "sha512-1CM48Y9ztL5S4wjt7DK2izrkgPp/Ql0zCJu/vHzhgl7J+BD4UbSGjHN1M2TlePms472JvOazUtAO1/G3oFZqIQ==", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-transition-group": { + "version": "4.4.8", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.8.tgz", + "integrity": "sha512-QmQ22q+Pb+HQSn04NL3HtrqHwYMf4h3QKArOy5F8U5nEVMaihBs3SR10WiOM1iwPz5jIo8x/u11al+iEGZZrvg==", + "dependencies": { + "@types/react": "*" + } + }, "node_modules/@types/resolve": { "version": "1.17.1", "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", @@ -4597,6 +5423,11 @@ "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz", "integrity": "sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==" }, + "node_modules/@types/warning": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/warning/-/warning-3.0.2.tgz", + "integrity": "sha512-S/2+OjBIcBl8Kur23YLe0hG1e7J5m2bHfB4UuMNoLZjIFhQWhTf1FeS+WFoXHUC6QsCEfk4pftj4J1KIKC1glA==" + }, "node_modules/@types/ws": { "version": "8.5.7", "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.7.tgz", @@ -5458,9 +6289,9 @@ } }, "node_modules/axios": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.5.1.tgz", - "integrity": "sha512-Q28iYCWzNHjAm+yEAot5QaAMxhMghWLFVf7rRdwhUI+c2jix2DUXjAHXVi+s1ibs3mjPO/cCgbA++3BjD0vP/A==", + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz", + "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==", "dependencies": { "follow-redirects": "^1.15.0", "form-data": "^4.0.0", @@ -5885,6 +6716,24 @@ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" }, + "node_modules/bootstrap": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.2.tgz", + "integrity": "sha512-D32nmNWiQHo94BKHLmOrdjlL05q1c8oxbtBphQFb9Z5to6eGRDCm0QgeaZ4zFBHzfg2++rqa2JkqCcxDy0sH0g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/twbs" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/bootstrap" + } + ], + "peerDependencies": { + "@popperjs/core": "^2.11.8" + } + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -6157,6 +7006,11 @@ "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==" }, + "node_modules/classnames": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", + "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==" + }, "node_modules/clean-css": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.2.tgz", @@ -6186,6 +7040,14 @@ "wrap-ansi": "^7.0.0" } }, + "node_modules/clsx": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz", + "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==", + "engines": { + "node": ">=6" + } + }, "node_modules/co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -6860,6 +7722,119 @@ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" }, + "node_modules/d3-array": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz", + "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", + "dependencies": { + "internmap": "^1.0.0" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.4.5.tgz", + "integrity": "sha512-J0piedu6Z8iB6TbIGfZgDzfXxUFN3qQRMofy2oPdXzQibYGqPB/9iMcxr/TGalU+2RsyDO+U4f33id8tbnSRMQ==" + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", + "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==" + }, + "node_modules/d3-scale": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-3.3.0.tgz", + "integrity": "sha512-1JGp44NQCt5d1g+Yy+GeOnZP7xHo0ii8zsQp6PGzd+C1/dl0KGsp9A7Mxwp+1D1o4unbTTxVdU/ZOIEBoeZPbQ==", + "dependencies": { + "d3-array": "^2.3.0", + "d3-format": "1 - 2", + "d3-interpolate": "1.2.0 - 2", + "d3-time": "^2.1.1", + "d3-time-format": "2 - 3" + } + }, + "node_modules/d3-scale-chromatic": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-2.0.0.tgz", + "integrity": "sha512-LLqy7dJSL8yDy7NRmf6xSlsFZ6zYvJ4BcWFE4zBrOPnQERv9zj24ohnXKRbyi9YHnYV+HN1oEO3iFK971/gkzA==", + "dependencies": { + "d3-color": "1 - 2", + "d3-interpolate": "1 - 2" + } + }, + "node_modules/d3-scale-chromatic/node_modules/d3-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-2.0.0.tgz", + "integrity": "sha512-SPXi0TSKPD4g9tw0NMZFnR95XVgUZiBH+uUTqQuDu1OsE2zomHU7ho0FISciaPvosimixwHFl3WHLGabv6dDgQ==" + }, + "node_modules/d3-scale-chromatic/node_modules/d3-interpolate": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-2.0.1.tgz", + "integrity": "sha512-c5UhwwTs/yybcmTpAVqwSFl6vrQ8JZJoT5F7xNFK9pymv5C0Ymcc9/LIJHtYIggg/yS9YHw8i8O8tgb9pupjeQ==", + "dependencies": { + "d3-color": "1 - 2" + } + }, + "node_modules/d3-scale/node_modules/d3-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-2.0.0.tgz", + "integrity": "sha512-SPXi0TSKPD4g9tw0NMZFnR95XVgUZiBH+uUTqQuDu1OsE2zomHU7ho0FISciaPvosimixwHFl3WHLGabv6dDgQ==" + }, + "node_modules/d3-scale/node_modules/d3-interpolate": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-2.0.1.tgz", + "integrity": "sha512-c5UhwwTs/yybcmTpAVqwSFl6vrQ8JZJoT5F7xNFK9pymv5C0Ymcc9/LIJHtYIggg/yS9YHw8i8O8tgb9pupjeQ==", + "dependencies": { + "d3-color": "1 - 2" + } + }, + "node_modules/d3-scale/node_modules/d3-time": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-2.1.1.tgz", + "integrity": "sha512-/eIQe/eR4kCQwq7yxi7z4c6qEXf2IYGcjoWB5OOQy4Tq9Uv39/947qlDcN2TLkiTzQWzvnsuYPB9TrWaNfipKQ==", + "dependencies": { + "d3-array": "2" + } + }, + "node_modules/d3-shape": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", + "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "dependencies": { + "d3-path": "1" + } + }, + "node_modules/d3-time": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.1.0.tgz", + "integrity": "sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA==" + }, + "node_modules/d3-time-format": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-3.0.0.tgz", + "integrity": "sha512-UXJh6EKsHBTjopVqZBhFysQcoXSv/5yLONZvkQ5Kk3qbwiUYkdX17Xa1PT6U1ZWXGGfB1ey5L8dKMlFq2DO0Ag==", + "dependencies": { + "d3-time": "1 - 2" + } + }, "node_modules/damerau-levenshtein": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", @@ -7137,6 +8112,15 @@ "utila": "~0.4" } }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, "node_modules/dom-serializer": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", @@ -8224,6 +9208,11 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, + "node_modules/exenv": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/exenv/-/exenv-1.2.2.tgz", + "integrity": "sha512-Z+ktTxTwv9ILfgKCk32OX3n/doe+OcLTRtqK9pcL+JsP3J1/VW8Uvl4ZjLlKqeW4rzK4oesDOGMEMRIZqtP4Iw==" + }, "node_modules/exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", @@ -8495,6 +9484,11 @@ "url": "https://github.com/avajs/find-cache-dir?sponsor=1" } }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" + }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -9047,6 +10041,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/hamt_plus": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/hamt_plus/-/hamt_plus-1.0.2.tgz", + "integrity": "sha512-t2JXKaehnMb9paaYA7J0BX8QQAY8lwfQ9Gjf4pg/mk4krt+cmwmU652HOoWonf+7+EQV97ARPMhhVgU1ra2GhA==" + }, "node_modules/handle-thing": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", @@ -9529,6 +10528,19 @@ "node": ">= 0.4" } }, + "node_modules/internmap": { + "version": "1.0.1", + "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.1.0", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", @@ -12671,6 +13683,14 @@ "mkdirp": "bin/cmd.js" } }, + "node_modules/moment": { + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", + "engines": { + "node": "*" + } + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -14625,6 +15645,23 @@ "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/prop-types-extra/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, "node_modules/prop-types/node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", @@ -14804,6 +15841,48 @@ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" }, + "node_modules/react-bootstrap": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-2.9.1.tgz", + "integrity": "sha512-ezgmh/ARCYp18LbZEqPp0ppvy+ytCmycDORqc8vXSKYV3cer4VH7OReV8uMOoKXmYzivJTxgzGHalGrHamryHA==", + "dependencies": { + "@babel/runtime": "^7.22.5", + "@restart/hooks": "^0.4.9", + "@restart/ui": "^1.6.6", + "@types/react-transition-group": "^4.4.6", + "classnames": "^2.3.2", + "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.5", + "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-cookie": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/react-cookie/-/react-cookie-6.1.1.tgz", + "integrity": "sha512-fuFRpf8LH6SfmVMowDUIRywJF5jAUDUWrm0EI5VdXfTl5bPcJ7B0zWbuYpT0Tvikx7Gs18MlvAT+P+744dUz2g==", + "dependencies": { + "@types/hoist-non-react-statics": "^3.3.1", + "hoist-non-react-statics": "^3.3.2", + "universal-cookie": "^6.0.0" + }, + "peerDependencies": { + "react": ">= 16.3.0" + } + }, "node_modules/react-dev-utils": { "version": "12.0.1", "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", @@ -14951,6 +16030,29 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" }, + "node_modules/react-lifecycles-compat": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" + }, + "node_modules/react-modal": { + "version": "3.16.1", + "resolved": "https://registry.npmjs.org/react-modal/-/react-modal-3.16.1.tgz", + "integrity": "sha512-VStHgI3BVcGo7OXczvnJN7yT2TWHJPDXZWyI/a0ssFNhGZWsPmB8cF0z33ewDXq4VfYMO1vXgiv/g8Nj9NDyWg==", + "dependencies": { + "exenv": "^1.2.0", + "prop-types": "^15.7.2", + "react-lifecycles-compat": "^3.0.0", + "warning": "^4.0.3" + }, + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "react": "^0.14.0 || ^15.0.0 || ^16 || ^17 || ^18", + "react-dom": "^0.14.0 || ^15.0.0 || ^16 || ^17 || ^18" + } + }, "node_modules/react-redux": { "version": "8.1.3", "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-8.1.3.tgz", @@ -15104,6 +16206,21 @@ } } }, + "node_modules/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, "node_modules/read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", @@ -15136,6 +16253,25 @@ "node": ">=8.10.0" } }, + "node_modules/recoil": { + "version": "0.7.7", + "resolved": "https://registry.npmjs.org/recoil/-/recoil-0.7.7.tgz", + "integrity": "sha512-8Og5KPQW9LwC577Vc7Ug2P0vQshkv1y3zG3tSSkWMqkWSwHmE+by06L8JtnGocjW6gcCvfwB3YtrJG6/tWivNQ==", + "dependencies": { + "hamt_plus": "1.0.2" + }, + "peerDependencies": { + "react": ">=16.13.1" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, "node_modules/recursive-readdir": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", @@ -17108,6 +18244,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/underscore": { "version": "1.12.1", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", @@ -17165,6 +18315,15 @@ "node": ">=8" } }, + "node_modules/universal-cookie": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/universal-cookie/-/universal-cookie-6.1.1.tgz", + "integrity": "sha512-33S9x3CpdUnnjwTNs2Fgc41WGve2tdLtvaK2kPSbZRc5pGpz2vQFbRWMxlATsxNNe/Cy8SzmnmbuBM85jpZPtA==", + "dependencies": { + "@types/cookie": "^0.5.1", + "cookie": "^0.5.0" + } + }, "node_modules/universalify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", @@ -17343,6 +18502,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", @@ -19620,9 +20787,9 @@ "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" }, "@babel/runtime": { - "version": "7.23.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.1.tgz", - "integrity": "sha512-hC2v6p8ZSI/W0HUzh3V8C5g+NwSKzKPtJwSpTjwl0o297GP9+ZLQSkdvHz46CM3LqyoXxq+5G9komY+eSqSO0g==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz", + "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==", "requires": { "regenerator-runtime": "^0.14.0" } @@ -19795,6 +20962,70 @@ "integrity": "sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==", "requires": {} }, + "@emotion/babel-plugin": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz", + "integrity": "sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==", + "requires": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/serialize": "^1.1.2", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" + }, + "dependencies": { + "convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==" + }, + "stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" + } + } + }, + "@emotion/cache": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz", + "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==", + "requires": { + "@emotion/memoize": "^0.8.1", + "@emotion/sheet": "^1.2.2", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "stylis": "4.2.0" + }, + "dependencies": { + "stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" + } + } + }, + "@emotion/hash": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", + "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" + }, "@emotion/is-prop-valid": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz", @@ -19808,11 +21039,72 @@ "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" }, + "@emotion/react": { + "version": "11.11.1", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.1.tgz", + "integrity": "sha512-5mlW1DquU5HaxjLkfkGN1GA/fvVGdyHURRiX/0FHl2cfIfRxSOfmxEH5YS43edp0OldZrZ+dkBKbngxcNCdZvA==", + "requires": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/cache": "^11.11.0", + "@emotion/serialize": "^1.1.2", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "hoist-non-react-statics": "^3.3.1" + } + }, + "@emotion/serialize": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.2.tgz", + "integrity": "sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA==", + "requires": { + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/unitless": "^0.8.1", + "@emotion/utils": "^1.2.1", + "csstype": "^3.0.2" + } + }, + "@emotion/sheet": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz", + "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==" + }, + "@emotion/styled": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.0.tgz", + "integrity": "sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng==", + "requires": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/is-prop-valid": "^1.2.1", + "@emotion/serialize": "^1.1.2", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1" + } + }, "@emotion/unitless": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" }, + "@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz", + "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==", + "requires": {} + }, + "@emotion/utils": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz", + "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==" + }, + "@emotion/weak-memoize": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", + "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" + }, "@eslint-community/eslint-utils": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", @@ -19870,10 +21162,40 @@ } } }, - "@eslint/js": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.51.0.tgz", - "integrity": "sha512-HxjQ8Qn+4SI3/AFv6sOrDB+g6PpUTDwSJiQqOrnneEk8L71161srI9gjzzZvYVbzHiVg/BvcH95+cK/zfIt4pg==" + "@eslint/js": { + "version": "8.51.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.51.0.tgz", + "integrity": "sha512-HxjQ8Qn+4SI3/AFv6sOrDB+g6PpUTDwSJiQqOrnneEk8L71161srI9gjzzZvYVbzHiVg/BvcH95+cK/zfIt4pg==" + }, + "@floating-ui/core": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.0.tgz", + "integrity": "sha512-kK1h4m36DQ0UHGj5Ah4db7R0rHemTqqO0QLvUqi1/mUUp3LuAWbWxdxSIf/XsnH9VS6rRVPLJCncjRzUvyCLXg==", + "requires": { + "@floating-ui/utils": "^0.1.3" + } + }, + "@floating-ui/dom": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.3.tgz", + "integrity": "sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==", + "requires": { + "@floating-ui/core": "^1.4.2", + "@floating-ui/utils": "^0.1.3" + } + }, + "@floating-ui/react-dom": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.4.tgz", + "integrity": "sha512-CF8k2rgKeh/49UrnIBs4BdxPUV6vize/Db1d/YbCLyp9GiVZ0BEwf5AiDSxJRCr6yOkGqTFHtmrULxkEfYZ7dQ==", + "requires": { + "@floating-ui/dom": "^1.5.1" + } + }, + "@floating-ui/utils": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.6.tgz", + "integrity": "sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==" }, "@humanwhocodes/config-array": { "version": "0.11.11", @@ -20450,6 +21772,119 @@ "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==" }, + "@mui/base": { + "version": "5.0.0-beta.24", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.24.tgz", + "integrity": "sha512-bKt2pUADHGQtqWDZ8nvL2Lvg2GNJyd/ZUgZAJoYzRgmnxBL9j36MSlS3+exEdYkikcnvVafcBtD904RypFKb0w==", + "requires": { + "@babel/runtime": "^7.23.2", + "@floating-ui/react-dom": "^2.0.4", + "@mui/types": "^7.2.9", + "@mui/utils": "^5.14.18", + "@popperjs/core": "^2.11.8", + "clsx": "^2.0.0", + "prop-types": "^15.8.1" + } + }, + "@mui/core-downloads-tracker": { + "version": "5.14.18", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.14.18.tgz", + "integrity": "sha512-yFpF35fEVDV81nVktu0BE9qn2dD/chs7PsQhlyaV3EnTeZi9RZBuvoEfRym1/jmhJ2tcfeWXiRuHG942mQXJJQ==" + }, + "@mui/icons-material": { + "version": "5.14.18", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.14.18.tgz", + "integrity": "sha512-o2z49R1G4SdBaxZjbMmkn+2OdT1bKymLvAYaB6pH59obM1CYv/0vAVm6zO31IqhwtYwXv6A7sLIwCGYTaVkcdg==", + "requires": { + "@babel/runtime": "^7.23.2" + } + }, + "@mui/material": { + "version": "5.14.18", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.14.18.tgz", + "integrity": "sha512-y3UiR/JqrkF5xZR0sIKj6y7xwuEiweh9peiN3Zfjy1gXWXhz5wjlaLdoxFfKIEBUFfeQALxr/Y8avlHH+B9lpQ==", + "requires": { + "@babel/runtime": "^7.23.2", + "@mui/base": "5.0.0-beta.24", + "@mui/core-downloads-tracker": "^5.14.18", + "@mui/system": "^5.14.18", + "@mui/types": "^7.2.9", + "@mui/utils": "^5.14.18", + "@types/react-transition-group": "^4.4.8", + "clsx": "^2.0.0", + "csstype": "^3.1.2", + "prop-types": "^15.8.1", + "react-is": "^18.2.0", + "react-transition-group": "^4.4.5" + }, + "dependencies": { + "react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + } + } + }, + "@mui/private-theming": { + "version": "5.14.18", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.14.18.tgz", + "integrity": "sha512-WSgjqRlzfHU+2Rou3HlR2Gqfr4rZRsvFgataYO3qQ0/m6gShJN+lhVEvwEiJ9QYyVzMDvNpXZAcqp8Y2Vl+PAw==", + "requires": { + "@babel/runtime": "^7.23.2", + "@mui/utils": "^5.14.18", + "prop-types": "^15.8.1" + } + }, + "@mui/styled-engine": { + "version": "5.14.18", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.14.18.tgz", + "integrity": "sha512-pW8bpmF9uCB5FV2IPk6mfbQCjPI5vGI09NOLhtGXPeph/4xIfC3JdIX0TILU0WcTs3aFQqo6s2+1SFgIB9rCXA==", + "requires": { + "@babel/runtime": "^7.23.2", + "@emotion/cache": "^11.11.0", + "csstype": "^3.1.2", + "prop-types": "^15.8.1" + } + }, + "@mui/system": { + "version": "5.14.18", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.14.18.tgz", + "integrity": "sha512-hSQQdb3KF72X4EN2hMEiv8EYJZSflfdd1TRaGPoR7CIAG347OxCslpBUwWngYobaxgKvq6xTrlIl+diaactVww==", + "requires": { + "@babel/runtime": "^7.23.2", + "@mui/private-theming": "^5.14.18", + "@mui/styled-engine": "^5.14.18", + "@mui/types": "^7.2.9", + "@mui/utils": "^5.14.18", + "clsx": "^2.0.0", + "csstype": "^3.1.2", + "prop-types": "^15.8.1" + } + }, + "@mui/types": { + "version": "7.2.9", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.9.tgz", + "integrity": "sha512-k1lN/PolaRZfNsRdAqXtcR71sTnv3z/VCCGPxU8HfdftDkzi335MdJ6scZxvofMAd/K/9EbzCZTFBmlNpQVdCg==", + "requires": {} + }, + "@mui/utils": { + "version": "5.14.18", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.14.18.tgz", + "integrity": "sha512-HZDRsJtEZ7WMSnrHV9uwScGze4wM/Y+u6pDVo+grUjt5yXzn+wI8QX/JwTHh9YSw/WpnUL80mJJjgCnWj2VrzQ==", + "requires": { + "@babel/runtime": "^7.23.2", + "@types/prop-types": "^15.7.10", + "prop-types": "^15.8.1", + "react-is": "^18.2.0" + }, + "dependencies": { + "react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + } + } + }, "@nicolo-ribaudo/chokidar-2": { "version": "2.1.8-no-fsevents.3", "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz", @@ -20480,6 +21915,156 @@ } } }, + "@nivo/annotations": { + "version": "0.83.1", + "resolved": "https://registry.npmjs.org/@nivo/annotations/-/annotations-0.83.1.tgz", + "integrity": "sha512-GaHw3AGs9hukXD6pCHFj6y01EhGf5ja/m8Pk9qLllqlOogsOhKKDuwMToHsVLywwdjtau1gQ3+PRdqa9BhghEA==", + "requires": { + "@nivo/colors": "0.83.1", + "@nivo/core": "0.83.1", + "@react-spring/web": "9.4.5 || ^9.7.2", + "@types/prop-types": "^15.7.2", + "lodash": "^4.17.21", + "prop-types": "^15.7.2" + } + }, + "@nivo/axes": { + "version": "0.83.1", + "resolved": "https://registry.npmjs.org/@nivo/axes/-/axes-0.83.1.tgz", + "integrity": "sha512-A1wzSIJbeefFjAUluvr1pAQqEJWEFu2dIurJLNXety1pWtAIvdR44pyYZ6ovOTtmM7TFOSBHsOHvxDHnJQhQKg==", + "requires": { + "@nivo/core": "0.83.1", + "@nivo/scales": "0.83.0", + "@react-spring/web": "9.4.5 || ^9.7.2", + "@types/d3-format": "^1.4.1", + "@types/d3-time-format": "^2.3.1", + "@types/prop-types": "^15.7.2", + "d3-format": "^1.4.4", + "d3-time-format": "^3.0.0", + "prop-types": "^15.7.2" + } + }, + "@nivo/bar": { + "version": "0.83.1", + "resolved": "https://registry.npmjs.org/@nivo/bar/-/bar-0.83.1.tgz", + "integrity": "sha512-ALHmfcZrTn8NqumUWiEv3Kqh8i4zkKWy1KJ9GUxGyFBxESZFCtBHy8pktEQHQ/JJGEJLZLx64S1rKj0TZcuB3A==", + "requires": { + "@nivo/annotations": "0.83.1", + "@nivo/axes": "0.83.1", + "@nivo/colors": "0.83.1", + "@nivo/core": "0.83.1", + "@nivo/legends": "0.83.1", + "@nivo/scales": "0.83.0", + "@nivo/tooltip": "0.83.1", + "@react-spring/web": "9.4.5 || ^9.7.2", + "@types/d3-scale": "^3.2.3", + "@types/d3-shape": "^2.0.0", + "d3-scale": "^3.2.3", + "d3-shape": "^1.3.5", + "lodash": "^4.17.21" + } + }, + "@nivo/colors": { + "version": "0.83.1", + "resolved": "https://registry.npmjs.org/@nivo/colors/-/colors-0.83.1.tgz", + "integrity": "sha512-l9Snze6xN29RKOufM3k3Po9KmBkkF5B7lnbFE9LDrcJO8fcNAd6JLSPLAz3ax51ACOlbIzJUvEd7I1nGBH8XEQ==", + "requires": { + "@nivo/core": "0.83.1", + "@types/d3-color": "^2.0.0", + "@types/d3-scale": "^3.2.3", + "@types/d3-scale-chromatic": "^2.0.0", + "@types/prop-types": "^15.7.2", + "d3-color": "^3.1.0", + "d3-scale": "^3.2.3", + "d3-scale-chromatic": "^2.0.0", + "lodash": "^4.17.21", + "prop-types": "^15.7.2" + } + }, + "@nivo/core": { + "version": "0.83.1", + "resolved": "https://registry.npmjs.org/@nivo/core/-/core-0.83.1.tgz", + "integrity": "sha512-1PunY9sH+ieCVVqB3pMjkYEMCsuiDU45CEvkfaNIYbbeeQfgVFuqGquHZXlWeBUqaDHMLRUQqpazh/95tK7Q/g==", + "requires": { + "@nivo/recompose": "0.83.0", + "@nivo/tooltip": "0.83.1", + "@react-spring/web": "9.4.5 || ^9.7.2", + "@types/d3-shape": "^2.0.0", + "d3-color": "^3.1.0", + "d3-format": "^1.4.4", + "d3-interpolate": "^3.0.1", + "d3-scale": "^3.2.3", + "d3-scale-chromatic": "^3.0.0", + "d3-shape": "^1.3.5", + "d3-time-format": "^3.0.0", + "lodash": "^4.17.21" + }, + "dependencies": { + "d3-scale-chromatic": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", + "integrity": "sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==", + "requires": { + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" + } + } + } + }, + "@nivo/legends": { + "version": "0.83.1", + "resolved": "https://registry.npmjs.org/@nivo/legends/-/legends-0.83.1.tgz", + "integrity": "sha512-cvGv72yCr8I+LLiNe+xgWN5V1fkKoP7cL+MGYoVc4JP5X4b6DN8xS6ZnoMS5ngChyWMup7CvhHt6mDdyxpHMbg==", + "requires": { + "@nivo/colors": "0.83.1", + "@nivo/core": "0.83.1", + "@types/d3-scale": "^3.2.3", + "@types/prop-types": "^15.7.2", + "d3-scale": "^3.2.3", + "prop-types": "^15.7.2" + } + }, + "@nivo/recompose": { + "version": "0.83.0", + "resolved": "https://registry.npmjs.org/@nivo/recompose/-/recompose-0.83.0.tgz", + "integrity": "sha512-3cLEoi9ZoE4LTn6B98oUVd0MRAy5bWK7W3yb0u4EkjLoXXCRvUAI08Wr2AAagOzVOg5PmvghIDgvkz1tlFZTGQ==", + "requires": { + "@types/prop-types": "^15.7.2", + "@types/react-lifecycles-compat": "^3.0.1", + "prop-types": "^15.7.2", + "react-lifecycles-compat": "^3.0.4" + } + }, + "@nivo/scales": { + "version": "0.83.0", + "resolved": "https://registry.npmjs.org/@nivo/scales/-/scales-0.83.0.tgz", + "integrity": "sha512-DZn5IcMJErCURDuQPmYltu6GTPphTDVLMvbeN/Id/VSVbD1uYKvdXPKUNOe/N2IvnE8wjjCPv88DLcRhw6VTVg==", + "requires": { + "@types/d3-scale": "^3.2.3", + "@types/d3-time": "^1.1.1", + "@types/d3-time-format": "^3.0.0", + "d3-scale": "^3.2.3", + "d3-time": "^1.0.11", + "d3-time-format": "^3.0.0", + "lodash": "^4.17.21" + }, + "dependencies": { + "@types/d3-time-format": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-3.0.4.tgz", + "integrity": "sha512-or9DiDnYI1h38J9hxKEsw513+KVuFbEVhl7qdxcaudoiqWWepapUen+2vAriFGexr6W5+P4l9+HJrB39GG+oRg==" + } + } + }, + "@nivo/tooltip": { + "version": "0.83.1", + "resolved": "https://registry.npmjs.org/@nivo/tooltip/-/tooltip-0.83.1.tgz", + "integrity": "sha512-r266BQhWWtb8FOWyYD0HrlF+xdiKo1XR4uhCYXqARtWSuCUmovBKFUmDGdfMDvLTFnUQYJ6hUbFO7VYp+5AQ9g==", + "requires": { + "@nivo/core": "0.83.1", + "@react-spring/web": "9.4.5 || ^9.7.2" + } + }, "@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -20519,11 +22104,99 @@ "source-map": "^0.7.3" } }, + "@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==" + }, + "@react-aria/ssr": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.8.0.tgz", + "integrity": "sha512-Y54xs483rglN5DxbwfCPHxnkvZ+gZ0LbSYmR72LyWPGft8hN/lrl1VRS1EW2SMjnkEWlj+Km2mwvA3kEHDUA0A==", + "requires": { + "@swc/helpers": "^0.5.0" + } + }, + "@react-spring/animated": { + "version": "9.7.3", + "resolved": "https://registry.npmjs.org/@react-spring/animated/-/animated-9.7.3.tgz", + "integrity": "sha512-5CWeNJt9pNgyvuSzQH+uy2pvTg8Y4/OisoscZIR8/ZNLIOI+CatFBhGZpDGTF/OzdNFsAoGk3wiUYTwoJ0YIvw==", + "requires": { + "@react-spring/shared": "~9.7.3", + "@react-spring/types": "~9.7.3" + } + }, + "@react-spring/core": { + "version": "9.7.3", + "resolved": "https://registry.npmjs.org/@react-spring/core/-/core-9.7.3.tgz", + "integrity": "sha512-IqFdPVf3ZOC1Cx7+M0cXf4odNLxDC+n7IN3MDcVCTIOSBfqEcBebSv+vlY5AhM0zw05PDbjKrNmBpzv/AqpjnQ==", + "requires": { + "@react-spring/animated": "~9.7.3", + "@react-spring/shared": "~9.7.3", + "@react-spring/types": "~9.7.3" + } + }, + "@react-spring/shared": { + "version": "9.7.3", + "resolved": "https://registry.npmjs.org/@react-spring/shared/-/shared-9.7.3.tgz", + "integrity": "sha512-NEopD+9S5xYyQ0pGtioacLhL2luflh6HACSSDUZOwLHoxA5eku1UPuqcJqjwSD6luKjjLfiLOspxo43FUHKKSA==", + "requires": { + "@react-spring/types": "~9.7.3" + } + }, + "@react-spring/types": { + "version": "9.7.3", + "resolved": "https://registry.npmjs.org/@react-spring/types/-/types-9.7.3.tgz", + "integrity": "sha512-Kpx/fQ/ZFX31OtlqVEFfgaD1ACzul4NksrvIgYfIFq9JpDHFwQkMVZ10tbo0FU/grje4rcL4EIrjekl3kYwgWw==" + }, + "@react-spring/web": { + "version": "9.7.3", + "resolved": "https://registry.npmjs.org/@react-spring/web/-/web-9.7.3.tgz", + "integrity": "sha512-BXt6BpS9aJL/QdVqEIX9YoUy8CE6TJrU0mNCqSoxdXlIeNcEBWOfIyE6B14ENNsyQKS3wOWkiJfco0tCr/9tUg==", + "requires": { + "@react-spring/animated": "~9.7.3", + "@react-spring/core": "~9.7.3", + "@react-spring/shared": "~9.7.3", + "@react-spring/types": "~9.7.3" + } + }, "@remix-run/router": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.9.0.tgz", "integrity": "sha512-bV63itrKBC0zdT27qYm6SDZHlkXwFL1xMBuhkn+X7l0+IIhNaH5wuuvZKp6eKhCD4KFhujhfhCT1YxXW6esUIA==" }, + "@restart/hooks": { + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.4.11.tgz", + "integrity": "sha512-Ft/ncTULZN6ldGHiF/k5qt72O8JyRMOeg0tApvCni8LkoiEahO+z3TNxfXIVGy890YtWVDvJAl662dVJSJXvMw==", + "requires": { + "dequal": "^2.0.3" + } + }, + "@restart/ui": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/@restart/ui/-/ui-1.6.6.tgz", + "integrity": "sha512-eC3puKuWE1SRYbojWHXnvCNHGgf3uzHCb6JOhnF4OXPibOIPEkR1sqDSkL643ydigxwh+ruCa1CmYHlzk7ikKA==", + "requires": { + "@babel/runtime": "^7.21.0", + "@popperjs/core": "^2.11.6", + "@react-aria/ssr": "^3.5.0", + "@restart/hooks": "^0.4.9", + "@types/warning": "^3.0.0", + "dequal": "^2.0.3", + "dom-helpers": "^5.2.0", + "uncontrollable": "^8.0.1", + "warning": "^4.0.3" + }, + "dependencies": { + "uncontrollable": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-8.0.4.tgz", + "integrity": "sha512-ulRWYWHvscPFc0QQXvyJjY6LIXU56f0h8pQFvhxiKk5V1fcI8gp9Ht9leVAhrVjzqMw0BgjspBINx9r6oyJUvQ==", + "requires": {} + } + } + }, "@rollup/plugin-babel": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", @@ -20718,6 +22391,14 @@ "loader-utils": "^2.0.0" } }, + "@swc/helpers": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.3.tgz", + "integrity": "sha512-FaruWX6KdudYloq1AHD/4nU+UsMTdNE8CKyrseXWEcgjDAbvkwJg2QGPAnfIJLIWsjZOSPLOAykK6fuYp4vp4A==", + "requires": { + "tslib": "^2.4.0" + } + }, "@testing-library/dom": { "version": "9.3.3", "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.3.tgz", @@ -21027,6 +22708,64 @@ "@types/node": "*" } }, + "@types/cookie": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.5.4.tgz", + "integrity": "sha512-7z/eR6O859gyWIAjuvBWFzNURmf2oPBmJlfVWkwehU5nzIyjwBsTh7WMmEEV4JFnHuQ3ex4oyTvfKzcyJVDBNA==" + }, + "@types/d3-color": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-2.0.6.tgz", + "integrity": "sha512-tbaFGDmJWHqnenvk3QGSvD3RVwr631BjKRD7Sc7VLRgrdX5mk5hTyoeBL6rXZaeoXzmZwIl1D2HPogEdt1rHBg==" + }, + "@types/d3-format": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-1.4.5.tgz", + "integrity": "sha512-mLxrC1MSWupOSncXN/HOlWUAAIffAEBaI4+PKy2uMPsKe4FNZlk7qrbTjmzJXITQQqBHivaks4Td18azgqnotA==" + }, + "@types/d3-path": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-2.0.4.tgz", + "integrity": "sha512-jjZVLBjEX4q6xneKMmv62UocaFJFOTQSb/1aTzs3m3ICTOFoVaqGBHpNLm/4dVi0/FTltfBKgmOK1ECj3/gGjA==" + }, + "@types/d3-scale": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-3.3.5.tgz", + "integrity": "sha512-YOpKj0kIEusRf7ofeJcSZQsvKbnTwpe1DUF+P2qsotqG53kEsjm7EzzliqQxMkAWdkZcHrg5rRhB4JiDOQPX+A==", + "requires": { + "@types/d3-time": "^2" + }, + "dependencies": { + "@types/d3-time": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-2.1.4.tgz", + "integrity": "sha512-BTfLsxTeo7yFxI/haOOf1ZwJ6xKgQLT9dCp+EcmQv87Gox6X+oKl4mLKfO6fnWm3P22+A6DknMNEZany8ql2Rw==" + } + } + }, + "@types/d3-scale-chromatic": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-2.0.3.tgz", + "integrity": "sha512-/G5A5ioXNfOAb6E4X6YkJ9u0ryWLVrSkTwvO2DohXQ2zSvgqDOhWU/uj3JVhBrEnGiG+nQSjqXujsl710jSfMw==" + }, + "@types/d3-shape": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-2.1.6.tgz", + "integrity": "sha512-UvUXi3uJk7i9gstNlyh/+lidKy96AVp6lG6it586lYVIHjS2oRKkOSfaWdON6+Ziu+EqB8kbN3onxk+eP2wSmw==", + "requires": { + "@types/d3-path": "^2" + } + }, + "@types/d3-time": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-1.1.4.tgz", + "integrity": "sha512-JIvy2HjRInE+TXOmIGN5LCmeO0hkFZx5f9FZ7kiN+D+YTcc8pptsiLiuHsvwxwC7VVKmJ2ExHUgNlAiV7vQM9g==" + }, + "@types/d3-time-format": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-2.3.4.tgz", + "integrity": "sha512-xdDXbpVO74EvadI3UDxjxTdR6QIxm1FKzEA/+F8tL4GWWUg/hgvBqf6chql64U5A9ZUGWo7pEu4eNlyLwbKdhg==" + }, "@types/eslint": { "version": "8.44.4", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.4.tgz", @@ -21345,9 +23084,9 @@ "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==" }, "@types/prop-types": { - "version": "15.7.8", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.8.tgz", - "integrity": "sha512-kMpQpfZKSCBqltAJwskgePRaYRFukDkm1oItcAbC3gNELR20XIBcN9VRgg4+m8DKsTfkWeA4m4Imp4DDuWy7FQ==" + "version": "15.7.10", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.10.tgz", + "integrity": "sha512-mxSnDQxPqsZxmeShFH+uwQ4kO4gcJcGahjjMFeLbKE95IAZiiZyiEepGZjtXJ7hN/yfu0bu9xN2ajcU0JcxX6A==" }, "@types/q": { "version": "1.5.6", @@ -21382,6 +23121,22 @@ "@types/react": "*" } }, + "@types/react-lifecycles-compat": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", + "integrity": "sha512-1CM48Y9ztL5S4wjt7DK2izrkgPp/Ql0zCJu/vHzhgl7J+BD4UbSGjHN1M2TlePms472JvOazUtAO1/G3oFZqIQ==", + "requires": { + "@types/react": "*" + } + }, + "@types/react-transition-group": { + "version": "4.4.8", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.8.tgz", + "integrity": "sha512-QmQ22q+Pb+HQSn04NL3HtrqHwYMf4h3QKArOy5F8U5nEVMaihBs3SR10WiOM1iwPz5jIo8x/u11al+iEGZZrvg==", + "requires": { + "@types/react": "*" + } + }, "@types/resolve": { "version": "1.17.1", "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", @@ -21468,6 +23223,11 @@ "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz", "integrity": "sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==" }, + "@types/warning": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/warning/-/warning-3.0.2.tgz", + "integrity": "sha512-S/2+OjBIcBl8Kur23YLe0hG1e7J5m2bHfB4UuMNoLZjIFhQWhTf1FeS+WFoXHUC6QsCEfk4pftj4J1KIKC1glA==" + }, "@types/ws": { "version": "8.5.7", "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.7.tgz", @@ -22083,9 +23843,9 @@ "integrity": "sha512-/dlp0fxyM3R8YW7MFzaHWXrf4zzbr0vaYb23VBFCl83R7nWNPg/yaQw2Dc8jzCMmDVLhSdzH8MjrsuIUuvX+6g==" }, "axios": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.5.1.tgz", - "integrity": "sha512-Q28iYCWzNHjAm+yEAot5QaAMxhMghWLFVf7rRdwhUI+c2jix2DUXjAHXVi+s1ibs3mjPO/cCgbA++3BjD0vP/A==", + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz", + "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==", "requires": { "follow-redirects": "^1.15.0", "form-data": "^4.0.0", @@ -22424,6 +24184,12 @@ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" }, + "bootstrap": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.2.tgz", + "integrity": "sha512-D32nmNWiQHo94BKHLmOrdjlL05q1c8oxbtBphQFb9Z5to6eGRDCm0QgeaZ4zFBHzfg2++rqa2JkqCcxDy0sH0g==", + "requires": {} + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -22599,6 +24365,11 @@ "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==" }, + "classnames": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", + "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==" + }, "clean-css": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.2.tgz", @@ -22624,6 +24395,11 @@ "wrap-ansi": "^7.0.0" } }, + "clsx": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz", + "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==" + }, "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -23102,6 +24878,117 @@ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" }, + "d3-array": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz", + "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", + "requires": { + "internmap": "^1.0.0" + } + }, + "d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==" + }, + "d3-format": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.4.5.tgz", + "integrity": "sha512-J0piedu6Z8iB6TbIGfZgDzfXxUFN3qQRMofy2oPdXzQibYGqPB/9iMcxr/TGalU+2RsyDO+U4f33id8tbnSRMQ==" + }, + "d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "requires": { + "d3-color": "1 - 3" + } + }, + "d3-path": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", + "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==" + }, + "d3-scale": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-3.3.0.tgz", + "integrity": "sha512-1JGp44NQCt5d1g+Yy+GeOnZP7xHo0ii8zsQp6PGzd+C1/dl0KGsp9A7Mxwp+1D1o4unbTTxVdU/ZOIEBoeZPbQ==", + "requires": { + "d3-array": "^2.3.0", + "d3-format": "1 - 2", + "d3-interpolate": "1.2.0 - 2", + "d3-time": "^2.1.1", + "d3-time-format": "2 - 3" + }, + "dependencies": { + "d3-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-2.0.0.tgz", + "integrity": "sha512-SPXi0TSKPD4g9tw0NMZFnR95XVgUZiBH+uUTqQuDu1OsE2zomHU7ho0FISciaPvosimixwHFl3WHLGabv6dDgQ==" + }, + "d3-interpolate": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-2.0.1.tgz", + "integrity": "sha512-c5UhwwTs/yybcmTpAVqwSFl6vrQ8JZJoT5F7xNFK9pymv5C0Ymcc9/LIJHtYIggg/yS9YHw8i8O8tgb9pupjeQ==", + "requires": { + "d3-color": "1 - 2" + } + }, + "d3-time": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-2.1.1.tgz", + "integrity": "sha512-/eIQe/eR4kCQwq7yxi7z4c6qEXf2IYGcjoWB5OOQy4Tq9Uv39/947qlDcN2TLkiTzQWzvnsuYPB9TrWaNfipKQ==", + "requires": { + "d3-array": "2" + } + } + } + }, + "d3-scale-chromatic": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-2.0.0.tgz", + "integrity": "sha512-LLqy7dJSL8yDy7NRmf6xSlsFZ6zYvJ4BcWFE4zBrOPnQERv9zj24ohnXKRbyi9YHnYV+HN1oEO3iFK971/gkzA==", + "requires": { + "d3-color": "1 - 2", + "d3-interpolate": "1 - 2" + }, + "dependencies": { + "d3-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-2.0.0.tgz", + "integrity": "sha512-SPXi0TSKPD4g9tw0NMZFnR95XVgUZiBH+uUTqQuDu1OsE2zomHU7ho0FISciaPvosimixwHFl3WHLGabv6dDgQ==" + }, + "d3-interpolate": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-2.0.1.tgz", + "integrity": "sha512-c5UhwwTs/yybcmTpAVqwSFl6vrQ8JZJoT5F7xNFK9pymv5C0Ymcc9/LIJHtYIggg/yS9YHw8i8O8tgb9pupjeQ==", + "requires": { + "d3-color": "1 - 2" + } + } + } + }, + "d3-shape": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", + "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "requires": { + "d3-path": "1" + } + }, + "d3-time": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.1.0.tgz", + "integrity": "sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA==" + }, + "d3-time-format": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-3.0.0.tgz", + "integrity": "sha512-UXJh6EKsHBTjopVqZBhFysQcoXSv/5yLONZvkQ5Kk3qbwiUYkdX17Xa1PT6U1ZWXGGfB1ey5L8dKMlFq2DO0Ag==", + "requires": { + "d3-time": "1 - 2" + } + }, "damerau-levenshtein": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", @@ -23314,6 +25201,15 @@ "utila": "~0.4" } }, + "dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "requires": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, "dom-serializer": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", @@ -24107,6 +26003,11 @@ "strip-final-newline": "^2.0.0" } }, + "exenv": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/exenv/-/exenv-1.2.2.tgz", + "integrity": "sha512-Z+ktTxTwv9ILfgKCk32OX3n/doe+OcLTRtqK9pcL+JsP3J1/VW8Uvl4ZjLlKqeW4rzK4oesDOGMEMRIZqtP4Iw==" + }, "exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", @@ -24337,6 +26238,11 @@ "pkg-dir": "^4.1.0" } }, + "find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" + }, "find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -24714,6 +26620,11 @@ "duplexer": "^0.1.2" } }, + "hamt_plus": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/hamt_plus/-/hamt_plus-1.0.2.tgz", + "integrity": "sha512-t2JXKaehnMb9paaYA7J0BX8QQAY8lwfQ9Gjf4pg/mk4krt+cmwmU652HOoWonf+7+EQV97ARPMhhVgU1ra2GhA==" + }, "handle-thing": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", @@ -25059,6 +26970,19 @@ "side-channel": "^1.0.4" } }, + "internmap": { + "version": "1.0.1", + "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.1.0", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", @@ -27335,6 +29259,11 @@ "minimist": "^1.2.6" } }, + "moment": { + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==" + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -28562,6 +30491,22 @@ } } }, + "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" + }, + "dependencies": { + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + } + } + }, "proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -28691,6 +30636,35 @@ } } }, + "react-bootstrap": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-2.9.1.tgz", + "integrity": "sha512-ezgmh/ARCYp18LbZEqPp0ppvy+ytCmycDORqc8vXSKYV3cer4VH7OReV8uMOoKXmYzivJTxgzGHalGrHamryHA==", + "requires": { + "@babel/runtime": "^7.22.5", + "@restart/hooks": "^0.4.9", + "@restart/ui": "^1.6.6", + "@types/react-transition-group": "^4.4.6", + "classnames": "^2.3.2", + "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.5", + "uncontrollable": "^7.2.1", + "warning": "^4.0.3" + } + }, + "react-cookie": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/react-cookie/-/react-cookie-6.1.1.tgz", + "integrity": "sha512-fuFRpf8LH6SfmVMowDUIRywJF5jAUDUWrm0EI5VdXfTl5bPcJ7B0zWbuYpT0Tvikx7Gs18MlvAT+P+744dUz2g==", + "requires": { + "@types/hoist-non-react-statics": "^3.3.1", + "hoist-non-react-statics": "^3.3.2", + "universal-cookie": "^6.0.0" + } + }, "react-dev-utils": { "version": "12.0.1", "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", @@ -28802,6 +30776,22 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" }, + "react-lifecycles-compat": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" + }, + "react-modal": { + "version": "3.16.1", + "resolved": "https://registry.npmjs.org/react-modal/-/react-modal-3.16.1.tgz", + "integrity": "sha512-VStHgI3BVcGo7OXczvnJN7yT2TWHJPDXZWyI/a0ssFNhGZWsPmB8cF0z33ewDXq4VfYMO1vXgiv/g8Nj9NDyWg==", + "requires": { + "exenv": "^1.2.0", + "prop-types": "^15.7.2", + "react-lifecycles-compat": "^3.0.0", + "warning": "^4.0.3" + } + }, "react-redux": { "version": "8.1.3", "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-8.1.3.tgz", @@ -28899,6 +30889,17 @@ "workbox-webpack-plugin": "^6.4.1" } }, + "react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "requires": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + } + }, "read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", @@ -28925,6 +30926,14 @@ "picomatch": "^2.2.1" } }, + "recoil": { + "version": "0.7.7", + "resolved": "https://registry.npmjs.org/recoil/-/recoil-0.7.7.tgz", + "integrity": "sha512-8Og5KPQW9LwC577Vc7Ug2P0vQshkv1y3zG3tSSkWMqkWSwHmE+by06L8JtnGocjW6gcCvfwB3YtrJG6/tWivNQ==", + "requires": { + "hamt_plus": "1.0.2" + } + }, "recursive-readdir": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", @@ -30377,6 +32386,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" + } + }, "underscore": { "version": "1.12.1", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", @@ -30419,6 +32439,15 @@ "crypto-random-string": "^2.0.0" } }, + "universal-cookie": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/universal-cookie/-/universal-cookie-6.1.1.tgz", + "integrity": "sha512-33S9x3CpdUnnjwTNs2Fgc41WGve2tdLtvaK2kPSbZRc5pGpz2vQFbRWMxlATsxNNe/Cy8SzmnmbuBM85jpZPtA==", + "requires": { + "@types/cookie": "^0.5.1", + "cookie": "^0.5.0" + } + }, "universalify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", @@ -30548,6 +32577,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 850bf56..d2cf359 100644 --- a/package.json +++ b/package.json @@ -3,16 +3,27 @@ "version": "0.1.0", "private": true, "dependencies": { + "@emotion/react": "^11.11.1", + "@emotion/styled": "^11.11.0", + "@mui/icons-material": "^5.14.18", + "@mui/material": "^5.14.18", + "@nivo/bar": "^0.83.1", "@testing-library/jest-dom": "^5.17.0", "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^13.5.0", - "axios": "^1.5.1", + "axios": "^1.6.2", + "bootstrap": "^5.3.2", + "moment": "^2.29.4", "react": "^18.2.0", + "react-bootstrap": "^2.9.1", + "react-cookie": "^6.1.1", "react-dom": "^18.2.0", "react-icons": "^4.11.0", + "react-modal": "^3.16.1", "react-redux": "^8.1.3", "react-router-dom": "^6.16.0", "react-scripts": "5.0.1", + "recoil": "^0.7.7", "redux": "^4.2.1", "redux-promise": "^0.6.0", "redux-thunk": "^2.4.2", diff --git a/public/favicon.ico b/public/favicon.ico index a11777c..7457c6e 100644 Binary files a/public/favicon.ico and b/public/favicon.ico differ diff --git a/public/index.html b/public/index.html index aa069f2..50095ca 100644 --- a/public/index.html +++ b/public/index.html @@ -24,7 +24,7 @@ work correctly both with client-side routing and a non-root public URL. Learn how to configure a non-root public URL by running `npm run build`. --> - React App + ReadyVery diff --git a/src/App.css b/src/App.css index 74b5e05..df771ae 100644 --- a/src/App.css +++ b/src/App.css @@ -36,3 +36,38 @@ transform: rotate(360deg); } } + +@font-face { + font-family: "Bold"; + src: url("/src/assets/font/Pretendard-Bold.woff2"); +} + +@font-face { + font-family: "ExtraBold"; + src: url("/src/assets/font/Pretendard-ExtraBold.woff2"); +} + +@font-face { + font-family: "ExtraLight"; + src: url("/src/assets/font/Pretendard-ExtraLight.woff2"); +} + +@font-face { + font-family: "Light"; + src: url("/src/assets/font/Pretendard-Light.woff2"); +} + +@font-face { + font-family: "Medium"; + src: url("/src/assets/font/Pretendard-Medium.woff2"); +} + +@font-face { + font-family: "Regular"; + src: url("/src/assets/font/Pretendard-Regular.woff2"); +} + +@font-face { + font-family: "SemiBold"; + src: url("/src/assets/font/Pretendard-SemiBold.woff2"); +} diff --git a/src/App.js b/src/App.js index 6c349ae..299ac14 100644 --- a/src/App.js +++ b/src/App.js @@ -1,19 +1,65 @@ +import axios from "axios"; +import React, { Suspense } from "react"; +import { useCookies } from "react-cookie"; +import { Route, Routes, useNavigate } from "react-router-dom"; +import { RecoilRoot } from "recoil"; +import InventoryPage from "../src/pages/Inventory/Inventory"; +import Mypage from "../src/pages/Mypage/Mypage"; +import SalesPage from "../src/pages/Sales/Sales"; import "./App.css"; -import { Route, Routes, Navigate } from "react-router-dom"; -import LandingPage from "../src/pages/LandingPage/LandingPage"; -import TestPage from "../src/pages/TestPage/TestPage"; +import Auth from "./hoc/auth.jsx"; +import useInterval from "./hooks/useInterval.jsx"; +import HomePage from "./pages/Home/Home"; +import MainPage from "./pages/Main/MainPage.jsx"; function App() { + const [cookies, , removeCookies] = useCookies(); + const navigate = useNavigate(); + const apiUrl = process.env.REACT_APP_API_ROOT; + + const NewLoginPage = Auth(MainPage, false); + const NewHomePage = Auth(HomePage, true); + const NewInventoryPage = Auth(InventoryPage, true); + const NewSalesPage = Auth(SalesPage, true); + const NewMyPage = Auth(Mypage, true); + + const expiredTime = 1000 * 60 * 60 * 24; + useInterval(() => { + if ( + cookies.refreshToken !== "undefined" && + cookies.refreshToken !== undefined && + cookies.refreshToken + ) { + const config = { + withCredentials: true, + }; + axios + .get(`${apiUrl}/api/v1/refresh/token`, config) + .then((response) => { + console.log(response); + if (!response.data) { + removeCookies(); + navigate("/"); + } + }) + .catch((err) => { + navigate("/"); + }); + } + }, expiredTime - 60000); return (
- - {/* 메인페이지 */} - } /> - {/* 없는 경로로 갈경우 메인페이지로 강제 이동 */} - }> - {/* 테스트 페이지 */} - } /> - + + Loading...
}> + + } /> + } /> + } /> + } /> + } /> + + + ); } diff --git a/src/Atom/order.jsx b/src/Atom/order.jsx new file mode 100644 index 0000000..5c614c7 --- /dev/null +++ b/src/Atom/order.jsx @@ -0,0 +1,20 @@ +import { atom } from "recoil"; + +export const ordercnt = atom({ + key: "ordercnt", + default: { + pending: 0, + progress: 0, + complete: 0, + }, +}); + +export const selectStatus = atom({ + key: "selectStatus", + default: "null", +}); + +export const selectOrder = atom({ + key: "selectOrder", + default: null, +}); diff --git a/src/Atom/status.jsx b/src/Atom/status.jsx new file mode 100644 index 0000000..3af86b4 --- /dev/null +++ b/src/Atom/status.jsx @@ -0,0 +1,67 @@ +import axios from "axios"; +import { atom, selector } from "recoil"; + +export const storeState = atom({ + key: "storeState", // 전역적으로 고유한 값 + default: false, // 초깃값 +}); + +export const soundState = atom({ + key: "soundState", + default: true, +}); + +export const isAuthenticatedState = atom({ + key: "isAuthenticatedState", + default: false, +}); + +export const getAuthenticatedSelector = selector({ + key: "auth/get", + get: async ({ get }) => { + return get(isAuthenticatedState); + }, + + set: ({ set }) => { + set(isAuthenticatedState, (currentValue) => !currentValue); + }, +}); + +export const loginState = atom({ + key: "loginState", + default: { + accessToken: null, + expiredTime: null, + }, +}); + +export const userState = atom({ + key: "userState", + dafault: null, +}); + +export const getUserSelector = selector({ + key: "user/get", + get: async ({ get, set }) => { + try { + const apiUrl = process.env.REACT_APP_API_ROOT; + const config = { + withCredentials: true, + }; + const response = await axios.get(`${apiUrl}/api/v1/auth`, config); + const userData = response.data; + // if (JSON.stringify(userState) !== JSON.stringify(userData)) { + // // 다르면 userInfo 업데이트 + // // set(userState, userData); + // } + return userData; + } catch (err) { + // 에러처리 + return "404"; + } + }, + + set: ({ set }, newValue) => { + set(userState, newValue); + }, +}); diff --git a/src/assets/Designer.png b/src/assets/Designer.png deleted file mode 100644 index 434b26e..0000000 Binary files a/src/assets/Designer.png and /dev/null differ diff --git a/src/assets/Very.mp3 b/src/assets/Very.mp3 new file mode 100644 index 0000000..986edb3 Binary files /dev/null and b/src/assets/Very.mp3 differ diff --git a/src/assets/font/Pretendard-Black.woff2 b/src/assets/font/Pretendard-Black.woff2 new file mode 100644 index 0000000..eafe683 Binary files /dev/null and b/src/assets/font/Pretendard-Black.woff2 differ diff --git a/src/assets/font/Pretendard-Bold.woff2 b/src/assets/font/Pretendard-Bold.woff2 new file mode 100644 index 0000000..4d40a1a Binary files /dev/null and b/src/assets/font/Pretendard-Bold.woff2 differ diff --git a/src/assets/font/Pretendard-ExtraBold.woff2 b/src/assets/font/Pretendard-ExtraBold.woff2 new file mode 100644 index 0000000..dcd57e7 Binary files /dev/null and b/src/assets/font/Pretendard-ExtraBold.woff2 differ diff --git a/src/assets/font/Pretendard-ExtraLight.woff2 b/src/assets/font/Pretendard-ExtraLight.woff2 new file mode 100644 index 0000000..e510402 Binary files /dev/null and b/src/assets/font/Pretendard-ExtraLight.woff2 differ diff --git a/src/assets/font/Pretendard-Light.woff2 b/src/assets/font/Pretendard-Light.woff2 new file mode 100644 index 0000000..7f82fe8 Binary files /dev/null and b/src/assets/font/Pretendard-Light.woff2 differ diff --git a/src/assets/font/Pretendard-Medium.woff2 b/src/assets/font/Pretendard-Medium.woff2 new file mode 100644 index 0000000..f8c743d Binary files /dev/null and b/src/assets/font/Pretendard-Medium.woff2 differ diff --git a/src/assets/font/Pretendard-Regular.woff2 b/src/assets/font/Pretendard-Regular.woff2 new file mode 100644 index 0000000..a9f6231 Binary files /dev/null and b/src/assets/font/Pretendard-Regular.woff2 differ diff --git a/src/assets/font/Pretendard-SemiBold.woff2 b/src/assets/font/Pretendard-SemiBold.woff2 new file mode 100644 index 0000000..4c6a32d Binary files /dev/null and b/src/assets/font/Pretendard-SemiBold.woff2 differ diff --git a/src/assets/font/Pretendard-Thin.woff2 b/src/assets/font/Pretendard-Thin.woff2 new file mode 100644 index 0000000..6c9bc96 Binary files /dev/null and b/src/assets/font/Pretendard-Thin.woff2 differ diff --git a/src/assets/icons/Big_LOGO.svg b/src/assets/icons/Big_LOGO.svg new file mode 100644 index 0000000..eb2dae2 --- /dev/null +++ b/src/assets/icons/Big_LOGO.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/Header/CloseLight.svg b/src/assets/icons/Header/CloseLight.svg new file mode 100644 index 0000000..b5df6a3 --- /dev/null +++ b/src/assets/icons/Header/CloseLight.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/Header/LOGO.svg b/src/assets/icons/Header/LOGO.svg new file mode 100644 index 0000000..eb2dae2 --- /dev/null +++ b/src/assets/icons/Header/LOGO.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/Header/OpenLight.svg b/src/assets/icons/Header/OpenLight.svg new file mode 100644 index 0000000..cd50b25 --- /dev/null +++ b/src/assets/icons/Header/OpenLight.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/Header/SoundOff.svg b/src/assets/icons/Header/SoundOff.svg new file mode 100644 index 0000000..afe836d --- /dev/null +++ b/src/assets/icons/Header/SoundOff.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/Header/SoundOn.svg b/src/assets/icons/Header/SoundOn.svg new file mode 100644 index 0000000..0783bb6 --- /dev/null +++ b/src/assets/icons/Header/SoundOn.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/Navbar/Close.svg b/src/assets/icons/Navbar/Close.svg new file mode 100644 index 0000000..4e5d6e6 --- /dev/null +++ b/src/assets/icons/Navbar/Close.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/icons/Navbar/Home.svg b/src/assets/icons/Navbar/Home.svg new file mode 100644 index 0000000..476ab40 --- /dev/null +++ b/src/assets/icons/Navbar/Home.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/Navbar/Inven.svg b/src/assets/icons/Navbar/Inven.svg new file mode 100644 index 0000000..c92e30d --- /dev/null +++ b/src/assets/icons/Navbar/Inven.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/Navbar/Mypage.svg b/src/assets/icons/Navbar/Mypage.svg new file mode 100644 index 0000000..fd20fc2 --- /dev/null +++ b/src/assets/icons/Navbar/Mypage.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/Navbar/Open.svg b/src/assets/icons/Navbar/Open.svg new file mode 100644 index 0000000..a72a459 --- /dev/null +++ b/src/assets/icons/Navbar/Open.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/icons/Navbar/Sales.svg b/src/assets/icons/Navbar/Sales.svg new file mode 100644 index 0000000..1ed1cc1 --- /dev/null +++ b/src/assets/icons/Navbar/Sales.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/Navbar/Store.svg b/src/assets/icons/Navbar/Store.svg new file mode 100644 index 0000000..e182675 --- /dev/null +++ b/src/assets/icons/Navbar/Store.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/X.svg b/src/assets/icons/X.svg new file mode 100644 index 0000000..2369bab --- /dev/null +++ b/src/assets/icons/X.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/cherry.svg b/src/assets/icons/cherry.svg new file mode 100644 index 0000000..3981ec8 --- /dev/null +++ b/src/assets/icons/cherry.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/icons/icon_check.svg b/src/assets/icons/icon_check.svg new file mode 100644 index 0000000..7b6ec19 --- /dev/null +++ b/src/assets/icons/icon_check.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/icon_closeModal.svg b/src/assets/icons/icon_closeModal.svg new file mode 100644 index 0000000..2369bab --- /dev/null +++ b/src/assets/icons/icon_closeModal.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/icon_downArrow.svg b/src/assets/icons/icon_downArrow.svg new file mode 100644 index 0000000..91ed8f1 --- /dev/null +++ b/src/assets/icons/icon_downArrow.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/icon_downArrow_black.svg b/src/assets/icons/icon_downArrow_black.svg new file mode 100644 index 0000000..59b42ee --- /dev/null +++ b/src/assets/icons/icon_downArrow_black.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/icon_kakao.svg b/src/assets/icons/icon_kakao.svg new file mode 100644 index 0000000..e9632f0 --- /dev/null +++ b/src/assets/icons/icon_kakao.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/icon_upArrow.svg b/src/assets/icons/icon_upArrow.svg new file mode 100644 index 0000000..07f2a16 --- /dev/null +++ b/src/assets/icons/icon_upArrow.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/img_kakao.png b/src/assets/icons/img_kakao.png new file mode 100644 index 0000000..9bfced5 Binary files /dev/null and b/src/assets/icons/img_kakao.png differ diff --git a/src/assets/icons/img_readyVery.svg b/src/assets/icons/img_readyVery.svg new file mode 100644 index 0000000..012f64d --- /dev/null +++ b/src/assets/icons/img_readyVery.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/icons/loading.svg b/src/assets/icons/loading.svg new file mode 100644 index 0000000..82df780 --- /dev/null +++ b/src/assets/icons/loading.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/icons/small_cherry.svg b/src/assets/icons/small_cherry.svg new file mode 100644 index 0000000..0ad363c --- /dev/null +++ b/src/assets/icons/small_cherry.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/components/views/Audio/AudioPlayer.jsx b/src/components/views/Audio/AudioPlayer.jsx new file mode 100644 index 0000000..33f8bae --- /dev/null +++ b/src/components/views/Audio/AudioPlayer.jsx @@ -0,0 +1,11 @@ +import VeryMp3 from "../../../assets/Very.mp3"; + +const AudioPlayer = () => { + const audio = new Audio(VeryMp3); + audio.play().catch((error) => { + // Autoplay was prevented, handle it here + console.error("Autoplay prevented:", error); + }); +}; + +export default AudioPlayer; diff --git a/src/components/views/Button/pendingButton.jsx b/src/components/views/Button/pendingButton.jsx new file mode 100644 index 0000000..6a7ea80 --- /dev/null +++ b/src/components/views/Button/pendingButton.jsx @@ -0,0 +1,53 @@ +import React from "react"; +import { Button, Col, Row } from "react-bootstrap"; + +const pendingButton = ({ handleRefuseModal, handleReceiveModal }) => { + return ( + + +
+ +
+ + +
+ +
+ +
+ ); +}; + +export default pendingButton; diff --git a/src/components/views/Chart/Chart.jsx b/src/components/views/Chart/Chart.jsx new file mode 100644 index 0000000..48c3bf2 --- /dev/null +++ b/src/components/views/Chart/Chart.jsx @@ -0,0 +1,32 @@ +import { ResponsiveBar } from '@nivo/bar' + +export default function Chart ({ data }) { + return( + + ) +} \ No newline at end of file diff --git a/src/components/views/Footer/Footer.jsx b/src/components/views/Footer/Footer.jsx new file mode 100644 index 0000000..eeb9e37 --- /dev/null +++ b/src/components/views/Footer/Footer.jsx @@ -0,0 +1,7 @@ +import React from "react"; + +const Footer = () => { + return
This is Footer
; +}; + +export default Footer; diff --git a/src/components/views/Header/Header.css b/src/components/views/Header/Header.css new file mode 100644 index 0000000..204594d --- /dev/null +++ b/src/components/views/Header/Header.css @@ -0,0 +1,67 @@ +.header { + /* width: 100%; */ + min-width: 64rem; + /* min-width: 64rem; */ + height: 5.5rem; + background-color: #2e2d2d; +} + +.header2 { + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + min-width: 73.75rem; + /* min-width: 64rem; */ + height: 5.5rem; + background-color: #2e2d2d; + z-index: 101; +} + +.header2-wrapper { + display: flex; + justify-content: space-between; +} + +.head-container2 { + width: 23.6rem; + display: flex; + justify-content: space-evenly; +} + +.header-img-wrapper { + display: flex; +} + +.LOGO { + width: 19.1875rem; + height: 4rem; + margin-left: 2.5rem; + margin-top: 1.25rem; + float: left; +} + +.store-group { + display: flex; + flex-direction: row; + object-fit: contain; + align-items: center; +} + +.store-img__wrapper { + margin: 0 0.5625rem; +} + +.header-font { + color: #fff; + font-size: 1.875rem; + font-family: "SemiBold"; +} + +.head-container { + display: flex; + align-content: stretch; + flex-wrap: wrap; + justify-content: space-evenly; +} diff --git a/src/components/views/Header/Header.jsx b/src/components/views/Header/Header.jsx new file mode 100644 index 0000000..92e614a --- /dev/null +++ b/src/components/views/Header/Header.jsx @@ -0,0 +1,60 @@ +import React from "react"; +import { Col, Row } from "react-bootstrap"; +import { useRecoilState, useRecoilValue } from "recoil"; +import { soundState, storeState } from "../../../Atom/status"; +import StoreOff from "../../../assets/icons/Header/CloseLight.svg"; //영업종료 +import LOGO from "../../../assets/icons/Header/LOGO.svg"; //로고 +import StoreOn from "../../../assets/icons/Header/OpenLight.svg"; //영업중 +import SoundOff from "../../../assets/icons/Header/SoundOff.svg"; //소리끔 +import SoundOn from "../../../assets/icons/Header/SoundOn.svg"; //소리켬 +import "./Header.css"; + +const Header = () => { + const Store = useRecoilValue(storeState); + const [Sound, setSound] = useRecoilState(soundState); + + const ClickTrue = () => { + setSound(true); + console.log(Sound); + }; + + const ClickFalse = () => { + setSound(false); + console.log(Sound); + }; + + return ( +
+ + + LOGO + + + + {!Store ? ( +
+
+ Open +
+
영업중
+
+ ) : ( +
+
+ Close +
+
영업종료
+
+ )} + {Sound ? ( + SoundOn + ) : ( + SoundOff + )} + +
+
+ ); +}; + +export default Header; diff --git a/src/components/views/Header/Header2.jsx b/src/components/views/Header/Header2.jsx new file mode 100644 index 0000000..6ab9cea --- /dev/null +++ b/src/components/views/Header/Header2.jsx @@ -0,0 +1,52 @@ +import React, { useState } from "react"; +import { useRecoilValue } from "recoil"; +import { storeState } from "../../../Atom/status"; +import StoreOff from "../../../assets/icons/Header/CloseLight.svg"; //영업종료 +import LOGO from "../../../assets/icons/Header/LOGO.svg"; //로고 +import StoreOn from "../../../assets/icons/Header/OpenLight.svg"; //영업중 +import SoundOff from "../../../assets/icons/Header/SoundOff.svg"; //소리끔 +import SoundOn from "../../../assets/icons/Header/SoundOn.svg"; //소리켬 +import "./Header.css"; + +const Header = () => { + const Store = useRecoilValue(storeState); + const [Sound, setSound] = useState(1); + + const onClickHandler = (e) => { + setSound(!Sound); + }; + + return ( +
+
+
+ LOGO +
+
+ {!Store ? ( +
+
Open
+
영업중
+
+ ) : ( +
+
Close
+
영업종료
+
+ )} + {Sound ? ( +
+ SoundOn +
+ ) : ( +
+ SoundOff +
+ )} +
+
+
+ ); +}; + +export default Header; diff --git a/src/components/views/Inven/InvenBox.jsx b/src/components/views/Inven/InvenBox.jsx new file mode 100644 index 0000000..0bf9249 --- /dev/null +++ b/src/components/views/Inven/InvenBox.jsx @@ -0,0 +1,19 @@ +const InvenBox = ({handleModal, invenProps: {category, name, soldOut}}) => { + return( + <> +
+ + {!soldOut ? ( +
+ ) : ( +
+ )} +
+ {category} + {name} +
+ + ); +} + +export default InvenBox; \ No newline at end of file diff --git a/src/components/views/NavBar/NavBar.css b/src/components/views/NavBar/NavBar.css new file mode 100644 index 0000000..093bec1 --- /dev/null +++ b/src/components/views/NavBar/NavBar.css @@ -0,0 +1,50 @@ +.navbar { + width: 8.875rem; + /* height: 46.25rem; */ + height: 45.75rem; + /* height: 42.5rem; */ + background-color: #2e2d2d; + + display: flex; + justify-content: space-around; +} + +.navbarMenu { + height: 25rem; + + display: flex; + justify-content: space-around; + align-items: center; /* 수직 가운데 정렬 */ + flex-direction: column; +} + +.icon-group { + display: flex; + flex-direction: column; + object-fit: contain; + align-items: center; +} + +.icon { + width: 2.875rem; + height: 2.875rem; + object-fit: contain; +} + +.menu-font { + color: #fff; + font-family: Pretendard; + font-size: 1.25rem; + font-style: normal; + font-weight: 700; + line-height: 130%; /* 1.625rem */ + letter-spacing: -0.0125rem; +} + +.icon-off { + display: flex; + flex-direction: column; + object-fit: contain; + align-items: center; + opacity: 0.5; +} diff --git a/src/components/views/NavBar/NavBar.jsx b/src/components/views/NavBar/NavBar.jsx index f65f86a..98acf0a 100644 --- a/src/components/views/NavBar/NavBar.jsx +++ b/src/components/views/NavBar/NavBar.jsx @@ -1,7 +1,120 @@ +import "bootstrap/dist/css/bootstrap.min.css"; import React from "react"; +import { Link } from "react-router-dom"; +import { useRecoilCallback, useRecoilState } from "recoil"; +import { storeState } from "../../../Atom/status"; +import Home from "../../../assets/icons/Navbar/Home.svg"; //홈 +import Inven from "../../../assets/icons/Navbar/Inven.svg"; //재고관리 +import Mypage from "../../../assets/icons/Navbar/Mypage.svg"; //마이페이지 +import Sales from "../../../assets/icons/Navbar/Sales.svg"; //매출관리 +import StoreOn from "../../../assets/icons/Navbar/Store.svg"; //영업중 +import "../NavBar/NavBar.css"; -function NavBar() { - return
NavBar
; -} +const NavBar = () => { + const currentPath = window.location.pathname; // 현재 경로 가져오기 + // const apiUrl = process.env.REACT_APP_API_ROOT; + const [Store] = useRecoilState(storeState); // 영업여부 + const setStoreState = useRecoilCallback(({ set }) => async () => { + console.log(Store, storeState); + set(storeState, !Store); + }); + const onClickHandler = (e) => { + setStoreState(); + // axios + // .post(`${apiUrl}+/api/v1/store/sales`) + // .then((Store) => { + // console.log(Store); + // }) + // .catch((error) => { + // console.error(error); + // }); + }; + + return ( +
+
+ + {currentPath === "/home" ? ( +
+ HomeOn + +
+ ) : ( +
+ HomeOff + +
+ )} + + + + {currentPath === "/Inventory" ? ( +
+ InvenOn + 재고관리 +
+ ) : ( +
+ InvenOff + 재고관리 +
+ )} + + + + {currentPath === "/Sales" ? ( +
+ SalesOn + 매출관리 +
+ ) : ( +
+ SalesOff + 매출관리 +
+ )} + + + + {currentPath === "/Mypage" ? ( +
+ MypageOn + 마이페이지 +
+ ) : ( +
+ MypageOff + 마이페이지 +
+ )} + +
+ + + {Store ? ( +
+ Open + 영업중 +
+ ) : ( +
+ Close + 영업종료 +
+ )} + +
+ ); +}; export default NavBar; diff --git a/src/components/views/Order/OrderBox.jsx b/src/components/views/Order/OrderBox.jsx new file mode 100644 index 0000000..96bc53b --- /dev/null +++ b/src/components/views/Order/OrderBox.jsx @@ -0,0 +1,29 @@ +import React from "react"; + +const OrderBox = ({ onSelect, order, selectedOrderId }) => { + const { id, orderNum, time, pickUp, price } = order; + const isSelected = id === selectedOrderId; + + const onClickHandler = () => { + onSelect(isSelected ? null : order); + }; + return ( + <> +
+ {orderNum} + {time} + {pickUp} + {price}원 + +
+ + ); +}; + +export default OrderBox; diff --git a/src/hoc/auth.jsx b/src/hoc/auth.jsx index 88327a9..b72c227 100644 --- a/src/hoc/auth.jsx +++ b/src/hoc/auth.jsx @@ -1,47 +1,59 @@ -// /* eslint-disable import/no-anonymous-default-export */ -// import React, { useEffect } from "react"; -// import Axios from "axios"; -// import { useDispatch } from "react-redux"; -// import { auth } from "../_actions/user_action"; -// import { useNavigate } from "react-router-dom"; +/*import { useCookies } from "react-cookie"; +import { useLocation, useNavigate } from "react-router-dom"; +import { useRecoilValue, useSetRecoilState } from "recoil"; +import { getUserSelector, loginState } from "../Atom/status";*/ -// export default function (SpecificComponent, option, adminRoute = null) { -// function AuthenticationCheck(props) { -// const navigate = useNavigate(); -// const dispatch = useDispatch(); -// useEffect(() => { -// dispatch(auth()) -// .then((response) => { -// console.log(response.payload); -// if (!response.payload.isAuth) { -// if (option) { -// navigate("/login", { replace: true }); -// } -// } else { -// //로그인한 상태 -// if (adminRoute === 3 && response.payload.role !== 3) { -// navigate("/", { replace: true }); -// } else if (adminRoute === 1 && response.payload.role !== 1) { -// navigate("/", { replace: true }); -// } else { -// if (option === false) { -// navigate("/", { replace: true }); -// } -// } -// } -// }) -// .catch((error) => { -// if (error.response && error.response.status >= 400 && error.response.status < 500) { -// // 클라이언트 오류 발생 (400번대 오류) -// // 로그인 페이지로 되돌아가는 조건문 추가 -// navigate("/login"); -// } else { -// // 서버 오류 또는 네트워크 오류 등의 다른 오류 처리 -// } -// }); -// }, []); +function Auth(SpecificComponent, option) { + function AuthenticationCheck(props) { + /*const navigate = useNavigate(); + const location = useLocation(); + const userInfo = useRecoilValue(getUserSelector); + const setIsLoggedIn = useSetRecoilState(loginState); + const [cookies] = useCookies(["accessToken"]); -// return ; -// } -// return AuthenticationCheck; -// } + + useEffect(() => { + const isAuth = window.localStorage.getItem("isAuthenticated"); + if (userInfo === "404" && location.pathname !== "/") { + navigate("/"); + } else { + if (!isAuth && cookies?.accessToken) { + // 첫 로그인 시 + window.localStorage.setItem("isAuthenticated", true); + setIsLoggedIn({ + accessToken: getAccessTokenFromCookie(), + expiredTime: moment().add(1, "hour").format("yyyy-MM-DD HH:mm:ss"), + }); + navigate("/home"); + alert("로그인에 성공하셨습니다."); + } else { + if (cookies?.accessToken && location.pathname === "/") { + // 로그인 상태에서 로그인 화면으로 갔을 경우 + navigate("/home"); + } + } + } + + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []);*/ + return ; + } + return AuthenticationCheck; +} + +export const getAccessTokenFromCookie = () => { + const cookieString = document.cookie; + if (cookieString) { + const cookies = cookieString.split("; "); + + for (const cookie of cookies) { + const [name, value] = cookie.split("="); + if (name === "accessToken") { + return value; + } + } + } + return null; +}; + +export default Auth; diff --git a/src/hoc/handleRefresh.jsx b/src/hoc/handleRefresh.jsx new file mode 100644 index 0000000..7dd26ea --- /dev/null +++ b/src/hoc/handleRefresh.jsx @@ -0,0 +1,39 @@ +import axios from "axios"; +import moment from "moment"; +import { useRecoilState } from 'recoil'; +import { loginState } from '../Atom/status'; + + +const Refresh = async () => { + const apiUrl = process.env.REACT_APP_API_ROOT; + const [loginInfo, setLoginInfo] = useRecoilState(loginState); + const expireAt = loginInfo.expiredTime; + console.log("만료확인"); + + // 토큰이 만료되었다면 + + if (moment(expireAt).diff(moment()) < 0) { + const config = { + withCredentials: true + } + + console.log("토큰을 재발급합니다!"); + + //재발급 요청 + const res = await axios.get( + `${apiUrl}/api/v1/refresh/token`, + config + ); + console.log("재발급 성공", res); + setLoginInfo({ + expiredTime: moment().add(1, "hour").format("yyyy-MM-DD HH:mm:ss") + }); + } +}; + +const refreshErrorHandle = () => { + //Cookie.remove("refreshToken"); +}; + +export { Refresh, refreshErrorHandle }; + diff --git a/src/hooks/useInterval.jsx b/src/hooks/useInterval.jsx new file mode 100644 index 0000000..ba0e134 --- /dev/null +++ b/src/hooks/useInterval.jsx @@ -0,0 +1,22 @@ +import { useEffect, useRef } from 'react'; + +function useInterval(callback, delay) { + const savedCallback = useRef(); + + useEffect(() => { + savedCallback.current = callback; + }, [callback]); + + useEffect(() => { + function tick() { + savedCallback.current(); + } + + if (delay !== null) { + const intervalId = setInterval(tick, delay); + return () => clearInterval(intervalId); + } + }, [delay]); +} + +export default useInterval; \ No newline at end of file diff --git a/src/hooks/useOutSideClick.jsx b/src/hooks/useOutSideClick.jsx deleted file mode 100644 index cebd397..0000000 --- a/src/hooks/useOutSideClick.jsx +++ /dev/null @@ -1,17 +0,0 @@ -// import { useEffect } from "react"; - -// function useOutSideClick(ref, callback) { -// useEffect(() => { -// const handleClick = (event) => { -// if (ref.current && !ref.current.contains(event.target)) { -// callback?.(); -// } -// }; - -// window.addEventListener("mousedown", handleClick); - -// return () => window.removeEventListener("mousedown", handleClick); -// }, [ref, callback]); -// } - -// export default useOutSideClick; diff --git a/src/index.css b/src/index.css index ec2585e..2f1fbcb 100644 --- a/src/index.css +++ b/src/index.css @@ -5,6 +5,11 @@ body { sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; + + -webkit-user-select:none; + -moz-user-select:none; + -ms-user-select:none; + user-select:none; } code { diff --git a/src/index.js b/src/index.js index e704e07..82429ba 100644 --- a/src/index.js +++ b/src/index.js @@ -1,19 +1,21 @@ import React from "react"; +import { CookiesProvider } from 'react-cookie'; import ReactDOM from "react-dom/client"; -import "./index.css"; -import App from "./App"; import { BrowserRouter } from "react-router-dom"; -import { ThemeProvider } from 'styled-components'; -import theme from './style/theme/theme'; +import { ThemeProvider } from "styled-components"; +import App from "./App"; +import "./index.css"; +import theme from "./style/theme/theme"; const root = ReactDOM.createRoot(document.getElementById("root")); root.render( - - - - + + + + + ); diff --git a/src/pages/Home/Home.jsx b/src/pages/Home/Home.jsx new file mode 100644 index 0000000..280746e --- /dev/null +++ b/src/pages/Home/Home.jsx @@ -0,0 +1,34 @@ +import React from "react"; +import { Col, Row } from "react-bootstrap"; +import Header from "../../components/views/Header/Header"; +import NavBar from "../../components/views/NavBar/NavBar"; +import MainHome from "./MainHome"; +import Receipt from "./Receipt/Receipt"; + +function Home () { + + return ( +
+
+ + + + + + + + + + + +
+ ); +}; + +export default Home; diff --git a/src/pages/Home/MainHome.css b/src/pages/Home/MainHome.css new file mode 100644 index 0000000..7e8feda --- /dev/null +++ b/src/pages/Home/MainHome.css @@ -0,0 +1,10 @@ +.Main-Box { + width: 100%; /* 너비 설정 */ + height: 95%; /* 높이 설정 */ + padding: 5% 0% 0% 0%; +} + +.status-header { + padding-left: 1%; + border-bottom: 8px solid #d82356; +} diff --git a/src/pages/Home/MainHome.jsx b/src/pages/Home/MainHome.jsx new file mode 100644 index 0000000..270f932 --- /dev/null +++ b/src/pages/Home/MainHome.jsx @@ -0,0 +1,108 @@ +import React, { useState } from "react"; +import { Button, Col, Container, Row } from "react-bootstrap"; +import { useRecoilValue } from "recoil"; +import { ordercnt } from "../../Atom/order"; +import "./MainHome.css"; +import Complete from "./StatusHome/Complete"; +import Progress from "./StatusHome/Progress"; +import Wait from "./StatusHome/Wait"; + +const MainHome = () => { + const { pending, progress, complete } = useRecoilValue(ordercnt); + + const [status, setStatus] = useState({ + Wait: true, + Progress: false, + Complete: false, + }); + + const onClickHandler = (e) => { + const { name } = e.target; + // 현재 선택된 상태 + const currentStatus = status[name]; + if (!currentStatus) { + setStatus((prevStatus) => { + const updatedStatus = { ...prevStatus }; + updatedStatus[name] = true; // 선택된 status를 true로 설정 + + // 나머지 값들을 모두 false로 설정 + for (const key in updatedStatus) { + if (key !== name) { + updatedStatus[key] = false; + } + } + return updatedStatus; + }); + } + }; + + return ( + + + + + + + + + + + + + + {status.Wait ? ( + + ) : status.Progress ? ( + + ) : status.Complete ? ( + + ) : ( +
ERROR
+ )} +
+ ); +}; + +export default MainHome; diff --git a/src/pages/Home/Receipt/Receipt.css b/src/pages/Home/Receipt/Receipt.css new file mode 100644 index 0000000..fda5f4e --- /dev/null +++ b/src/pages/Home/Receipt/Receipt.css @@ -0,0 +1,207 @@ +.rounded-rectangle { + width: 23.75rem; + height: 43rem; + background-color: #f5f5f5; /* 배경색 설정 */ + border-radius: 1.875rem; /* 모서리를 둥글게 만드는 값 */ + text-align: center; /* 가운데 정렬 */ + color: #000; /* 텍스트 색상 설정 */ + font-size: 18px; /* 폰트 크기 설정 */ + line-height: 100px; /* 수직 가운데 정렬을 위한 높이 설정 */ + box-shadow: 5px 5px 10px rgba(0, 0, 0, 0.5); +} + +.Box { + width: 100%; /* 너비 설정 */ + height: 100%; /* 높이 설정 */ + padding-top: 5%; + padding-left: 0; +} + +.nullReceipt { + display: flex; + flex-direction: column; + flex-wrap: wrap; + + padding-top: 60%; +} + +.receiptHeader { + padding-top: 10%; + padding-left: 10%; + display: flex; +} + +.receipt-header { + color: #000; + text-shadow: 0px 4px 4px rgba(0, 0, 0, 0.25); + font-family: "Bold"; + font-size: 1.75rem; + font-weight: 800; + line-height: 130%; /* 2.275rem */ + letter-spacing: -0.0175rem; +} + +.receipt-btn__wrapper { + padding: 10% 10% 5% 7%; + + display: flex; + justify-content: space-between; +} + +.receiptButton { + display: flex; + height: 5.5rem; +} + +.receiptTextBox { + display: flex; + justify-content: space-between; + + padding: 3% 7% 1% 7%; +} +.receipt-FoodName { + padding-left: 10%; + display: flex; + flex-direction: column; + align-items: flex-start; + + color: #4f4f4f; + font-family: "Light"; + font-size: 1.25rem; + font-weight: 600; + line-height: 130%; /* 1.625rem */ + letter-spacing: -0.0125rem; +} +.receiptOption { + padding-left: 20%; + display: flex; + flex-direction: column; + align-items: flex-start; +} + +.receipt-text { + color: #4f4f4f; + font-family: "Light"; + font-size: 1.25rem; + font-weight: 600; + line-height: 130%; /* 1.625rem */ + letter-spacing: -0.0125rem; +} + +.receipt-divider { + width: 19.4375rem; + height: 0rem; + + border-top: 1px solid #838383; /* 색상과 굵기를 조절할 수 있습니다. */ + margin: 20px 0; /* 위아래 여백을 조절할 수 있습니다. */ + + transform: translate(10%, -50%); +} + +.receipt-btn { + width: 8.75rem; + height: 2.8125rem; + border: 2px solid; + border-radius: 1.5625rem; + background-color: #d82356; + font-family: "SemiBold"; + font-size: 1.375rem; + color: #ffffff; + + display: flex; + justify-content: center; + align-items: center; +} + +/* 모달 */ +.modal-wrapper { + position: absolute; + top: calc(59% - 21.5rem); + left: calc(100% - 23rem); + + width: 23.75rem; + height: 43rem; + background-color: rgba(0, 0, 0, 0.5); + border-radius: 1.875rem; + + display: flex; +} + +.modal-box { + position: absolute; + top: calc(100% - 30.8rem); + left: calc(100% - 23.75rem); + + width: 23.75rem; + height: 30.8rem; + background-color: #fff; + border-radius: 1.875rem; + z-index: 101; + padding: 2.0625rem 3.25rem; +} + +.modal-close__wrapper { + display: flex; + justify-content: flex-end; +} + +.modal-box-txt__wrapper { + display: flex; + flex-direction: column; + justify-content: center; + height: 30%; +} + +.modal-box-txt { + color: #4f4f4f; + font-family: "Regular"; + font-size: 1.25rem; + font-weight: 700; + line-height: 130%; /* 1.625rem */ + letter-spacing: -0.0125rem; +} + +.modal-box-choose-btn__wrapper { + display: flex; + flex-direction: column; + justify-content: space-between; + height: 12.9375rem; +} + +.modal-box-choose-btn { + display: flex; + justify-content: center; + flex-direction: column; + + width: 16.8125rem; + height: 3.125rem; + margin: 0 auto; + border-radius: 0.625rem; + border: 2px solid #dadada; + + color: #838383; + text-align: center; + font-family: "Light"; + font-size: 1.375rem; + font-weight: 600; + line-height: 100%; /* 1.375rem */ +} + +.modal-box-chooseTime-btn { + display: flex; + justify-content: center; + flex-direction: column; + + width: 7.625rem; + height: 3.125rem; + margin: 0 auto; + border-radius: 0.625rem; + border: 2px solid #dadada; + + color: #838383; + text-align: center; + font-family: "Light"; + font-size: 1.375rem; + font-weight: 600; + line-height: 100%; /* 1.375rem */ +} diff --git a/src/pages/Home/Receipt/Receipt.jsx b/src/pages/Home/Receipt/Receipt.jsx new file mode 100644 index 0000000..257278b --- /dev/null +++ b/src/pages/Home/Receipt/Receipt.jsx @@ -0,0 +1,76 @@ +import React from "react"; +import { useRecoilState } from "recoil"; +import { selectOrder, selectStatus } from "../../../Atom/order"; +import loading from "../../../assets/icons/loading.svg"; +import "./Receipt.css"; + +import CompleteReceipt from "./StatusReceipt/CompleteReceipt"; +import PendingReceipt from "./StatusReceipt/PendingReceipt"; +import ProgressReceipt from "./StatusReceipt/ProgressReceipt"; + +const Receipt = () => { + const Status = useRecoilState(selectStatus); + const Order = useRecoilState(selectOrder); + + const orderInfo = { + orders: [ + { + id: 123, //db 인덱스 + orderNum: 2, // 그날의 그가게의 주문번호 + pickUp: "픽업", + foodies: [ + { + name: "아메리카노", + count: 3, + options: ["샷 추가", "휘핑", "ICE", "그란데"], + }, + ], + phone: "010-6439-3547", // 고객의 전화번호 + time: "21/11/08 11:44:30", // 주문시간 + payment: "현대카드", + price: 8500, + }, + ], + }; + + return ( +
+
+ {Status === "pending" ? ( + + ) : Status === "progress" ? ( + + ) : //
progress
+ Status === "complete" ? ( + + ) : ( + //
complete
+
+ loading + 주문을 선택해주세요 +
+ )} +
+
+ ); +}; + +export default Receipt; diff --git a/src/pages/Home/Receipt/StatusReceipt/CompleteReceipt.jsx b/src/pages/Home/Receipt/StatusReceipt/CompleteReceipt.jsx new file mode 100644 index 0000000..04fe983 --- /dev/null +++ b/src/pages/Home/Receipt/StatusReceipt/CompleteReceipt.jsx @@ -0,0 +1,48 @@ +import React from "react"; + +const CompleteReceipt = ({ + orderProps: { orderNum, time, phone, foodies, payment, price }, +}) => { + return ( +
+
+ 주문번호 {orderNum} + + +
+
+ 주문시간 + {time} +
+
+ 고객연락처 + {phone} +
+
+
+ 주문내역 +
+
+ {foodies[0].name} + {foodies[0].count} +
+
+ {foodies[0].options.map((option) => ( + └ {option} + ))} +
+
+
+ 결제수단 + {payment} +
+
+ 결제금액 + {/* 100원 단위 ,처리 여유로우면 하기 */} + {price}원 +
+
+ ); +}; + +export default CompleteReceipt; diff --git a/src/pages/Home/Receipt/StatusReceipt/PendingReceipt.jsx b/src/pages/Home/Receipt/StatusReceipt/PendingReceipt.jsx new file mode 100644 index 0000000..53a9338 --- /dev/null +++ b/src/pages/Home/Receipt/StatusReceipt/PendingReceipt.jsx @@ -0,0 +1,163 @@ +import React, { useState } from "react"; +import { Button, Col, Row } from "react-bootstrap"; +import X from "../../../../assets/icons/X.svg"; + +const PendingReceipt = ({ orderProps }) => { + const { orderNum, time, phone, foodies, payment, price } = orderProps; + + const [ReceiveModal, setReceiveModal] = useState(false); + const [RefuseModal, setRefuseModal] = useState(false); + + const handleReceiveModal = () => { + console.log(ReceiveModal); + setReceiveModal((prev) => !prev); + }; + + const handleRefuseModal = () => { + setRefuseModal((prev) => !prev); + }; + + return ( +
+
+ 주문번호 {orderNum} +
+ + +
+ +
+ + +
+ +
+ +
+
+ 주문시간 + {time} +
+
+ 고객연락처 + {phone} +
+
+
+ 주문내역 +
+
+ {foodies[0].name} + {foodies[0].count} +
+
+ {foodies[0].options.map((option) => ( + └ {option} + ))} +
+
+
+ 결제수단 + {payment} +
+
+ 결제금액 + {/* 100원 단위 ,처리 여유로우면 하기 */} + {price}원 +
+ + {/* 주문거부모달창 */} + {RefuseModal && ( +
+
+
+ close +
+
+
접수 거부 사유를 선택해주세요
+
+
+
재료소진
+
가게사정
+
기타
+
+
+
+ )} + + {/* 주문수락모달창 */} + {ReceiveModal && ( +
+
+
+ close +
+
+
제조 시간을 선택해주세요
+
+
+ + +
5분
+ + +
10분
+ +
+ + +
15분
+ + +
20분
+ +
+ + +
25분
+ + +
30분
+ +
+
+
+
+ )} +
+ ); +}; + +export default PendingReceipt; diff --git a/src/pages/Home/Receipt/StatusReceipt/ProgressReceipt.jsx b/src/pages/Home/Receipt/StatusReceipt/ProgressReceipt.jsx new file mode 100644 index 0000000..51c2422 --- /dev/null +++ b/src/pages/Home/Receipt/StatusReceipt/ProgressReceipt.jsx @@ -0,0 +1,54 @@ +import React from "react"; + +const ProgressReceipt = ({ + orderProps: { orderNum, time, phone, foodies, payment, price }, +}) => { + const onClickBtn = () => { + console.log("제조완료"); + }; + + return ( +
+
+ 주문번호 {orderNum} + + +
+
+ 주문시간 + {time} +
+
+ 고객연락처 + {phone} +
+
+
+ 주문내역 +
+
+ {foodies[0].name} + {foodies[0].count} +
+
+ {foodies[0].options.map((option) => ( + └ {option} + ))} +
+
+
+ 결제수단 + {payment} +
+
+ 결제금액 + {/* 100원 단위 ,처리 여유로우면 하기 */} + {price}원 +
+
+ ); +}; + +export default ProgressReceipt; diff --git a/src/pages/Home/StatusHome/Complete.jsx b/src/pages/Home/StatusHome/Complete.jsx new file mode 100644 index 0000000..469f6cc --- /dev/null +++ b/src/pages/Home/StatusHome/Complete.jsx @@ -0,0 +1,147 @@ +import React, { useEffect, useState } from "react"; +import { useRecoilState } from "recoil"; +import { ordercnt, selectOrder, selectStatus } from "../../../Atom/order"; +import downArrow from "../../../assets/icons/icon_downArrow_black.svg"; +import OrderBox from "../../../components/views/Order/OrderBox"; +import "./DetailHome.css"; + +const Complete = () => { + const [orderCount, setOrderCount] = useRecoilState(ordercnt); // Recoil 상태 가져오기 + const [orderSelect, setOrderSelect] = useRecoilState(selectOrder); + const [statusSelect, setStatusSelect] = useRecoilState(selectStatus); + + const orderInfo = { + orders: [ + { + id: 123, //db 인덱스 + orderNum: 2, // 그날의 그가게의 주문번호 + pickUp: "픽업", + foodies: [ + { + name: "아메리카노", + count: 3, + options: ["샷 추가", "휘핑", "ICE", "그란데"], + }, + ], + phone: "010-6439-3547", // 고객의 전화번호 + time: "21/11/08 11:44:30", // 주문시간 + payment: "현대카드", + price: 8500, + }, + { + id: 124, //db 인덱스 + orderNum: 3, // 그날의 그가게의 주문번호 + pickUp: "매장", + foodies: [ + { + name: "아메리카누", + count: 3, + options: ["샷 추가 *100 ", "휘핑 *1000", "HOT", "그란데"], + }, + ], + phone: "010-7679-3547", // 고객의 전화번호 + time: "23/11/08 11:44:30", // 주문시간 + payment: "현대카드", + price: 78500, + }, + { + id: 125, + orderNum: 4, + pickUp: "픽업", + foodies: [ + { + name: "아메리카노", + count: 3, + options: ["샷 추가", "휘핑", "ICE", "그란데"], + }, + ], + phone: "010-6439-3547", // 고객의 전화번호 + time: "21/11/08 11:44:30", // 주문시간 + payment: "현대카드", + price: 8500, + }, + { + id: 126, + orderNum: 5, + pickUp: "매장", + foodies: [ + { + name: "아메리카노", + count: 3, + options: ["샷 추가", "휘핑", "ICE", "그란데"], + }, + ], + phone: "010-6439-3547", // 고객의 전화번호 + time: "21/11/08 11:44:30", // 주문시간 + payment: "현대카드", + price: 8500, + }, + ], + }; + + const [selectedOrderId, setSelectedOrderId] = useState(null); + const [isRecentFirst, setIsRecentFirst] = useState(false); + + const sortedOrders = isRecentFirst + ? [...orderInfo.orders].reverse() + : orderInfo.orders; + + const onClickHandler = (selectedOrder) => { + setOrderSelect(selectedOrder); + if (selectedOrder === null) { + setStatusSelect("null"); + } else { + setStatusSelect("complete"); + } + + setSelectedOrderId(selectedOrder ? selectedOrder.id : null); + console.log(orderCount); + console.log(orderSelect); + console.log(statusSelect); + }; + + useEffect(() => { + // OrderBox가 생성될 때마다 개수 증가 + setOrderCount((prev) => ({ ...prev, complete: orderInfo.orders.length })); + }, [orderInfo.orders.length, setOrderCount]); + + return ( +
+
+ 주문번호 + 주문일시 + 픽업유무 + 주문금액 + {isRecentFirst ? ( + setIsRecentFirst(!isRecentFirst)} + > + 과거순 + new + + ) : ( + setIsRecentFirst(!isRecentFirst)} + > + 최신순 + new + + )} +
+
+ {sortedOrders.map((order) => ( + + ))} +
+
+ ); +}; + +export default Complete; diff --git a/src/pages/Home/StatusHome/DetailHome.css b/src/pages/Home/StatusHome/DetailHome.css new file mode 100644 index 0000000..fa9de71 --- /dev/null +++ b/src/pages/Home/StatusHome/DetailHome.css @@ -0,0 +1,70 @@ +.Order-wrapper { + width: 100%; + /* height: 100%; */ + padding: 0%; +} + +.Order-title__wrapper { + display: flex; + padding-left: 1%; +} + +.Order-title__wrapper span { + display: flex; + align-items: center; + justify-content: center; + + width: 8.25rem; + height: 3.125rem; + text-align: center; + + color: #4f4f4f; + font-family: "Regular"; + font-size: 1.375rem; + font-style: normal; + font-weight: 600; + line-height: 100%; /* 1.375rem */ +} + +.Order-content__wrapper { + padding: 0%; + + height: calc(46.25rem - 5.0625rem); + /* height: calc(42.5rem - 5.0625rem); */ + overflow-y: auto; + + display: flex; + flex-direction: column; +} + +.Order-content__box { + width: 33.375rem; + padding: 2% 0% 2% 0%; + + border-top: 2px solid #838383; + + display: flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: flex-start; + align-items: center; +} + +.Order-content__span { + width: 6.275rem; + + display: flex; + justify-content: center; + align-items: center; + + color: #000; + font-family: "Medium"; + font-size: 1.25rem; + font-weight: 500; + line-height: 100%; /* 1.25rem */ +} + +.Arrowicon { + width: 1.25rem; + height: 1.25rem; +} diff --git a/src/pages/Home/StatusHome/Progress.jsx b/src/pages/Home/StatusHome/Progress.jsx new file mode 100644 index 0000000..065aa2e --- /dev/null +++ b/src/pages/Home/StatusHome/Progress.jsx @@ -0,0 +1,146 @@ +import React, { useEffect, useState } from "react"; +import { useRecoilState } from "recoil"; +import { ordercnt, selectOrder, selectStatus } from "../../../Atom/order"; +import downArrow from "../../../assets/icons/icon_downArrow_black.svg"; +import OrderBox from "../../../components/views/Order/OrderBox"; +import "./DetailHome.css"; + +const Progress = () => { + const [orderCount, setOrderCount] = useRecoilState(ordercnt); // Recoil 상태 가져오기 + const [orderSelect, setOrderSelect] = useRecoilState(selectOrder); + const [statusSelect, setStatusSelect] = useRecoilState(selectStatus); + + const orderInfo = { + orders: [ + { + id: 123, //db 인덱스 + orderNum: 2, // 그날의 그가게의 주문번호 + pickUp: "픽업", + foodies: [ + { + name: "아메리카노", + count: 3, + options: ["샷 추가", "휘핑", "ICE", "그란데"], + }, + ], + phone: "010-6439-3547", // 고객의 전화번호 + time: "21/11/08 11:44:30", // 주문시간 + payment: "현대카드", + price: 8500, + }, + { + id: 124, //db 인덱스 + orderNum: 3, // 그날의 그가게의 주문번호 + pickUp: "매장", + foodies: [ + { + name: "아메리카누", + count: 3, + options: ["샷 추가 *100 ", "휘핑 *1000", "HOT", "그란데"], + }, + ], + phone: "010-7679-3547", // 고객의 전화번호 + time: "23/11/08 11:44:30", // 주문시간 + payment: "현대카드", + price: 78500, + }, + { + id: 125, + orderNum: 4, + pickUp: "픽업", + foodies: [ + { + name: "아메리카노", + count: 3, + options: ["샷 추가", "휘핑", "ICE", "그란데"], + }, + ], + phone: "010-6439-3547", // 고객의 전화번호 + time: "21/11/08 11:44:30", // 주문시간 + payment: "현대카드", + price: 8500, + }, + { + id: 126, + orderNum: 5, + pickUp: "매장", + foodies: [ + { + name: "아메리카노", + count: 3, + options: ["샷 추가", "휘핑", "ICE", "그란데"], + }, + ], + phone: "010-6439-3547", // 고객의 전화번호 + time: "21/11/08 11:44:30", // 주문시간 + payment: "현대카드", + price: 8500, + }, + ], + }; + + const [selectedOrderId, setSelectedOrderId] = useState(null); + const [isRecentFirst, setIsRecentFirst] = useState(false); + + const sortedOrders = isRecentFirst + ? [...orderInfo.orders].reverse() + : orderInfo.orders; + + const onClickHandler = (selectedOrder) => { + setOrderSelect(selectedOrder); + if (selectedOrder === null) { + setStatusSelect("null"); + } else { + setStatusSelect("progress"); + } + console.log(orderCount); + console.log(orderSelect); + console.log(statusSelect); + setSelectedOrderId(selectedOrder ? selectedOrder.id : null); + }; + + useEffect(() => { + // OrderBox가 생성될 때마다 개수 증가 + setOrderCount((prev) => ({ ...prev, progress: orderInfo.orders.length })); + }, [orderInfo.orders.length, setOrderCount]); + + return ( +
+
+ 주문번호 + 주문일시 + 픽업유무 + 주문금액 + {isRecentFirst ? ( + setIsRecentFirst(!isRecentFirst)} + > + 과거순 + new + + ) : ( + setIsRecentFirst(!isRecentFirst)} + > + 최신순 + new + + )} +
+
+ {sortedOrders.map((order) => ( + + ))} +
+
+ ); +}; + +export default Progress; diff --git a/src/pages/Home/StatusHome/Wait.jsx b/src/pages/Home/StatusHome/Wait.jsx new file mode 100644 index 0000000..528fc3d --- /dev/null +++ b/src/pages/Home/StatusHome/Wait.jsx @@ -0,0 +1,151 @@ +import React, { useEffect, useState } from "react"; +import { useRecoilState } from "recoil"; +import { ordercnt, selectOrder, selectStatus } from "../../../Atom/order"; +import downArrow from "../../../assets/icons/icon_downArrow_black.svg"; +import OrderBox from "../../../components/views/Order/OrderBox"; +import "./DetailHome.css"; + +const Wait = () => { + const [orderCount, setOrderCount] = useRecoilState(ordercnt); // Recoil 상태 가져오기 + const [orderSelect, setOrderSelect] = useRecoilState(selectOrder); + const [statusSelect, setStatusSelect] = useRecoilState(selectStatus); + + const orderInfo = { + orders: [ + { + id: 123, //db 인덱스 + orderNum: 2, // 그날의 그가게의 주문번호 + pickUp: "픽업", + foodies: [ + { + name: "아메리카노", + count: 3, + options: ["샷 추가", "휘핑", "ICE", "그란데"], + }, + ], + phone: "010-6439-3547", // 고객의 전화번호 + time: "21/11/08 11:44:30", // 주문시간 + payment: "현대카드", + price: 8500, + }, + { + id: 124, //db 인덱스 + orderNum: 3, // 그날의 그가게의 주문번호 + pickUp: "매장", + foodies: [ + { + name: "아메리카누", + count: 3, + options: ["샷 추가 *100 ", "휘핑 *1000", "HOT", "그란데"], + }, + ], + phone: "010-7679-3547", // 고객의 전화번호 + time: "23/11/08 11:44:30", // 주문시간 + payment: "현대카드", + price: 78500, + }, + { + id: 125, + orderNum: 4, + pickUp: "픽업", + foodies: [ + { + name: "아메리카노", + count: 3, + options: ["샷 추가", "휘핑", "ICE", "그란데"], + }, + ], + phone: "010-6439-3547", // 고객의 전화번호 + time: "21/11/08 11:44:30", // 주문시간 + payment: "현대카드", + price: 8500, + }, + { + id: 126, + orderNum: 5, + pickUp: "매장", + foodies: [ + { + name: "아메리카노", + count: 3, + options: ["샷 추가", "휘핑", "ICE", "그란데"], + }, + ], + phone: "010-6439-3547", // 고객의 전화번호 + time: "21/11/08 11:44:30", // 주문시간 + payment: "현대카드", + price: 8500, + }, + ], + }; + + const [selectedOrderId, setSelectedOrderId] = useState(null); + const [isRecentFirst, setIsRecentFirst] = useState(false); + + const sortedOrders = isRecentFirst + ? [...orderInfo.orders].reverse() + : orderInfo.orders; + + const onClickHandler = (selectedOrder) => { + setOrderSelect(selectedOrder); + if (selectedOrder === null) { + setStatusSelect("null"); + } else { + setStatusSelect("pending"); + } + console.log(orderCount); + console.log(orderSelect); + console.log(statusSelect); + setSelectedOrderId(selectedOrder ? selectedOrder.id : null); + }; + + useEffect(() => { + /* + while (orderInfo.orders.length !== 0 && soundState) { + AudioPlayer(); + }*/ + + // OrderBox가 생성될 때마다 개수 증가 + setOrderCount((prev) => ({ ...prev, pending: orderInfo.orders.length })); + }, [orderInfo.orders.length, setOrderCount]); + + return ( +
+
+ 주문번호 + 주문일시 + 픽업유무 + 주문금액 + {isRecentFirst ? ( + setIsRecentFirst(!isRecentFirst)} + > + 과거순 + new + + ) : ( + setIsRecentFirst(!isRecentFirst)} + > + 최신순 + new + + )} +
+
+ {sortedOrders.map((order) => ( + + ))} +
+
+ ); +}; + +export default Wait; diff --git a/src/pages/Inventory/Inventory.css b/src/pages/Inventory/Inventory.css new file mode 100644 index 0000000..5e5d655 --- /dev/null +++ b/src/pages/Inventory/Inventory.css @@ -0,0 +1,16 @@ +.inven-wrapper{ + display: flex; + +} + +nav{ + width: 8.875rem; + /* height: 46.25rem; */ + /* height: 42.5rem; */ + height: 45.75rem; + z-index: 1; +} + +main{ + width: calc(100vw - 8.875rem); +} \ No newline at end of file diff --git a/src/pages/Inventory/Inventory.jsx b/src/pages/Inventory/Inventory.jsx new file mode 100644 index 0000000..d8e42d5 --- /dev/null +++ b/src/pages/Inventory/Inventory.jsx @@ -0,0 +1,21 @@ +import React from "react"; +import Header from "../../components/views/Header/Header2"; +import NavBar from "../../components/views/NavBar/NavBar"; +import "./Inventory.css"; +import MainInven from "./MainInven"; + +const Inventory = () => { + return ( +
+
+ +
+ +
+
+ ); +}; + +export default Inventory; diff --git a/src/pages/Inventory/MainInven.css b/src/pages/Inventory/MainInven.css new file mode 100644 index 0000000..2de0b41 --- /dev/null +++ b/src/pages/Inventory/MainInven.css @@ -0,0 +1,208 @@ +.mainInven-wrapper{ + width: 100%; + /* height: 100%; */ +} + +.mainInven-title__wrapper{ + display: flex; + height: 5.0625rem; + width: 100%; + min-width: calc(73.75rem - 8.875rem); + background-color: #4F4F4F; + border-bottom: 0.5rem solid #d82356; + position: relative; +} + +.mainInven-title__wrapper span{ + font-size: 1.875rem; + font-family: "Bold"; + color: #fff; + text-align: center; + line-height: 4.5625rem; + white-space: nowrap; +} + +.mainInven-title__span1{ + width: 15%; + min-width: 8.3125rem; +} + +.mainInven-title__span2__wrapper{ + width: 25%; + min-width: 17.8125rem; + display: flex; + justify-content: space-between; +} + +.mainInven-title__span2{ + /* width: 25%; */ +} + +.mainInven-title__span3{ + width: 60%; + /* min-width: 39.625rem; */ +} + +.mainInven-category__modal{ + position: absolute; + left: calc((100vw - 8.875rem) * 0.275); + display: flex; + flex-direction: column; + width: 17.1875rem; + border-radius: 0 0 0.625rem 0.625rem; + background-color: #4F4F4F; + z-index: 0; +} + +.mainInven-category__modal span{ + width: 17.1875rem; + height: 3.0625rem; + line-height: 3.0625rem; + font-size: 1.5625rem; + font-family: "SemiBold"; + color: #fff; + /* background-color: #4F4F4F; */ +} + +.mainInven-category__line{ + background-color: #dadada; + width: 100%; + height: 0.0625rem; +} + +.mainInven-category-content__wrapper{ + width: 100%; + height: calc(45.75rem - 5.0625rem); + /* height: calc(46.25rem - 5.0625rem); */ + /* height: calc(42.5rem - 5.0625rem); */ + overflow-y: auto; + overflow-x: hidden; +} + +.mainInven-category-content__wrapper::-webkit-scrollbar { + display: none; +} + +.mainInven-category-content__wrapper { + -ms-overflow-style: none; /* 인터넷 익스플로러 */ + scrollbar-width: none; /* 파이어폭스 */ +} + +.mainInven-category-content__box{ + display: flex; + + width: 100%; + min-width: calc(73.75rem - 8.875rem); + height: 3.6875rem; + border-bottom: #dadada solid 0.125rem; +} + +.mainInven-category-content__box.selected{ + background-color: rgba(216, 35, 86, 0.15); +} + +.mainInven-category-content__box span{ + font-size: 1.5625rem; + font-family: "Medium"; + color: #4f4f4f; + line-height: 3.6875rem; +} + +.mainInven-category-checkbox{ + height: 2.1875rem; + width: 2.1875rem; + border:#dadada solid 0.1875rem; + border-radius: 0.125rem; +} + +.mainInven-category-checkbox.selected{ + background: #d82356 url( "../../assets/icons/icon_check.svg" ) no-repeat center center; + + border: none; +} + +.mainInven-category-content__span1{ + width: 15%; + min-width: 8.3125rem; + + display: flex; + justify-content: center; + align-items: center; +} + +.mainInven-category-content__span2{ + width: 25%; + min-width: 17.8125rem; + + white-space: nowrap; +} + +.mainInven-category-content__span3{ + width: 60%; + min-width: 39.625rem; + + white-space: nowrap; +} + +/* 모달 */ +.modal-wrapper{ + position: absolute; + top: 5.5rem; + bottom: 0; + left: 8.875rem; + right: 0; + height: 46.25rem; + background-color: rgba(0,0,0, 0.5); + + display: flex; +} + +.modal-box{ + position: absolute; + top: calc(50% - 12.15625rem); + left: calc(50% - 17.1875rem); + + width: 34.375rem; + height: 24.3125rem; + background-color: #fff; + border-radius: 2.8125rem; + z-index: 101; + padding: 2.0625rem 3.25rem; +} + +.modal-close__wrapper{ + display: flex; + justify-content: flex-end; +} + +.modal-box-img__wrapper{ + height: 30%; +} + +.modal-box-txt__wrapper{ + height: 30%; +} + +.modal-box-txt{ + font-size: 1.5625rem; + font-family: "SemiBold"; +} + +.modal-box-close-btn__wrapper{ + display: flex; + flex-direction: column; + justify-content: flex-end; + height: 30%; +} + +.modal-box-close-btn{ + width: 19.375rem; + height: 3.125rem; + margin: 0 auto; + color: #fff; + background-color: #d82356; + font-size: 1.5625rem; + font-family: "SemiBold"; + line-height: 3.125rem; + border-radius: 0.5rem; +} \ No newline at end of file diff --git a/src/pages/Inventory/MainInven.jsx b/src/pages/Inventory/MainInven.jsx new file mode 100644 index 0000000..acb6886 --- /dev/null +++ b/src/pages/Inventory/MainInven.jsx @@ -0,0 +1,220 @@ +import React, { useEffect, useState } from "react"; +import close from "../../assets/icons/icon_closeModal.svg"; +import downArrow from "../../assets/icons/icon_downArrow.svg"; +import upArrow from "../../assets/icons/icon_upArrow.svg"; +import cherry from "../../assets/icons/small_cherry.svg"; +import InvenBox from "../../components/views/Inven/InvenBox"; +import "./MainInven.css"; + + +function MainInven () { + const [category, setCategory] = useState("전체"); + const [isCategoryOpen, setIsCategoryOpen] = useState(false); + const [isModalOpen, setIsModalOpen] = useState(false); + + const categoryList = ["전체", "커피", "논커피", "티", "에이드", "프라페", "스무디", "마카롱", "아이스크림", "와플", "크로플", "베이커리"]; + const chnMenu = () => setIsCategoryOpen(!isCategoryOpen); + + const chnCategory = (e) => { + setCategory(e); + setIsCategoryOpen((prev) => !prev); + } + + const handleModal = () => { + setIsModalOpen((prev) => !prev); + + // /api/v1/inventory [patch] + // /api/v1/inventory [get] + } + + useEffect(() => { + const handleClickOutside = (e) => { + const layerPopup = document.querySelector(".mainInven-category__modal"); + if (layerPopup && !layerPopup.contains(e.target)) { + setIsCategoryOpen(false); + } + }; + + document.addEventListener("mouseup", handleClickOutside); + return () => { + document.removeEventListener("mouseup", handleClickOutside); + }; + }, []); + + const invenList = { + "category" : [ + { + "name" : "커피", + "foodies" : [ + { + "idx" : 123, + "name": "아메리카노", + "soldOut" : true, + + }, + { + "idx" : 133, + "name": "라떼", + "soldOut" : false, + + }, + ], + + }, + { + "name" : "티", + "foodies" : [ + { + "idx" : 124, + "name": "녹차", + "soldOut" : true, + + }, + { + "idx" : 143, + "name": "홍차", + "soldOut" : false, + + }, + ], + + }, + { + "name" : "에이드", + "foodies" : [ + { + "idx" : 125, + "name": "망고 에이드", + "soldOut" : true, + + }, + { + "idx" : 153, + "name": "청포도 에이드", + "soldOut" : false, + + }, + ], + + }, + { + "name" : "프라페", + "foodies" : [ + { + "idx" : 126, + "name": "오레오 프라페", + "soldOut" : true, + + }, + { + "idx" : 163, + "name": "초코 프라페", + "soldOut" : false, + + }, + ], + + }, + { + "name" : "스무디", + "foodies" : [ + { + "idx" : 127, + "name": "무화과 스무디", + "soldOut" : true, + + }, + { + "idx" : 173, + "name": "망고 스무디", + "soldOut" : false, + + }, + ], + + }, + { + "name" : "마카롱", + "foodies" : [ + { + "idx" : 128, + "name": "앙버터 마카롱", + "soldOut" : true, + + }, + { + "idx" : 183, + "name": "로투스 마카롱", + "soldOut" : false, + + }, + ], + + }, + ], + }; + + return ( +
+
+ 품절 +
+ + {category} + {isCategoryOpen ? (downArrow) : (upArrow)} +
+ 상품명 +
+ + {isCategoryOpen && ( +
+ {categoryList.map((e, i) => ( + <> + chnCategory(e)}>{e} +
+ + ))} +
+ )} + +
+ {invenList.category + .filter((cate) => category === "전체" || cate.name === category) + .map((categoryItem) => + categoryItem.foodies.map((foodItem) => ( +
+ +
+ ) + ))} +
+ + {isModalOpen && ( +
+
+
+ close +
+
cherry
+
+
품절 처리 시
+
고객님은 해당 메뉴를 주문할 수 없습니다.
+
+
+
확인
+
+
+
+ )} +
+ ); +}; + +export default MainInven; diff --git a/src/pages/LandingPage/LandingPage.jsx b/src/pages/LandingPage/LandingPage.jsx deleted file mode 100644 index b5cdfde..0000000 --- a/src/pages/LandingPage/LandingPage.jsx +++ /dev/null @@ -1,7 +0,0 @@ -import React from "react"; - -function LandingPage() { - return
hello world!
; -} - -export default LandingPage; diff --git a/src/pages/Main/MainPage.css b/src/pages/Main/MainPage.css new file mode 100644 index 0000000..a032044 --- /dev/null +++ b/src/pages/Main/MainPage.css @@ -0,0 +1,24 @@ +.mainpage-wrapper{ + width: 100%; + /* height: 100%; */ + background-color: #fff; + + display: flex; + flex-direction: column; + align-items: center; + justify-content: space-around; +} + +.mainpage-btn__wrapper{ + width: 37.5rem; + height: 5.625rem; + line-height: 5.625rem; + background-color: #ffe812; + border-radius: 0.875rem; +} + +.mainpage-btn__wrapper span{ + text-align: center; + font-family: "Regular"; + font-size: 1.375rem; +} \ No newline at end of file diff --git a/src/pages/Main/MainPage.jsx b/src/pages/Main/MainPage.jsx new file mode 100644 index 0000000..c3ecef3 --- /dev/null +++ b/src/pages/Main/MainPage.jsx @@ -0,0 +1,20 @@ +import logo from "../../assets/icons/Big_LOGO.svg"; +import kakao from "../../assets/icons/img_kakao.png"; +import "./MainPage.css"; + +function MainPage () { + const handleKakaoLogin = () => { + // console.log(process.env.REACT_APP_KAKAO_LOGIN); + window.location.href = `${process.env.REACT_APP_KAKAO_LOGIN}`; + }; + + return( +
+ logo +
kakao
+ +
+ ) +} + +export default MainPage; \ No newline at end of file diff --git a/src/pages/Mypage/MainMypage.css b/src/pages/Mypage/MainMypage.css new file mode 100644 index 0000000..e45735a --- /dev/null +++ b/src/pages/Mypage/MainMypage.css @@ -0,0 +1,112 @@ +.mypage-main__wrapper{ + display: flex; + flex-direction: column; + + padding: 4.3125rem 4rem 2rem 4rem; + width: 100%; + height: calc(100% + 5.5rem); + + justify-content: space-between; +} + +.mypage-top__wrapper{ + width: 100%; +} + +.mypage-top__txt{ + font-size: 1.25rem; + font-family: "Bold"; + color: #4f4f4f; +} + +.mypage-top__box{ + display: flex; + justify-content: space-between; +} + +.mypage-top-txt__wrapper{ + text-align: start; +} + +.mypage-top-cafe__txt{ + font-size: 1.875rem; + font-family: "Bold"; + white-space: nowrap; +} + +.mypage-top-cafe__txt span{ + font-size: 3.125rem; +} + +.mypage-kakao__wrapper{ + display: flex; + flex-direction: row; + align-items: center; +} + +.mypage-kakao__txt{ + display: flex; + flex-direction: column; + text-align: start; + margin: 0 3.4375rem 0 0.6875rem; +} + +.mypage-kakao__txt span{ + font-size: 1.09rem; + font-family: "Medium"; + color: #838383; +} + +.mypage-kakao-img__box{ + width: 3.625rem; + height: 2.5rem; + border-radius: 0.625rem; + background-color: #d9d9d9; + padding: 0.59375rem 0; +} + +.mypage__line{ + height: 0.15625rem; + width: 100%; + background-color: #dadada; + margin: 1.5625rem 0; +} + +.mypage-content__wrapper{ + width: 100%; + text-align: start; +} + +.mypage-content__wrapper p{ + font-size: 1.875rem; + font-family: "Bold"; + color: #4f4f4f; + margin: 2rem 0; +} + +.mypage-content__box div{ + display: flex; /* 추가: 내부 div들을 가로로 나열하기 위해 Flexbox 사용 */ + justify-content: space-between; + width: 100%; + margin: 0.625rem 0; +} + +.mypage-content__title{ + font-size: 1.875rem; + font-family: "Medium"; + color: #000; + width: 30%; +} + +.mypage-content__txt{ + font-size: 1.5625rem; + font-family: "Light"; + color: #000; + width: 70%; +} + +.mypage-logout__wrapper span{ + font-size: 0.9375rem; + font-family: "Regular"; + color: #838383; +} \ No newline at end of file diff --git a/src/pages/Mypage/MainMypage.jsx b/src/pages/Mypage/MainMypage.jsx new file mode 100644 index 0000000..1fd44d2 --- /dev/null +++ b/src/pages/Mypage/MainMypage.jsx @@ -0,0 +1,110 @@ +import axios from "axios"; +import React, { useEffect } from "react"; +import { useCookies } from "react-cookie"; +import { useNavigate } from "react-router-dom"; +import { useSetRecoilState } from 'recoil'; +import { isAuthenticatedState, loginState } from '../../Atom/status'; +import kakao from "../../assets/icons/icon_kakao.svg"; +import readyvery from "../../assets/icons/img_readyVery.svg"; + + +import "./MainMypage.css"; + +const MainMypage = () => { + const navigate = useNavigate(); + const apiUrl = process.env.REACT_APP_API_ROOT; + const [, ,removeCookies] = useCookies(); + const setIsLoggedIn = useSetRecoilState(loginState); + const setIsAuthenticated = useSetRecoilState(isAuthenticatedState); + + const fetchData = async () => { + // const response = await axios.get(`${process.env.REACT_APP_API_URL}/user/info`); + // console.log(response); + }; + + useEffect(() => { + fetchData(); + }, []); + + const handleLogout = () => { + const config = { + withCredentials: true, + }; + + axios.get(apiUrl + "/api/v1/user/logout", config) + .then((response) => { + console.log(response); + setIsAuthenticated(false); + setIsLoggedIn({ + accessToken: null, + expiredTime: null + }) + navigate("/"); + removeCookies("accessToken"); + removeCookies("JSESSIONID"); + window.localStorage.setItem("isAuthenticated", false); + }) + .catch((error) => { + alert("관리자에게 문의하세요."); + navigate("/"); + + }); + } + + return ( +
+
+
+
+ 오늘도 준비된 +
오르다커피 사장님
+
+
+
readyvery
+
+ 레디베리 상담 + 매일 00:00 ~ 24:00 +
+
kakao
+
+
+ +
+ +
+

기본 정보

+
+
+ 가게명 + 오르다커피 +
+ +
+ 가게주소 + 경기 부천시 지봉로 46 백호빌딩 2층 +
+ +
+ 매장 연락처 + 0507-1358-6887 +
+ +
+ 영업시간 + 평일 08:40-23:00 / 토요일 11:00-22:00 / 일요일 휴무 +
+ +
+ 등록 계좌번호 + KB국민은행 22930104331825 +
+
+
+
+ +
로그아웃
+
+ ); +}; + +export default MainMypage; diff --git a/src/pages/Mypage/Mypage.css b/src/pages/Mypage/Mypage.css new file mode 100644 index 0000000..bdb94ab --- /dev/null +++ b/src/pages/Mypage/Mypage.css @@ -0,0 +1,16 @@ +.mypage-wrapper{ + display: flex; +} + +nav{ + width: 8.875rem; + /* height: 46.25rem; */ + /* height: 42.5rem; */ + height: 45.75rem; + padding-top: 5.5rem; +} + +main{ + width: calc(100vw - 8.875rem); + margin-top: 5.5rem; +} \ No newline at end of file diff --git a/src/pages/Mypage/Mypage.jsx b/src/pages/Mypage/Mypage.jsx new file mode 100644 index 0000000..15739e9 --- /dev/null +++ b/src/pages/Mypage/Mypage.jsx @@ -0,0 +1,22 @@ +import React from "react"; +// import { Col, Nav, Row } from "react-bootstrap"; +import Header from "../../components/views/Header/Header2"; +import NavBar from "../../components/views/NavBar/NavBar"; +import MainMypage from "./MainMypage"; +import "./Mypage.css"; + +function Mypage (props) { + return ( +
+
+ +
+ +
+
+ ); +}; + +export default Mypage; diff --git a/src/pages/Sales/MainSales.css b/src/pages/Sales/MainSales.css new file mode 100644 index 0000000..17ef6bb --- /dev/null +++ b/src/pages/Sales/MainSales.css @@ -0,0 +1,76 @@ +.sales-main__wrapper{ + width: 100%; +} + +.sales-top__wrapper{ + margin: 2rem 0 1.75rem 0; +} + +.sales-total-revenue{ + font-size: 2.1875rem; + font-family: "Bold"; + color: #000; + white-space: nowrap; +} + +.sales-total-txt__wrapper{ + display: flex; + justify-content: space-between; + width: 56.25rem; + margin: 0 auto; +} + +.sales-total-txt{ + font-size: 0.875rem; + font-family: "Regular"; + color: #838383; + line-height: 1.25rem; +} + +.sales-total-date{ + font-size: 1.25rem; + font-family: "Medium"; + color: #4f4f4f; +} + +.sales-revenue__wrapper{ + width: 56.25rem; /* 900px */ + height: 34.8125rem; /* 557px */ + border-radius: 0.625rem; + box-shadow: 0 5px 5px rgba(0, 0, 0, 0.25); + margin: 0 auto; + padding: 1.65625rem 2.625rem; +} + +.sales-revenue-title{ + font-size: 1.875rem; + font-family: "Bold"; + color: #000; +} + +.sales-revenue-week__wrapper{ + display: flex; + justify-content: space-around; +} + +.sales-revenue-img__wrapper{ + display: flex; + align-items: center; +} + +.sales-revenue-week__title{ + font-size: 1.25rem; + font-family: "SemiBold"; + color: #4F4F4F; +} + +.sales-revenue-week__date{ + font-size: 1rem; + font-family: "SemiBold"; + color: #4F4F4F; +} + +.sales-chart__wrapper{ + width: 100%; + height: 80%; +} \ No newline at end of file diff --git a/src/pages/Sales/MainSales.jsx b/src/pages/Sales/MainSales.jsx new file mode 100644 index 0000000..e9bf579 --- /dev/null +++ b/src/pages/Sales/MainSales.jsx @@ -0,0 +1,95 @@ +import ArrowBackIosNewIcon from '@mui/icons-material/ArrowBackIosNew'; +import ArrowForwardIosIcon from '@mui/icons-material/ArrowForwardIos'; +import 'moment/locale/ko'; +import moment from 'moment/moment'; +import React, { useState } from "react"; +import Chart from '../../components/views/Chart/Chart'; +import "./MainSales.css"; + +const MainSales = () => { + const chartData = + [ + { + "day": "Mon", + "매출": 160, + }, + { + "day": "Tue", + "매출": 84, + }, + { + "day": "Wed", + "매출": 1, + }, + { + "day": "Thu", + "매출": 159, + }, + { + "day": "Fri", + "매출": 168, + }, + { + "day": "Sat", + "매출": 118, + }, + { + "day": "Sun", + "매출": 170, + } + ]; + + const [currentDate, setCurrentDate] = useState({ + monday: moment(moment()).startOf('isoWeek'), + sunday: moment(moment()).endOf('isoWeek') + }); + + const handlePrevWeek = () => { + const currentWeekStart = moment(currentDate.monday).startOf('isoWeek').add(-1, 'weeks'); + const currentWeekEnd = moment(currentWeekStart).endOf('isoWeek'); + + setCurrentDate({ + monday: currentWeekStart, + sunday: currentWeekEnd + }); + }; + + const handleNextWeek = () => { + const currentWeekStart = moment(currentDate.monday).startOf('isoWeek').add(1, 'weeks'); + const currentWeekEnd = moment(currentWeekStart).endOf('isoWeek'); + + setCurrentDate({ + monday: currentWeekStart, + sunday: currentWeekEnd + }); + }; + + return ( +
+
+
레디베리를 통해 누적 1,170,500원의 매출을 올렸습니다.
+
+ 매출 발생 후 최대 5영업일 이내에 중개 수수료 차감 후 입금 예정 ( 문의 : 오남택 010-9295-5340 ) + (기준 {moment().format("M")}월 {moment().format("D")}일 {moment().format("HH")}:{moment().format("mm")}) +
+
+ +
+
주간매출
+
+ + +
{currentDate.monday.format("YYYY-MM-DD")} ~ {currentDate.sunday.format("YYYY-MM-DD")}
+ {/*
{currentDate.monday.format("YYYY-MM-DD")} ~ {currentDate.sunday.format("YYYY-MM-DD")}
*/} +
+ +
+
+ +
+
+
+ ); +}; + +export default MainSales; diff --git a/src/pages/Sales/Sales.css b/src/pages/Sales/Sales.css new file mode 100644 index 0000000..55491e5 --- /dev/null +++ b/src/pages/Sales/Sales.css @@ -0,0 +1,16 @@ +.sales-wrapper{ + display: flex; + +} + +nav{ + width: 8.875rem; + /* height: 46.25rem; */ + height: 45.75rem; + padding-top: 5.5rem; +} + +main{ + width: calc(100vw - 8.875rem); + margin-top: 5.5rem; +} \ No newline at end of file diff --git a/src/pages/Sales/Sales.jsx b/src/pages/Sales/Sales.jsx new file mode 100644 index 0000000..105ceff --- /dev/null +++ b/src/pages/Sales/Sales.jsx @@ -0,0 +1,21 @@ +import React from "react"; +import Header from "../../components/views/Header/Header2"; +import NavBar from "../../components/views/NavBar/NavBar"; +import MainSales from "./MainSales"; +import "./Sales.css"; + +function Sales (props) { + return ( +
+
+ +
+ +
+
+ ); +}; + +export default Sales; diff --git a/src/pages/TestPage/TestPage.jsx b/src/pages/TestPage/TestPage.jsx deleted file mode 100644 index 0e1dbd6..0000000 --- a/src/pages/TestPage/TestPage.jsx +++ /dev/null @@ -1,7 +0,0 @@ -import React from "react"; - -function TestPage() { - return
hello! testPage
; -} - -export default TestPage; diff --git a/src/style/theme/theme.jsx b/src/style/theme/theme.jsx index db31ba0..e6e8b73 100644 --- a/src/style/theme/theme.jsx +++ b/src/style/theme/theme.jsx @@ -1,15 +1,15 @@ const theme = { - colors: { - MainColor: '#05422b', - HoverColor: '#3CB371', - accent: '#e0234e', - }, - fontSize: { - small: '12px', - medium: '16px', - large: '24px', - }, - // 여기에 더 많은 테마 변수를 추가할 수 있습니다. + colors: { + MainColor: "#D82356", + SubColor: "#3CB371", + accent: "#e0234e", + }, + fontSize: { + small: "12px", + medium: "16px", + large: "24px", + }, + // 여기에 더 많은 테마 변수를 추가할 수 있습니다. }; -export default theme; \ No newline at end of file +export default theme;