From cba6640d29a39477ad2777d478ec7eca97a75a20 Mon Sep 17 00:00:00 2001 From: hahahaday12 Date: Fri, 9 Jun 2023 23:01:00 +0900 Subject: [PATCH 01/75] feat: Project all setting --- .env | 7 + .eslintrc.cjs | 14 + .gitignore | 24 + index.html | 13 + package-lock.json | 6584 +++++++++++++++++ package.json | 48 + public/images/Wink_logo.png | Bin 0 -> 19028 bytes public/images/bookcover.jpg | Bin 0 -> 60174 bytes public/images/bookimage.png | Bin 0 -> 234131 bytes public/images/cartbookimage.jpg | Bin 0 -> 3835 bytes public/images/search-icon.png | Bin 0 -> 338 bytes src/Admin/adminPage.tsx | 0 src/Apis/register.tsx | 42 + src/App.scss | 33 + src/App.tsx | 14 + src/Common/Form/Login/login.scss | 76 + src/Common/Form/Login/login.tsx | 116 + src/Common/Form/Signin/join.scss | 104 + src/Common/Form/Signin/join.tsx | 193 + src/Common/Form/Validation .tsx | 16 + src/Common/Layout/Footer/footer.scss | 51 + src/Common/Layout/Footer/footer.tsx | 79 + src/Common/Layout/Header/header.tsx | 71 + src/Common/Layout/Header/headers.scss | 130 + src/Common/Layout/LayoutPage.scss | 6 + src/Common/Layout/LayoutPage.tsx | 13 + src/Common/section/number.scss | 13 + src/Common/section/number.tsx | 29 + .../Views/CartPage/CartItems/CartItems.scss | 164 + .../Views/CartPage/CartItems/CartItems.tsx | 136 + src/Components/Views/CartPage/CartPage.scss | 161 + src/Components/Views/CartPage/CartPage.tsx | 80 + .../Views/CartPage/CartRent/CartRent.scss | 133 + .../Views/CartPage/CartRent/CartRent.tsx | 123 + .../Views/DetailPage/DetailPage.scss | 189 + .../Views/DetailPage/DetailPage.tsx | 101 + src/Components/Views/MyPage/MyPage.scss | 193 + src/Components/Views/MyPage/MyPage.tsx | 80 + src/Components/Views/MyPage/UserInfo.scss | 220 + src/Components/Views/MyPage/UserInfo.tsx | 122 + src/bookcustom/bookcustom.scss | 165 + src/bookcustom/bookcustom.tsx | 23 + src/index.scss | 0 src/main.tsx | 22 + src/routes/privateRoute.tsx | 22 + src/routes/routes.tsx | 50 + src/vite-env.d.ts | 1 + tsconfig.json | 31 + tsconfig.node.json | 10 + vite.config.ts | 25 + 50 files changed, 9727 insertions(+) create mode 100644 .env create mode 100644 .eslintrc.cjs create mode 100644 .gitignore create mode 100644 index.html create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 public/images/Wink_logo.png create mode 100644 public/images/bookcover.jpg create mode 100644 public/images/bookimage.png create mode 100644 public/images/cartbookimage.jpg create mode 100644 public/images/search-icon.png create mode 100644 src/Admin/adminPage.tsx create mode 100644 src/Apis/register.tsx create mode 100644 src/App.scss create mode 100644 src/App.tsx create mode 100644 src/Common/Form/Login/login.scss create mode 100644 src/Common/Form/Login/login.tsx create mode 100644 src/Common/Form/Signin/join.scss create mode 100644 src/Common/Form/Signin/join.tsx create mode 100644 src/Common/Form/Validation .tsx create mode 100644 src/Common/Layout/Footer/footer.scss create mode 100644 src/Common/Layout/Footer/footer.tsx create mode 100644 src/Common/Layout/Header/header.tsx create mode 100644 src/Common/Layout/Header/headers.scss create mode 100644 src/Common/Layout/LayoutPage.scss create mode 100644 src/Common/Layout/LayoutPage.tsx create mode 100644 src/Common/section/number.scss create mode 100644 src/Common/section/number.tsx create mode 100644 src/Components/Views/CartPage/CartItems/CartItems.scss create mode 100644 src/Components/Views/CartPage/CartItems/CartItems.tsx create mode 100644 src/Components/Views/CartPage/CartPage.scss create mode 100644 src/Components/Views/CartPage/CartPage.tsx create mode 100644 src/Components/Views/CartPage/CartRent/CartRent.scss create mode 100644 src/Components/Views/CartPage/CartRent/CartRent.tsx create mode 100644 src/Components/Views/DetailPage/DetailPage.scss create mode 100644 src/Components/Views/DetailPage/DetailPage.tsx create mode 100644 src/Components/Views/MyPage/MyPage.scss create mode 100644 src/Components/Views/MyPage/MyPage.tsx create mode 100644 src/Components/Views/MyPage/UserInfo.scss create mode 100644 src/Components/Views/MyPage/UserInfo.tsx create mode 100644 src/bookcustom/bookcustom.scss create mode 100644 src/bookcustom/bookcustom.tsx create mode 100644 src/index.scss create mode 100644 src/main.tsx create mode 100644 src/routes/privateRoute.tsx create mode 100644 src/routes/routes.tsx create mode 100644 src/vite-env.d.ts create mode 100644 tsconfig.json create mode 100644 tsconfig.node.json create mode 100644 vite.config.ts diff --git a/.env b/.env new file mode 100644 index 00000000..d768f6b9 --- /dev/null +++ b/.env @@ -0,0 +1,7 @@ +VITE_CAFE24_URL=/cafe24/admin + +VITE_ACCESS_TOKEN=blFKQmd4UHBIRk5sRUFHZko5bW8xQjpmcUhuMUU4blFTeGU2c21nZkpVVWNS + +VITE_CLIENT_ID=nQJBgxPpHFNlEAGfJ9mo1B +VITE_REDIRECT_URI=https://teamwink.com:5173/ +VITE_API_VERSION=2023-03-01 \ No newline at end of file diff --git a/.eslintrc.cjs b/.eslintrc.cjs new file mode 100644 index 00000000..4020bcbf --- /dev/null +++ b/.eslintrc.cjs @@ -0,0 +1,14 @@ +module.exports = { + env: { browser: true, es2020: true }, + extends: [ + 'eslint:recommended', + 'plugin:@typescript-eslint/recommended', + 'plugin:react-hooks/recommended', + ], + parser: '@typescript-eslint/parser', + parserOptions: { ecmaVersion: 'latest', sourceType: 'module' }, + plugins: ['react-refresh'], + rules: { + 'react-refresh/only-export-components': 'warn', + }, +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..a547bf36 --- /dev/null +++ b/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/index.html b/index.html new file mode 100644 index 00000000..e0d1c840 --- /dev/null +++ b/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite + React + TS + + +
+ + + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..7a6325eb --- /dev/null +++ b/package-lock.json @@ -0,0 +1,6584 @@ +{ + "name": "sale-project", + "version": "0.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "sale-project", + "version": "0.0.0", + "dependencies": { + "@emotion/react": "^11.11.0", + "@emotion/styled": "^11.11.0", + "@fortawesome/fontawesome-free": "^6.4.0", + "@fortawesome/free-brands-svg-icons": "^6.4.0", + "@fortawesome/free-regular-svg-icons": "^6.4.0", + "@fortawesome/free-solid-svg-icons": "^6.4.0", + "@fortawesome/react-fontawesome": "^0.2.0", + "@mui/material": "^5.13.4", + "@reduxjs/toolkit": "^1.9.5", + "@vitejs/plugin-react-swc": "^3.3.2", + "axios": "^1.4.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-redux": "^8.0.7", + "react-router-dom": "^6.11.2", + "redux": "^4.2.1", + "redux-promise": "^0.6.0", + "redux-thunk": "^2.4.2", + "sass": "^1.62.1", + "vite-plugin-mkcert": "^1.15.0", + "vite-plugin-sass-dts": "^1.3.5" + }, + "devDependencies": { + "@types/node": "^20.2.5", + "@types/react": "^18.0.37", + "@types/react-dom": "^18.0.11", + "@types/redux-promise": "^0.5.29", + "@typescript-eslint/eslint-plugin": "^5.59.0", + "@typescript-eslint/parser": "^5.59.0", + "eslint": "^8.38.0", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.3.4", + "typescript": "^5.0.2", + "vite": "^4.3.9" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", + "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", + "dependencies": { + "@babel/highlight": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz", + "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==", + "dependencies": { + "@babel/types": "^7.21.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.21.5.tgz", + "integrity": "sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.3.tgz", + "integrity": "sha512-XsDuspWKLUsxwCp6r7EhsExHtYfbe5oAGQ19kqngTdCPUoPQzOPdUbD/pB9PJiwb2ptYKQDjSJT3R6dC+EPqfQ==", + "dependencies": { + "regenerator-runtime": "^0.13.11" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.22.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.4.tgz", + "integrity": "sha512-Tx9x3UBHTTsMSW85WB2kphxYQVvrZ/t1FxD88IpSgIjiUJlCm9z+xWIDwyo1vffTwSqteqyznB8ZE9vYYk16zA==", + "dependencies": { + "@babel/helper-string-parser": "^7.21.5", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "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/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/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/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", + "integrity": "sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==", + "dependencies": { + "@emotion/memoize": "^0.8.1" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.8.1", + "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.0", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.0.tgz", + "integrity": "sha512-ZSK3ZJsNkwfjT3JpDAWJZlrGD81Z3ytNDsxw1LKq1o+xkmO5pnWfr6gmCC8gHEFf3nSSX/09YrG67jybNPxSUw==", + "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/@esbuild/android-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", + "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", + "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", + "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", + "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", + "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", + "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", + "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", + "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", + "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", + "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", + "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", + "cpu": [ + "loong64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", + "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", + "cpu": [ + "mips64el" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", + "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", + "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", + "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", + "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", + "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", + "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", + "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", + "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", + "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", + "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "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", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz", + "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz", + "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.5.2", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.41.0.tgz", + "integrity": "sha512-LxcyMGxwmTh2lY9FwHPGWOHmYFCZvbrFCBZL4FzSSsxsRPuhrYUg/49/0KDfW8tnIEaEHtfmn6+NPN+1DqaNmA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@fortawesome/fontawesome-common-types": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.4.0.tgz", + "integrity": "sha512-HNii132xfomg5QVZw0HwXXpN22s7VBHQBv9CeOu9tfJnhsWQNd2lmTNi8CSrnw5B+5YOmzu1UoPAyxaXsJ6RgQ==", + "hasInstallScript": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/fontawesome-free": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-6.4.0.tgz", + "integrity": "sha512-0NyytTlPJwB/BF5LtRV8rrABDbe3TdTXqNB3PdZ+UUUZAEIrdOJdmABqKjt4AXwIoJNaRVVZEXxpNrqvE1GAYQ==", + "hasInstallScript": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/fontawesome-svg-core": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.4.0.tgz", + "integrity": "sha512-Bertv8xOiVELz5raB2FlXDPKt+m94MQ3JgDfsVbrqNpLU9+UE2E18GKjLKw+d3XbeYPqg1pzyQKGsrzbw+pPaw==", + "hasInstallScript": true, + "peer": true, + "dependencies": { + "@fortawesome/fontawesome-common-types": "6.4.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/free-brands-svg-icons": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-6.4.0.tgz", + "integrity": "sha512-qvxTCo0FQ5k2N+VCXb/PZQ+QMhqRVM4OORiO6MXdG6bKolIojGU/srQ1ptvKk0JTbRgaJOfL2qMqGvBEZG7Z6g==", + "hasInstallScript": true, + "dependencies": { + "@fortawesome/fontawesome-common-types": "6.4.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/free-regular-svg-icons": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-6.4.0.tgz", + "integrity": "sha512-ZfycI7D0KWPZtf7wtMFnQxs8qjBXArRzczABuMQqecA/nXohquJ5J/RCR77PmY5qGWkxAZDxpnUFVXKwtY/jPw==", + "hasInstallScript": true, + "dependencies": { + "@fortawesome/fontawesome-common-types": "6.4.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/free-solid-svg-icons": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.4.0.tgz", + "integrity": "sha512-kutPeRGWm8V5dltFP1zGjQOEAzaLZj4StdQhWVZnfGFCvAPVvHh8qk5bRrU4KXnRRRNni5tKQI9PBAdI6MP8nQ==", + "hasInstallScript": true, + "dependencies": { + "@fortawesome/fontawesome-common-types": "6.4.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/react-fontawesome": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.2.0.tgz", + "integrity": "sha512-uHg75Rb/XORTtVt7OS9WoK8uM276Ufi7gCzshVWkUJbHhh3svsUUeqXerrM96Wm7fRiDzfKRwSoahhMIkGAYHw==", + "dependencies": { + "prop-types": "^15.8.1" + }, + "peerDependencies": { + "@fortawesome/fontawesome-svg-core": "~1 || ~6", + "react": ">=16.3" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", + "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "node_modules/@mui/base": { + "version": "5.0.0-beta.4", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.4.tgz", + "integrity": "sha512-ejhtqYJpjDgHGEljjMBQWZ22yEK0OzIXNa7toJmmXsP4TT3W7xVy8bTJ0TniPDf+JNjrsgfgiFTDGdlEhV1E+g==", + "dependencies": { + "@babel/runtime": "^7.21.0", + "@emotion/is-prop-valid": "^1.2.1", + "@mui/types": "^7.2.4", + "@mui/utils": "^5.13.1", + "@popperjs/core": "^2.11.8", + "clsx": "^1.2.1", + "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", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/core-downloads-tracker": { + "version": "5.13.4", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.13.4.tgz", + "integrity": "sha512-yFrMWcrlI0TqRN5jpb6Ma9iI7sGTHpytdzzL33oskFHNQ8UgrtPas33Y1K7sWAMwCrr1qbWDrOHLAQG4tAzuSw==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + } + }, + "node_modules/@mui/material": { + "version": "5.13.4", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.13.4.tgz", + "integrity": "sha512-Yq+4f1KLPa/Szd3xqra2hbOAf2Usl8GbubncArM6LIp40mBLtXIdPE29MNtHsbtuzz4g+eidrETgoi3wdbEYfQ==", + "dependencies": { + "@babel/runtime": "^7.21.0", + "@mui/base": "5.0.0-beta.4", + "@mui/core-downloads-tracker": "^5.13.4", + "@mui/system": "^5.13.2", + "@mui/types": "^7.2.4", + "@mui/utils": "^5.13.1", + "@types/react-transition-group": "^4.4.6", + "clsx": "^1.2.1", + "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/private-theming": { + "version": "5.13.1", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.13.1.tgz", + "integrity": "sha512-HW4npLUD9BAkVppOUZHeO1FOKUJWAwbpy0VQoGe3McUYTlck1HezGHQCfBQ5S/Nszi7EViqiimECVl9xi+/WjQ==", + "dependencies": { + "@babel/runtime": "^7.21.0", + "@mui/utils": "^5.13.1", + "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.13.2", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.13.2.tgz", + "integrity": "sha512-VCYCU6xVtXOrIN8lcbuPmoG+u7FYuOERG++fpY74hPpEWkyFQG97F+/XfTQVYzlR2m7nPjnwVUgATcTCMEaMvw==", + "dependencies": { + "@babel/runtime": "^7.21.0", + "@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.13.2", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.13.2.tgz", + "integrity": "sha512-TPyWmRJPt0JPVxacZISI4o070xEJ7ftxpVtu6LWuYVOUOINlhoGOclam4iV8PDT3EMQEHuUrwU49po34UdWLlw==", + "dependencies": { + "@babel/runtime": "^7.21.0", + "@mui/private-theming": "^5.13.1", + "@mui/styled-engine": "^5.13.2", + "@mui/types": "^7.2.4", + "@mui/utils": "^5.13.1", + "clsx": "^1.2.1", + "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.4", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.4.tgz", + "integrity": "sha512-LBcwa8rN84bKF+f5sDyku42w1NTxaPgPyYKODsh01U1fVstTClbUoSA96oyRBnSNyEiAVjKm6Gwx9vjR+xyqHA==", + "peerDependencies": { + "@types/react": "*" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/utils": { + "version": "5.13.1", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.13.1.tgz", + "integrity": "sha512-6lXdWwmlUbEU2jUI8blw38Kt+3ly7xkmV9ljzY4Q20WhsJMWiNry9CX8M+TaP/HbtuyR8XKsdMgQW7h7MM3n3A==", + "dependencies": { + "@babel/runtime": "^7.21.0", + "@types/prop-types": "^15.7.5", + "@types/react-is": "^18.2.0", + "prop-types": "^15.8.1", + "react-is": "^18.2.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "react": "^17.0.0 || ^18.0.0" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@octokit/auth-token": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.4.tgz", + "integrity": "sha512-TWFX7cZF2LXoCvdmJWY7XVPi74aSY0+FfBZNSXEXFkMpjcqsQwDSYVv5FhRFaI0V1ECnwbz4j59T/G+rXNWaIQ==", + "engines": { + "node": ">= 14" + } + }, + "node_modules/@octokit/core": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.2.1.tgz", + "integrity": "sha512-tEDxFx8E38zF3gT7sSMDrT1tGumDgsw5yPG6BBh/X+5ClIQfMH/Yqocxz1PnHx6CHyF6pxmovUTOfZAUvQ0Lvw==", + "dependencies": { + "@octokit/auth-token": "^3.0.0", + "@octokit/graphql": "^5.0.0", + "@octokit/request": "^6.0.0", + "@octokit/request-error": "^3.0.0", + "@octokit/types": "^9.0.0", + "before-after-hook": "^2.2.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@octokit/endpoint": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.5.tgz", + "integrity": "sha512-LG4o4HMY1Xoaec87IqQ41TQ+glvIeTKqfjkCEmt5AIwDZJwQeVZFIEYXrYY6yLwK+pAScb9Gj4q+Nz2qSw1roA==", + "dependencies": { + "@octokit/types": "^9.0.0", + "is-plain-object": "^5.0.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@octokit/graphql": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.6.tgz", + "integrity": "sha512-Fxyxdy/JH0MnIB5h+UQ3yCoh1FG4kWXfFKkpWqjZHw/p+Kc8Y44Hu/kCgNBT6nU1shNumEchmW/sUO1JuQnPcw==", + "dependencies": { + "@octokit/request": "^6.0.0", + "@octokit/types": "^9.0.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@octokit/openapi-types": { + "version": "17.2.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-17.2.0.tgz", + "integrity": "sha512-MazrFNx4plbLsGl+LFesMo96eIXkFgEtaKbnNpdh4aQ0VM10aoylFsTYP1AEjkeoRNZiiPe3T6Gl2Hr8dJWdlQ==" + }, + "node_modules/@octokit/plugin-paginate-rest": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-6.1.2.tgz", + "integrity": "sha512-qhrmtQeHU/IivxucOV1bbI/xZyC/iOBhclokv7Sut5vnejAIAEXVcGQeRpQlU39E0WwK9lNvJHphHri/DB6lbQ==", + "dependencies": { + "@octokit/tsconfig": "^1.0.2", + "@octokit/types": "^9.2.3" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "@octokit/core": ">=4" + } + }, + "node_modules/@octokit/plugin-request-log": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz", + "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==", + "peerDependencies": { + "@octokit/core": ">=3" + } + }, + "node_modules/@octokit/plugin-rest-endpoint-methods": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-7.1.3.tgz", + "integrity": "sha512-0aoPd4f1k/KXPTGSX0NbxcBrShBHArgcW3pujEvLa6wUfcfA1BehxQ2Ifwa6CbJ4SfzaO79FvGgaUipoxDsgjA==", + "dependencies": { + "@octokit/types": "^9.2.3" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "@octokit/core": ">=3" + } + }, + "node_modules/@octokit/request": { + "version": "6.2.5", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.5.tgz", + "integrity": "sha512-z83E8UIlPNaJUsXpjD8E0V5o/5f+vJJNbNcBwVZsX3/vC650U41cOkTLjq4PKk9BYonQGOnx7N17gvLyNjgGcQ==", + "dependencies": { + "@octokit/endpoint": "^7.0.0", + "@octokit/request-error": "^3.0.0", + "@octokit/types": "^9.0.0", + "is-plain-object": "^5.0.0", + "node-fetch": "^2.6.7", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@octokit/request-error": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.3.tgz", + "integrity": "sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==", + "dependencies": { + "@octokit/types": "^9.0.0", + "deprecation": "^2.0.0", + "once": "^1.4.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@octokit/rest": { + "version": "19.0.11", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-19.0.11.tgz", + "integrity": "sha512-m2a9VhaP5/tUw8FwfnW2ICXlXpLPIqxtg3XcAiGMLj/Xhw3RSBfZ8le/466ktO1Gcjr8oXudGnHhxV1TXJgFxw==", + "dependencies": { + "@octokit/core": "^4.2.1", + "@octokit/plugin-paginate-rest": "^6.1.2", + "@octokit/plugin-request-log": "^1.0.4", + "@octokit/plugin-rest-endpoint-methods": "^7.1.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@octokit/tsconfig": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@octokit/tsconfig/-/tsconfig-1.0.2.tgz", + "integrity": "sha512-I0vDR0rdtP8p2lGMzvsJzbhdOWy405HcGovrspJ8RRibHnyRgggUSNO5AIox5LmqiwmatHKYsvj6VGFHkqS7lA==" + }, + "node_modules/@octokit/types": { + "version": "9.2.3", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.2.3.tgz", + "integrity": "sha512-MMeLdHyFIALioycq+LFcA71v0S2xpQUX2cw6pPbHQjaibcHYwLnmK/kMZaWuGfGfjBJZ3wRUq+dOaWsvrPJVvA==", + "dependencies": { + "@octokit/openapi-types": "^17.2.0" + } + }, + "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/@reduxjs/toolkit": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.9.5.tgz", + "integrity": "sha512-Rt97jHmfTeaxL4swLRNPD/zV4OxTes4la07Xc4hetpUW/vc75t5m1ANyxG6ymnEQ2FsLQsoMlYB2vV1sO3m8tQ==", + "dependencies": { + "immer": "^9.0.21", + "redux": "^4.2.1", + "redux-thunk": "^2.4.2", + "reselect": "^4.1.8" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18", + "react-redux": "^7.2.1 || ^8.0.2" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-redux": { + "optional": true + } + } + }, + "node_modules/@remix-run/router": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.6.2.tgz", + "integrity": "sha512-LzqpSrMK/3JBAVBI9u3NWtOhWNw5AMQfrUFYB0+bDHTSw17z++WJLsPsxAuK+oSddsxk4d7F/JcdDPM1M5YAhA==", + "engines": { + "node": ">=14" + } + }, + "node_modules/@swc/core": { + "version": "1.3.62", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.3.62.tgz", + "integrity": "sha512-J58hWY+/G8vOr4J6ZH9hLg0lMSijZtqIIf4HofZezGog/pVX6sJyBJ40dZ1ploFkDIlWTWvJyqtpesBKS73gkQ==", + "hasInstallScript": true, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/swc" + }, + "optionalDependencies": { + "@swc/core-darwin-arm64": "1.3.62", + "@swc/core-darwin-x64": "1.3.62", + "@swc/core-linux-arm-gnueabihf": "1.3.62", + "@swc/core-linux-arm64-gnu": "1.3.62", + "@swc/core-linux-arm64-musl": "1.3.62", + "@swc/core-linux-x64-gnu": "1.3.62", + "@swc/core-linux-x64-musl": "1.3.62", + "@swc/core-win32-arm64-msvc": "1.3.62", + "@swc/core-win32-ia32-msvc": "1.3.62", + "@swc/core-win32-x64-msvc": "1.3.62" + }, + "peerDependencies": { + "@swc/helpers": "^0.5.0" + }, + "peerDependenciesMeta": { + "@swc/helpers": { + "optional": true + } + } + }, + "node_modules/@swc/core-darwin-arm64": { + "version": "1.3.62", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.62.tgz", + "integrity": "sha512-MmGilibITz68LEje6vJlKzc2gUUSgzvB3wGLSjEORikTNeM7P8jXVxE4A8fgZqDeudJUm9HVWrxCV+pHDSwXhA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-darwin-x64": { + "version": "1.3.62", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.3.62.tgz", + "integrity": "sha512-Xl93MMB3sCWVlYWuQIB+v6EQgzoiuQYK5tNt9lsHoIEVu2zLdkQjae+5FUHZb1VYqCXIiWcULFfVz0R4Sjb7JQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm-gnueabihf": { + "version": "1.3.62", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.62.tgz", + "integrity": "sha512-nJsp6O7kCtAjTTMcIjVB0g5y1JNiYAa5q630eiwrnaHUusEFoANDdORI3Z9vXeikMkng+6yIv9/V8Rb093xLjQ==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-gnu": { + "version": "1.3.62", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.62.tgz", + "integrity": "sha512-XGsV93vpUAopDt5y6vPwbK1Nc/MlL55L77bAZUPIiosWD1cWWPHNtNSpriE6+I+JiMHe0pqtfS/SSTk6ZkFQVw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-musl": { + "version": "1.3.62", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.62.tgz", + "integrity": "sha512-ESUmJjSlTTkoBy9dMG49opcNn8BmviqStMhwyeD1G8XRnmRVCZZgoBOKdvCXmJhw8bQXDhZumeaTUB+OFUKVXg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-gnu": { + "version": "1.3.62", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.62.tgz", + "integrity": "sha512-wnHJkt3ZBrax3SFnUHDcncG6mrSg9ZZjMhQV9Mc3JL1x1s1Gy9rGZCoBNnV/BUZWTemxIBcQbANRSDut/WO+9A==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-musl": { + "version": "1.3.62", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.62.tgz", + "integrity": "sha512-9oRbuTC/VshB66Rgwi3pTq3sPxSTIb8k9L1vJjES+dDMKa29DAjPtWCXG/pyZ00ufpFZgkGEuAHH5uqUcr1JQg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-arm64-msvc": { + "version": "1.3.62", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.62.tgz", + "integrity": "sha512-zv14vlF2VRrxS061XkfzGjCYnOrEo5glKJjLK5PwUKysIoVrx/L8nAbFxjkX5cObdlyoqo+ekelyBPAO+4bS0w==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-ia32-msvc": { + "version": "1.3.62", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.62.tgz", + "integrity": "sha512-8MC/PZQSsOP2iA/81tAfNRqMWyEqTS/8zKUI67vPuLvpx6NAjRn3E9qBv7iFqH79iqZNzqSMo3awnLrKZyFbcw==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-x64-msvc": { + "version": "1.3.62", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.62.tgz", + "integrity": "sha512-GJSmUJ95HKHZXAxiuPUmrcm/S3ivQvEzXhOZaIqYBIwUsm02vFZkClsV7eIKzWjso1t0+I/8MjrnUNaSWqh1rQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@types/hoist-non-react-statics": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", + "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==", + "dependencies": { + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.2.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.2.5.tgz", + "integrity": "sha512-JJulVEQXmiY9Px5axXHeYGLSjhkZEnD+MDPDGbCbIAbMslkKwmygtZFy1X6s/075Yo94sf8GuSlFfPzysQrWZQ==", + "devOptional": true + }, + "node_modules/@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" + }, + "node_modules/@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" + }, + "node_modules/@types/react": { + "version": "18.2.7", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.7.tgz", + "integrity": "sha512-ojrXpSH2XFCmHm7Jy3q44nXDyN54+EYKP2lBhJ2bqfyPj6cIUW/FZW/Csdia34NQgq7KYcAlHi5184m4X88+yw==", + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.2.4", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.4.tgz", + "integrity": "sha512-G2mHoTMTL4yoydITgOGwWdWMVd8sNgyEP85xVmMKAPUBwQWm9wBPQUmvbeF4V3WBY1P7mmL4BkjQ0SqUpf1snw==", + "devOptional": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/@types/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-1vz2yObaQkLL7YFe/pme2cpvDsCwI1WXIfL+5eLz0MI9gFG24Re16RzUsI8t9XZn9ZWvgLNDrJBmrqXJO7GNQQ==", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-transition-group": { + "version": "4.4.6", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.6.tgz", + "integrity": "sha512-VnCdSxfcm08KjsJVQcfBmhEQAPnLB8G08hAxn39azX1qYBQ/5RVQuoHuKIcfKOdncuaUvEpFKFzEvbtIMsfVew==", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/redux-promise": { + "version": "0.5.29", + "resolved": "https://registry.npmjs.org/@types/redux-promise/-/redux-promise-0.5.29.tgz", + "integrity": "sha512-lCBCTiJCweYtW5YgOIAG400dAi2Cr2IW6mfh1eZ8WqgxTRqPZjLAFQzxQ6oRZaB9g8mdzr28vOc3CAo8y/Na2w==", + "dev": true, + "dependencies": { + "redux": "^3.6.0" + } + }, + "node_modules/@types/redux-promise/node_modules/redux": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/redux/-/redux-3.7.2.tgz", + "integrity": "sha512-pNqnf9q1hI5HHZRBkj3bAngGZW/JMCmexDlOxw4XagXY2o1327nHH54LoTjiPJ0gizoqPDRqWyX/00g0hD6w+A==", + "dev": true, + "dependencies": { + "lodash": "^4.2.1", + "lodash-es": "^4.2.1", + "loose-envify": "^1.1.0", + "symbol-observable": "^1.0.3" + } + }, + "node_modules/@types/scheduler": { + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", + "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==" + }, + "node_modules/@types/semver": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", + "dev": true + }, + "node_modules/@types/use-sync-external-store": { + "version": "0.0.3", + "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/@typescript-eslint/eslint-plugin": { + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.8.tgz", + "integrity": "sha512-JDMOmhXteJ4WVKOiHXGCoB96ADWg9q7efPWHRViT/f09bA8XOMLAVHHju3l0MkZnG1izaWXYmgvQcUjTRcpShQ==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.59.8", + "@typescript-eslint/type-utils": "5.59.8", + "@typescript-eslint/utils": "5.59.8", + "debug": "^4.3.4", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.8.tgz", + "integrity": "sha512-AnR19RjJcpjoeGojmwZtCwBX/RidqDZtzcbG3xHrmz0aHHoOcbWnpDllenRDmDvsV0RQ6+tbb09/kyc+UT9Orw==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.59.8", + "@typescript-eslint/types": "5.59.8", + "@typescript-eslint/typescript-estree": "5.59.8", + "debug": "^4.3.4" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.8.tgz", + "integrity": "sha512-/w08ndCYI8gxGf+9zKf1vtx/16y8MHrZs5/tnjHhMLNSixuNcJavSX4wAiPf4aS5x41Es9YPCn44MIe4cxIlig==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.59.8", + "@typescript-eslint/visitor-keys": "5.59.8" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.8.tgz", + "integrity": "sha512-+5M518uEIHFBy3FnyqZUF3BMP+AXnYn4oyH8RF012+e7/msMY98FhGL5SrN29NQ9xDgvqCgYnsOiKp1VjZ/fpA==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "5.59.8", + "@typescript-eslint/utils": "5.59.8", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.8.tgz", + "integrity": "sha512-+uWuOhBTj/L6awoWIg0BlWy0u9TyFpCHrAuQ5bNfxDaZ1Ppb3mx6tUigc74LHcbHpOHuOTOJrBoAnhdHdaea1w==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.8.tgz", + "integrity": "sha512-Jy/lPSDJGNow14vYu6IrW790p7HIf/SOV1Bb6lZ7NUkLc2iB2Z9elESmsaUtLw8kVqogSbtLH9tut5GCX1RLDg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.59.8", + "@typescript-eslint/visitor-keys": "5.59.8", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.8.tgz", + "integrity": "sha512-Tr65630KysnNn9f9G7ROF3w1b5/7f6QVCJ+WK9nhIocWmx9F+TmCAcglF26Vm7z8KCTwoKcNEBZrhlklla3CKg==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.59.8", + "@typescript-eslint/types": "5.59.8", + "@typescript-eslint/typescript-estree": "5.59.8", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.8.tgz", + "integrity": "sha512-pJhi2ms0x0xgloT7xYabil3SGGlojNNKjK/q6dB3Ey0uJLMjK2UDGJvHieiyJVW/7C3KI+Z4Q3pEHkm4ejA+xQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.59.8", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@vitejs/plugin-react-swc": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-3.3.2.tgz", + "integrity": "sha512-VJFWY5sfoZerQRvJrh518h3AcQt6f/yTuWn4/TRB+dqmYU0NX1qz7qM5Wfd+gOQqUzQW4gxKqKN3KpE/P3+zrA==", + "dependencies": { + "@swc/core": "^1.3.61" + }, + "peerDependencies": { + "vite": "^4" + } + }, + "node_modules/acorn": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/axios": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz", + "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==", + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/before-after-hook": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", + "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==" + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "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/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/deprecation": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", + "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==" + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "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/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/esbuild": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", + "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.17.19", + "@esbuild/android-arm64": "0.17.19", + "@esbuild/android-x64": "0.17.19", + "@esbuild/darwin-arm64": "0.17.19", + "@esbuild/darwin-x64": "0.17.19", + "@esbuild/freebsd-arm64": "0.17.19", + "@esbuild/freebsd-x64": "0.17.19", + "@esbuild/linux-arm": "0.17.19", + "@esbuild/linux-arm64": "0.17.19", + "@esbuild/linux-ia32": "0.17.19", + "@esbuild/linux-loong64": "0.17.19", + "@esbuild/linux-mips64el": "0.17.19", + "@esbuild/linux-ppc64": "0.17.19", + "@esbuild/linux-riscv64": "0.17.19", + "@esbuild/linux-s390x": "0.17.19", + "@esbuild/linux-x64": "0.17.19", + "@esbuild/netbsd-x64": "0.17.19", + "@esbuild/openbsd-x64": "0.17.19", + "@esbuild/sunos-x64": "0.17.19", + "@esbuild/win32-arm64": "0.17.19", + "@esbuild/win32-ia32": "0.17.19", + "@esbuild/win32-x64": "0.17.19" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint": { + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.41.0.tgz", + "integrity": "sha512-WQDQpzGBOP5IrXPo4Hc0814r4/v2rrIsB0rhT7jtunIalgg6gYXWhRMOejVO8yH21T/FGaxjmFjBMNqcIlmH1Q==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.0.3", + "@eslint/js": "8.41.0", + "@humanwhocodes/config-array": "^0.11.8", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.0", + "eslint-visitor-keys": "^3.4.1", + "espree": "^9.5.2", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", + "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "dev": true, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.3.5.tgz", + "integrity": "sha512-61qNIsc7fo9Pp/mju0J83kzvLm0Bsayu7OQSLEoJxLDCBjIIyb87bkzufoOvdDxLkSlMfkF7UxomC4+eztUBSA==", + "dev": true, + "peerDependencies": { + "eslint": ">=7" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/eslint/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==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", + "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/espree": { + "version": "9.5.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz", + "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==", + "dev": true, + "dependencies": { + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, + "node_modules/flux-standard-action": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/flux-standard-action/-/flux-standard-action-2.1.2.tgz", + "integrity": "sha512-7vdgawlphCjzaMLdpZv8hlGC/FJCXu6sqE3Wuqe3HLZ22KcDiO4IFplxLDePDhEt6hgCrugt45RoUObuzZP6Kg==", + "dependencies": { + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "dev": true + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hoist-non-react-statics/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/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/immer": { + "version": "9.0.21", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", + "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "node_modules/immutable": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.0.tgz", + "integrity": "sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==" + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "dev": true + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true + }, + "node_modules/node-fetch": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz", + "integrity": "sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.4.24", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.24.tgz", + "integrity": "sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "peer": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "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", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "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/react-redux": { + "version": "8.0.7", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-8.0.7.tgz", + "integrity": "sha512-1vRQuCQI5Y2uNmrMXg81RXKiBHY3jBzvCvNmZF437O/Z9/pZ+ba2uYHbemYXb3g8rjsacBGo+/wmfrQKzMhJsg==", + "dependencies": { + "@babel/runtime": "^7.12.1", + "@types/hoist-non-react-statics": "^3.3.1", + "@types/use-sync-external-store": "^0.0.3", + "hoist-non-react-statics": "^3.3.2", + "react-is": "^18.0.0", + "use-sync-external-store": "^1.0.0" + }, + "peerDependencies": { + "@reduxjs/toolkit": "^1 || ^2.0.0-beta.0", + "@types/react": "^16.8 || ^17.0 || ^18.0", + "@types/react-dom": "^16.8 || ^17.0 || ^18.0", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0", + "react-native": ">=0.59", + "redux": "^4 || ^5.0.0-beta.0" + }, + "peerDependenciesMeta": { + "@reduxjs/toolkit": { + "optional": true + }, + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + }, + "redux": { + "optional": true + } + } + }, + "node_modules/react-router": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.11.2.tgz", + "integrity": "sha512-74z9xUSaSX07t3LM+pS6Un0T55ibUE/79CzfZpy5wsPDZaea1F8QkrsiyRnA2YQ7LwE/umaydzXZV80iDCPkMg==", + "dependencies": { + "@remix-run/router": "1.6.2" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.11.2.tgz", + "integrity": "sha512-JNbKtAeh1VSJQnH6RvBDNhxNwemRj7KxCzc5jb7zvDSKRnPWIFj9pO+eXqjM69gQJ0r46hSz1x4l9y0651DKWw==", + "dependencies": { + "@remix-run/router": "1.6.2", + "react-router": "6.11.2" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "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/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/redux": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", + "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", + "dependencies": { + "@babel/runtime": "^7.9.2" + } + }, + "node_modules/redux-promise": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/redux-promise/-/redux-promise-0.6.0.tgz", + "integrity": "sha512-R2mGxJbPFgXyCNbFDE6LjTZhCEuACF54g1bxld3nqBhnRMX0OsUyWk77moF7UMGkUdl5WOAwc4BC5jOd1dunqQ==", + "dependencies": { + "flux-standard-action": "^2.0.3", + "is-promise": "^2.1.0" + } + }, + "node_modules/redux-thunk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.2.tgz", + "integrity": "sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q==", + "peerDependencies": { + "redux": "^4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + }, + "node_modules/reselect": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.8.tgz", + "integrity": "sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==" + }, + "node_modules/resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "dependencies": { + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.23.0.tgz", + "integrity": "sha512-h31UlwEi7FHihLe1zbk+3Q7z1k/84rb9BSwmBSr/XjOCEaBJ2YyedQDuM0t/kfOS0IxM+vk1/zI9XxYj9V+NJQ==", + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/sass": { + "version": "1.62.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.62.1.tgz", + "integrity": "sha512-NHpxIzN29MXvWiuswfc1W3I0N8SXBd8UR26WntmDlRYf0bSADnwnOjsyMZ3lMezSlArD33Vs3YFhp7dWvL770A==", + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/symbol-observable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", + "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", + "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=12.20" + } + }, + "node_modules/universal-user-agent": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", + "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==" + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/use-sync-external-store": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", + "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/vite": { + "version": "4.3.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.3.9.tgz", + "integrity": "sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==", + "dependencies": { + "esbuild": "^0.17.5", + "postcss": "^8.4.23", + "rollup": "^3.21.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-plugin-mkcert": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/vite-plugin-mkcert/-/vite-plugin-mkcert-1.15.0.tgz", + "integrity": "sha512-0Pz7iExvo7pS2HsxMe6Y/HIrsFJidXN8Sju7tsL1XYQdbUKb/D0L5Wkj3UoGQmbbWZUFf8nHHa0XYbd4FH6ZrA==", + "dependencies": { + "@octokit/rest": "^19.0.5", + "axios": "^1.2.2", + "debug": "^4.3.4", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=v16.7.0" + }, + "peerDependencies": { + "vite": ">=3" + } + }, + "node_modules/vite-plugin-sass-dts": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/vite-plugin-sass-dts/-/vite-plugin-sass-dts-1.3.5.tgz", + "integrity": "sha512-yGm5uRTDq1qc17ZMJV0bQRgxNfw2a/Ejqc/T2NOILXmcR1z9zHpqqo1FwoDddyTV87GDQZYldqKZOE4O5bGBOw==", + "dependencies": { + "postcss-js": "^4.0.1" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "postcss": "^8", + "prettier": "^2.7", + "sass": "*", + "vite": "^3 || ^4" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", + "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", + "requires": { + "@babel/highlight": "^7.18.6" + } + }, + "@babel/helper-module-imports": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz", + "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==", + "requires": { + "@babel/types": "^7.21.4" + } + }, + "@babel/helper-string-parser": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.21.5.tgz", + "integrity": "sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w==" + }, + "@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==" + }, + "@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "requires": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/runtime": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.3.tgz", + "integrity": "sha512-XsDuspWKLUsxwCp6r7EhsExHtYfbe5oAGQ19kqngTdCPUoPQzOPdUbD/pB9PJiwb2ptYKQDjSJT3R6dC+EPqfQ==", + "requires": { + "regenerator-runtime": "^0.13.11" + } + }, + "@babel/types": { + "version": "7.22.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.4.tgz", + "integrity": "sha512-Tx9x3UBHTTsMSW85WB2kphxYQVvrZ/t1FxD88IpSgIjiUJlCm9z+xWIDwyo1vffTwSqteqyznB8ZE9vYYk16zA==", + "requires": { + "@babel/helper-string-parser": "^7.21.5", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + } + }, + "@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": { + "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==" + } + } + }, + "@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" + } + }, + "@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", + "integrity": "sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==", + "requires": { + "@emotion/memoize": "^0.8.1" + } + }, + "@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" + }, + "@emotion/react": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.0.tgz", + "integrity": "sha512-ZSK3ZJsNkwfjT3JpDAWJZlrGD81Z3ytNDsxw1LKq1o+xkmO5pnWfr6gmCC8gHEFf3nSSX/09YrG67jybNPxSUw==", + "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==" + }, + "@esbuild/android-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", + "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", + "optional": true + }, + "@esbuild/android-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", + "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", + "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", + "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", + "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", + "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", + "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", + "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", + "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", + "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", + "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", + "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", + "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", + "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", + "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", + "optional": true + }, + "@esbuild/linux-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", + "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", + "optional": true + }, + "@esbuild/netbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", + "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", + "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", + "optional": true + }, + "@esbuild/sunos-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", + "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", + "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", + "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", + "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", + "optional": true + }, + "@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^3.3.0" + } + }, + "@eslint-community/regexpp": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz", + "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==", + "dev": true + }, + "@eslint/eslintrc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz", + "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.5.2", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + } + } + }, + "@eslint/js": { + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.41.0.tgz", + "integrity": "sha512-LxcyMGxwmTh2lY9FwHPGWOHmYFCZvbrFCBZL4FzSSsxsRPuhrYUg/49/0KDfW8tnIEaEHtfmn6+NPN+1DqaNmA==", + "dev": true + }, + "@fortawesome/fontawesome-common-types": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.4.0.tgz", + "integrity": "sha512-HNii132xfomg5QVZw0HwXXpN22s7VBHQBv9CeOu9tfJnhsWQNd2lmTNi8CSrnw5B+5YOmzu1UoPAyxaXsJ6RgQ==" + }, + "@fortawesome/fontawesome-free": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-6.4.0.tgz", + "integrity": "sha512-0NyytTlPJwB/BF5LtRV8rrABDbe3TdTXqNB3PdZ+UUUZAEIrdOJdmABqKjt4AXwIoJNaRVVZEXxpNrqvE1GAYQ==" + }, + "@fortawesome/fontawesome-svg-core": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.4.0.tgz", + "integrity": "sha512-Bertv8xOiVELz5raB2FlXDPKt+m94MQ3JgDfsVbrqNpLU9+UE2E18GKjLKw+d3XbeYPqg1pzyQKGsrzbw+pPaw==", + "peer": true, + "requires": { + "@fortawesome/fontawesome-common-types": "6.4.0" + } + }, + "@fortawesome/free-brands-svg-icons": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-6.4.0.tgz", + "integrity": "sha512-qvxTCo0FQ5k2N+VCXb/PZQ+QMhqRVM4OORiO6MXdG6bKolIojGU/srQ1ptvKk0JTbRgaJOfL2qMqGvBEZG7Z6g==", + "requires": { + "@fortawesome/fontawesome-common-types": "6.4.0" + } + }, + "@fortawesome/free-regular-svg-icons": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-6.4.0.tgz", + "integrity": "sha512-ZfycI7D0KWPZtf7wtMFnQxs8qjBXArRzczABuMQqecA/nXohquJ5J/RCR77PmY5qGWkxAZDxpnUFVXKwtY/jPw==", + "requires": { + "@fortawesome/fontawesome-common-types": "6.4.0" + } + }, + "@fortawesome/free-solid-svg-icons": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.4.0.tgz", + "integrity": "sha512-kutPeRGWm8V5dltFP1zGjQOEAzaLZj4StdQhWVZnfGFCvAPVvHh8qk5bRrU4KXnRRRNni5tKQI9PBAdI6MP8nQ==", + "requires": { + "@fortawesome/fontawesome-common-types": "6.4.0" + } + }, + "@fortawesome/react-fontawesome": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.2.0.tgz", + "integrity": "sha512-uHg75Rb/XORTtVt7OS9WoK8uM276Ufi7gCzshVWkUJbHhh3svsUUeqXerrM96Wm7fRiDzfKRwSoahhMIkGAYHw==", + "requires": { + "prop-types": "^15.8.1" + } + }, + "@humanwhocodes/config-array": { + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", + "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + } + }, + "@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true + }, + "@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "@mui/base": { + "version": "5.0.0-beta.4", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.4.tgz", + "integrity": "sha512-ejhtqYJpjDgHGEljjMBQWZ22yEK0OzIXNa7toJmmXsP4TT3W7xVy8bTJ0TniPDf+JNjrsgfgiFTDGdlEhV1E+g==", + "requires": { + "@babel/runtime": "^7.21.0", + "@emotion/is-prop-valid": "^1.2.1", + "@mui/types": "^7.2.4", + "@mui/utils": "^5.13.1", + "@popperjs/core": "^2.11.8", + "clsx": "^1.2.1", + "prop-types": "^15.8.1", + "react-is": "^18.2.0" + } + }, + "@mui/core-downloads-tracker": { + "version": "5.13.4", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.13.4.tgz", + "integrity": "sha512-yFrMWcrlI0TqRN5jpb6Ma9iI7sGTHpytdzzL33oskFHNQ8UgrtPas33Y1K7sWAMwCrr1qbWDrOHLAQG4tAzuSw==" + }, + "@mui/material": { + "version": "5.13.4", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.13.4.tgz", + "integrity": "sha512-Yq+4f1KLPa/Szd3xqra2hbOAf2Usl8GbubncArM6LIp40mBLtXIdPE29MNtHsbtuzz4g+eidrETgoi3wdbEYfQ==", + "requires": { + "@babel/runtime": "^7.21.0", + "@mui/base": "5.0.0-beta.4", + "@mui/core-downloads-tracker": "^5.13.4", + "@mui/system": "^5.13.2", + "@mui/types": "^7.2.4", + "@mui/utils": "^5.13.1", + "@types/react-transition-group": "^4.4.6", + "clsx": "^1.2.1", + "csstype": "^3.1.2", + "prop-types": "^15.8.1", + "react-is": "^18.2.0", + "react-transition-group": "^4.4.5" + } + }, + "@mui/private-theming": { + "version": "5.13.1", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.13.1.tgz", + "integrity": "sha512-HW4npLUD9BAkVppOUZHeO1FOKUJWAwbpy0VQoGe3McUYTlck1HezGHQCfBQ5S/Nszi7EViqiimECVl9xi+/WjQ==", + "requires": { + "@babel/runtime": "^7.21.0", + "@mui/utils": "^5.13.1", + "prop-types": "^15.8.1" + } + }, + "@mui/styled-engine": { + "version": "5.13.2", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.13.2.tgz", + "integrity": "sha512-VCYCU6xVtXOrIN8lcbuPmoG+u7FYuOERG++fpY74hPpEWkyFQG97F+/XfTQVYzlR2m7nPjnwVUgATcTCMEaMvw==", + "requires": { + "@babel/runtime": "^7.21.0", + "@emotion/cache": "^11.11.0", + "csstype": "^3.1.2", + "prop-types": "^15.8.1" + } + }, + "@mui/system": { + "version": "5.13.2", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.13.2.tgz", + "integrity": "sha512-TPyWmRJPt0JPVxacZISI4o070xEJ7ftxpVtu6LWuYVOUOINlhoGOclam4iV8PDT3EMQEHuUrwU49po34UdWLlw==", + "requires": { + "@babel/runtime": "^7.21.0", + "@mui/private-theming": "^5.13.1", + "@mui/styled-engine": "^5.13.2", + "@mui/types": "^7.2.4", + "@mui/utils": "^5.13.1", + "clsx": "^1.2.1", + "csstype": "^3.1.2", + "prop-types": "^15.8.1" + } + }, + "@mui/types": { + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.4.tgz", + "integrity": "sha512-LBcwa8rN84bKF+f5sDyku42w1NTxaPgPyYKODsh01U1fVstTClbUoSA96oyRBnSNyEiAVjKm6Gwx9vjR+xyqHA==", + "requires": {} + }, + "@mui/utils": { + "version": "5.13.1", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.13.1.tgz", + "integrity": "sha512-6lXdWwmlUbEU2jUI8blw38Kt+3ly7xkmV9ljzY4Q20WhsJMWiNry9CX8M+TaP/HbtuyR8XKsdMgQW7h7MM3n3A==", + "requires": { + "@babel/runtime": "^7.21.0", + "@types/prop-types": "^15.7.5", + "@types/react-is": "^18.2.0", + "prop-types": "^15.8.1", + "react-is": "^18.2.0" + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@octokit/auth-token": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.4.tgz", + "integrity": "sha512-TWFX7cZF2LXoCvdmJWY7XVPi74aSY0+FfBZNSXEXFkMpjcqsQwDSYVv5FhRFaI0V1ECnwbz4j59T/G+rXNWaIQ==" + }, + "@octokit/core": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.2.1.tgz", + "integrity": "sha512-tEDxFx8E38zF3gT7sSMDrT1tGumDgsw5yPG6BBh/X+5ClIQfMH/Yqocxz1PnHx6CHyF6pxmovUTOfZAUvQ0Lvw==", + "requires": { + "@octokit/auth-token": "^3.0.0", + "@octokit/graphql": "^5.0.0", + "@octokit/request": "^6.0.0", + "@octokit/request-error": "^3.0.0", + "@octokit/types": "^9.0.0", + "before-after-hook": "^2.2.0", + "universal-user-agent": "^6.0.0" + } + }, + "@octokit/endpoint": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.5.tgz", + "integrity": "sha512-LG4o4HMY1Xoaec87IqQ41TQ+glvIeTKqfjkCEmt5AIwDZJwQeVZFIEYXrYY6yLwK+pAScb9Gj4q+Nz2qSw1roA==", + "requires": { + "@octokit/types": "^9.0.0", + "is-plain-object": "^5.0.0", + "universal-user-agent": "^6.0.0" + } + }, + "@octokit/graphql": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.6.tgz", + "integrity": "sha512-Fxyxdy/JH0MnIB5h+UQ3yCoh1FG4kWXfFKkpWqjZHw/p+Kc8Y44Hu/kCgNBT6nU1shNumEchmW/sUO1JuQnPcw==", + "requires": { + "@octokit/request": "^6.0.0", + "@octokit/types": "^9.0.0", + "universal-user-agent": "^6.0.0" + } + }, + "@octokit/openapi-types": { + "version": "17.2.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-17.2.0.tgz", + "integrity": "sha512-MazrFNx4plbLsGl+LFesMo96eIXkFgEtaKbnNpdh4aQ0VM10aoylFsTYP1AEjkeoRNZiiPe3T6Gl2Hr8dJWdlQ==" + }, + "@octokit/plugin-paginate-rest": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-6.1.2.tgz", + "integrity": "sha512-qhrmtQeHU/IivxucOV1bbI/xZyC/iOBhclokv7Sut5vnejAIAEXVcGQeRpQlU39E0WwK9lNvJHphHri/DB6lbQ==", + "requires": { + "@octokit/tsconfig": "^1.0.2", + "@octokit/types": "^9.2.3" + } + }, + "@octokit/plugin-request-log": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz", + "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==", + "requires": {} + }, + "@octokit/plugin-rest-endpoint-methods": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-7.1.3.tgz", + "integrity": "sha512-0aoPd4f1k/KXPTGSX0NbxcBrShBHArgcW3pujEvLa6wUfcfA1BehxQ2Ifwa6CbJ4SfzaO79FvGgaUipoxDsgjA==", + "requires": { + "@octokit/types": "^9.2.3" + } + }, + "@octokit/request": { + "version": "6.2.5", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.5.tgz", + "integrity": "sha512-z83E8UIlPNaJUsXpjD8E0V5o/5f+vJJNbNcBwVZsX3/vC650U41cOkTLjq4PKk9BYonQGOnx7N17gvLyNjgGcQ==", + "requires": { + "@octokit/endpoint": "^7.0.0", + "@octokit/request-error": "^3.0.0", + "@octokit/types": "^9.0.0", + "is-plain-object": "^5.0.0", + "node-fetch": "^2.6.7", + "universal-user-agent": "^6.0.0" + } + }, + "@octokit/request-error": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.3.tgz", + "integrity": "sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==", + "requires": { + "@octokit/types": "^9.0.0", + "deprecation": "^2.0.0", + "once": "^1.4.0" + } + }, + "@octokit/rest": { + "version": "19.0.11", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-19.0.11.tgz", + "integrity": "sha512-m2a9VhaP5/tUw8FwfnW2ICXlXpLPIqxtg3XcAiGMLj/Xhw3RSBfZ8le/466ktO1Gcjr8oXudGnHhxV1TXJgFxw==", + "requires": { + "@octokit/core": "^4.2.1", + "@octokit/plugin-paginate-rest": "^6.1.2", + "@octokit/plugin-request-log": "^1.0.4", + "@octokit/plugin-rest-endpoint-methods": "^7.1.2" + } + }, + "@octokit/tsconfig": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@octokit/tsconfig/-/tsconfig-1.0.2.tgz", + "integrity": "sha512-I0vDR0rdtP8p2lGMzvsJzbhdOWy405HcGovrspJ8RRibHnyRgggUSNO5AIox5LmqiwmatHKYsvj6VGFHkqS7lA==" + }, + "@octokit/types": { + "version": "9.2.3", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.2.3.tgz", + "integrity": "sha512-MMeLdHyFIALioycq+LFcA71v0S2xpQUX2cw6pPbHQjaibcHYwLnmK/kMZaWuGfGfjBJZ3wRUq+dOaWsvrPJVvA==", + "requires": { + "@octokit/openapi-types": "^17.2.0" + } + }, + "@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==" + }, + "@reduxjs/toolkit": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.9.5.tgz", + "integrity": "sha512-Rt97jHmfTeaxL4swLRNPD/zV4OxTes4la07Xc4hetpUW/vc75t5m1ANyxG6ymnEQ2FsLQsoMlYB2vV1sO3m8tQ==", + "requires": { + "immer": "^9.0.21", + "redux": "^4.2.1", + "redux-thunk": "^2.4.2", + "reselect": "^4.1.8" + } + }, + "@remix-run/router": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.6.2.tgz", + "integrity": "sha512-LzqpSrMK/3JBAVBI9u3NWtOhWNw5AMQfrUFYB0+bDHTSw17z++WJLsPsxAuK+oSddsxk4d7F/JcdDPM1M5YAhA==" + }, + "@swc/core": { + "version": "1.3.62", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.3.62.tgz", + "integrity": "sha512-J58hWY+/G8vOr4J6ZH9hLg0lMSijZtqIIf4HofZezGog/pVX6sJyBJ40dZ1ploFkDIlWTWvJyqtpesBKS73gkQ==", + "requires": { + "@swc/core-darwin-arm64": "1.3.62", + "@swc/core-darwin-x64": "1.3.62", + "@swc/core-linux-arm-gnueabihf": "1.3.62", + "@swc/core-linux-arm64-gnu": "1.3.62", + "@swc/core-linux-arm64-musl": "1.3.62", + "@swc/core-linux-x64-gnu": "1.3.62", + "@swc/core-linux-x64-musl": "1.3.62", + "@swc/core-win32-arm64-msvc": "1.3.62", + "@swc/core-win32-ia32-msvc": "1.3.62", + "@swc/core-win32-x64-msvc": "1.3.62" + } + }, + "@swc/core-darwin-arm64": { + "version": "1.3.62", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.62.tgz", + "integrity": "sha512-MmGilibITz68LEje6vJlKzc2gUUSgzvB3wGLSjEORikTNeM7P8jXVxE4A8fgZqDeudJUm9HVWrxCV+pHDSwXhA==", + "optional": true + }, + "@swc/core-darwin-x64": { + "version": "1.3.62", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.3.62.tgz", + "integrity": "sha512-Xl93MMB3sCWVlYWuQIB+v6EQgzoiuQYK5tNt9lsHoIEVu2zLdkQjae+5FUHZb1VYqCXIiWcULFfVz0R4Sjb7JQ==", + "optional": true + }, + "@swc/core-linux-arm-gnueabihf": { + "version": "1.3.62", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.62.tgz", + "integrity": "sha512-nJsp6O7kCtAjTTMcIjVB0g5y1JNiYAa5q630eiwrnaHUusEFoANDdORI3Z9vXeikMkng+6yIv9/V8Rb093xLjQ==", + "optional": true + }, + "@swc/core-linux-arm64-gnu": { + "version": "1.3.62", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.62.tgz", + "integrity": "sha512-XGsV93vpUAopDt5y6vPwbK1Nc/MlL55L77bAZUPIiosWD1cWWPHNtNSpriE6+I+JiMHe0pqtfS/SSTk6ZkFQVw==", + "optional": true + }, + "@swc/core-linux-arm64-musl": { + "version": "1.3.62", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.62.tgz", + "integrity": "sha512-ESUmJjSlTTkoBy9dMG49opcNn8BmviqStMhwyeD1G8XRnmRVCZZgoBOKdvCXmJhw8bQXDhZumeaTUB+OFUKVXg==", + "optional": true + }, + "@swc/core-linux-x64-gnu": { + "version": "1.3.62", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.62.tgz", + "integrity": "sha512-wnHJkt3ZBrax3SFnUHDcncG6mrSg9ZZjMhQV9Mc3JL1x1s1Gy9rGZCoBNnV/BUZWTemxIBcQbANRSDut/WO+9A==", + "optional": true + }, + "@swc/core-linux-x64-musl": { + "version": "1.3.62", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.62.tgz", + "integrity": "sha512-9oRbuTC/VshB66Rgwi3pTq3sPxSTIb8k9L1vJjES+dDMKa29DAjPtWCXG/pyZ00ufpFZgkGEuAHH5uqUcr1JQg==", + "optional": true + }, + "@swc/core-win32-arm64-msvc": { + "version": "1.3.62", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.62.tgz", + "integrity": "sha512-zv14vlF2VRrxS061XkfzGjCYnOrEo5glKJjLK5PwUKysIoVrx/L8nAbFxjkX5cObdlyoqo+ekelyBPAO+4bS0w==", + "optional": true + }, + "@swc/core-win32-ia32-msvc": { + "version": "1.3.62", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.62.tgz", + "integrity": "sha512-8MC/PZQSsOP2iA/81tAfNRqMWyEqTS/8zKUI67vPuLvpx6NAjRn3E9qBv7iFqH79iqZNzqSMo3awnLrKZyFbcw==", + "optional": true + }, + "@swc/core-win32-x64-msvc": { + "version": "1.3.62", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.62.tgz", + "integrity": "sha512-GJSmUJ95HKHZXAxiuPUmrcm/S3ivQvEzXhOZaIqYBIwUsm02vFZkClsV7eIKzWjso1t0+I/8MjrnUNaSWqh1rQ==", + "optional": true + }, + "@types/hoist-non-react-statics": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", + "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==", + "requires": { + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0" + } + }, + "@types/json-schema": { + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "dev": true + }, + "@types/node": { + "version": "20.2.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.2.5.tgz", + "integrity": "sha512-JJulVEQXmiY9Px5axXHeYGLSjhkZEnD+MDPDGbCbIAbMslkKwmygtZFy1X6s/075Yo94sf8GuSlFfPzysQrWZQ==", + "devOptional": true + }, + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" + }, + "@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" + }, + "@types/react": { + "version": "18.2.7", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.7.tgz", + "integrity": "sha512-ojrXpSH2XFCmHm7Jy3q44nXDyN54+EYKP2lBhJ2bqfyPj6cIUW/FZW/Csdia34NQgq7KYcAlHi5184m4X88+yw==", + "requires": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "@types/react-dom": { + "version": "18.2.4", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.4.tgz", + "integrity": "sha512-G2mHoTMTL4yoydITgOGwWdWMVd8sNgyEP85xVmMKAPUBwQWm9wBPQUmvbeF4V3WBY1P7mmL4BkjQ0SqUpf1snw==", + "devOptional": true, + "requires": { + "@types/react": "*" + } + }, + "@types/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/@types/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-1vz2yObaQkLL7YFe/pme2cpvDsCwI1WXIfL+5eLz0MI9gFG24Re16RzUsI8t9XZn9ZWvgLNDrJBmrqXJO7GNQQ==", + "requires": { + "@types/react": "*" + } + }, + "@types/react-transition-group": { + "version": "4.4.6", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.6.tgz", + "integrity": "sha512-VnCdSxfcm08KjsJVQcfBmhEQAPnLB8G08hAxn39azX1qYBQ/5RVQuoHuKIcfKOdncuaUvEpFKFzEvbtIMsfVew==", + "requires": { + "@types/react": "*" + } + }, + "@types/redux-promise": { + "version": "0.5.29", + "resolved": "https://registry.npmjs.org/@types/redux-promise/-/redux-promise-0.5.29.tgz", + "integrity": "sha512-lCBCTiJCweYtW5YgOIAG400dAi2Cr2IW6mfh1eZ8WqgxTRqPZjLAFQzxQ6oRZaB9g8mdzr28vOc3CAo8y/Na2w==", + "dev": true, + "requires": { + "redux": "^3.6.0" + }, + "dependencies": { + "redux": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/redux/-/redux-3.7.2.tgz", + "integrity": "sha512-pNqnf9q1hI5HHZRBkj3bAngGZW/JMCmexDlOxw4XagXY2o1327nHH54LoTjiPJ0gizoqPDRqWyX/00g0hD6w+A==", + "dev": true, + "requires": { + "lodash": "^4.2.1", + "lodash-es": "^4.2.1", + "loose-envify": "^1.1.0", + "symbol-observable": "^1.0.3" + } + } + } + }, + "@types/scheduler": { + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", + "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==" + }, + "@types/semver": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", + "dev": true + }, + "@types/use-sync-external-store": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz", + "integrity": "sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==" + }, + "@typescript-eslint/eslint-plugin": { + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.8.tgz", + "integrity": "sha512-JDMOmhXteJ4WVKOiHXGCoB96ADWg9q7efPWHRViT/f09bA8XOMLAVHHju3l0MkZnG1izaWXYmgvQcUjTRcpShQ==", + "dev": true, + "requires": { + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.59.8", + "@typescript-eslint/type-utils": "5.59.8", + "@typescript-eslint/utils": "5.59.8", + "debug": "^4.3.4", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/parser": { + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.8.tgz", + "integrity": "sha512-AnR19RjJcpjoeGojmwZtCwBX/RidqDZtzcbG3xHrmz0aHHoOcbWnpDllenRDmDvsV0RQ6+tbb09/kyc+UT9Orw==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "5.59.8", + "@typescript-eslint/types": "5.59.8", + "@typescript-eslint/typescript-estree": "5.59.8", + "debug": "^4.3.4" + } + }, + "@typescript-eslint/scope-manager": { + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.8.tgz", + "integrity": "sha512-/w08ndCYI8gxGf+9zKf1vtx/16y8MHrZs5/tnjHhMLNSixuNcJavSX4wAiPf4aS5x41Es9YPCn44MIe4cxIlig==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.59.8", + "@typescript-eslint/visitor-keys": "5.59.8" + } + }, + "@typescript-eslint/type-utils": { + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.8.tgz", + "integrity": "sha512-+5M518uEIHFBy3FnyqZUF3BMP+AXnYn4oyH8RF012+e7/msMY98FhGL5SrN29NQ9xDgvqCgYnsOiKp1VjZ/fpA==", + "dev": true, + "requires": { + "@typescript-eslint/typescript-estree": "5.59.8", + "@typescript-eslint/utils": "5.59.8", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/types": { + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.8.tgz", + "integrity": "sha512-+uWuOhBTj/L6awoWIg0BlWy0u9TyFpCHrAuQ5bNfxDaZ1Ppb3mx6tUigc74LHcbHpOHuOTOJrBoAnhdHdaea1w==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.8.tgz", + "integrity": "sha512-Jy/lPSDJGNow14vYu6IrW790p7HIf/SOV1Bb6lZ7NUkLc2iB2Z9elESmsaUtLw8kVqogSbtLH9tut5GCX1RLDg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.59.8", + "@typescript-eslint/visitor-keys": "5.59.8", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/utils": { + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.8.tgz", + "integrity": "sha512-Tr65630KysnNn9f9G7ROF3w1b5/7f6QVCJ+WK9nhIocWmx9F+TmCAcglF26Vm7z8KCTwoKcNEBZrhlklla3CKg==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.59.8", + "@typescript-eslint/types": "5.59.8", + "@typescript-eslint/typescript-estree": "5.59.8", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.8.tgz", + "integrity": "sha512-pJhi2ms0x0xgloT7xYabil3SGGlojNNKjK/q6dB3Ey0uJLMjK2UDGJvHieiyJVW/7C3KI+Z4Q3pEHkm4ejA+xQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.59.8", + "eslint-visitor-keys": "^3.3.0" + } + }, + "@vitejs/plugin-react-swc": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-3.3.2.tgz", + "integrity": "sha512-VJFWY5sfoZerQRvJrh518h3AcQt6f/yTuWn4/TRB+dqmYU0NX1qz7qM5Wfd+gOQqUzQW4gxKqKN3KpE/P3+zrA==", + "requires": { + "@swc/core": "^1.3.61" + } + }, + "acorn": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "dev": true + }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "requires": {} + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "axios": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz", + "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==", + "requires": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "requires": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "before-after-hook": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", + "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==" + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + }, + "camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==" + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "requires": { + "is-glob": "^4.0.1" + } + } + } + }, + "clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==" + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "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==" + }, + "cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + } + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "deprecation": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", + "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==" + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "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" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "esbuild": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", + "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", + "requires": { + "@esbuild/android-arm": "0.17.19", + "@esbuild/android-arm64": "0.17.19", + "@esbuild/android-x64": "0.17.19", + "@esbuild/darwin-arm64": "0.17.19", + "@esbuild/darwin-x64": "0.17.19", + "@esbuild/freebsd-arm64": "0.17.19", + "@esbuild/freebsd-x64": "0.17.19", + "@esbuild/linux-arm": "0.17.19", + "@esbuild/linux-arm64": "0.17.19", + "@esbuild/linux-ia32": "0.17.19", + "@esbuild/linux-loong64": "0.17.19", + "@esbuild/linux-mips64el": "0.17.19", + "@esbuild/linux-ppc64": "0.17.19", + "@esbuild/linux-riscv64": "0.17.19", + "@esbuild/linux-s390x": "0.17.19", + "@esbuild/linux-x64": "0.17.19", + "@esbuild/netbsd-x64": "0.17.19", + "@esbuild/openbsd-x64": "0.17.19", + "@esbuild/sunos-x64": "0.17.19", + "@esbuild/win32-arm64": "0.17.19", + "@esbuild/win32-ia32": "0.17.19", + "@esbuild/win32-x64": "0.17.19" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" + }, + "eslint": { + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.41.0.tgz", + "integrity": "sha512-WQDQpzGBOP5IrXPo4Hc0814r4/v2rrIsB0rhT7jtunIalgg6gYXWhRMOejVO8yH21T/FGaxjmFjBMNqcIlmH1Q==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.0.3", + "@eslint/js": "8.41.0", + "@humanwhocodes/config-array": "^0.11.8", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.0", + "eslint-visitor-keys": "^3.4.1", + "espree": "^9.5.2", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "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==", + "dev": true + }, + "eslint-scope": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", + "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "eslint-plugin-react-hooks": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", + "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "dev": true, + "requires": {} + }, + "eslint-plugin-react-refresh": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.3.5.tgz", + "integrity": "sha512-61qNIsc7fo9Pp/mju0J83kzvLm0Bsayu7OQSLEoJxLDCBjIIyb87bkzufoOvdDxLkSlMfkF7UxomC4+eztUBSA==", + "dev": true, + "requires": {} + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "eslint-visitor-keys": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "dev": true + }, + "espree": { + "version": "9.5.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz", + "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==", + "dev": true, + "requires": { + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + } + }, + "esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + } + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "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", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, + "flux-standard-action": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/flux-standard-action/-/flux-standard-action-2.1.2.tgz", + "integrity": "sha512-7vdgawlphCjzaMLdpZv8hlGC/FJCXu6sqE3Wuqe3HLZ22KcDiO4IFplxLDePDhEt6hgCrugt45RoUObuzZP6Kg==", + "requires": { + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1" + } + }, + "follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" + }, + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + }, + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + } + }, + "grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "dev": true + }, + "graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" + }, + "hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "requires": { + "react-is": "^16.7.0" + }, + "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==" + } + } + }, + "ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true + }, + "immer": { + "version": "9.0.21", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", + "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==" + }, + "immutable": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.0.tgz", + "integrity": "sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==" + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-core-module": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "requires": { + "has": "^1.0.3" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true + }, + "is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==" + }, + "is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "dev": true + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + }, + "lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==" + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true + }, + "node-fetch": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz", + "integrity": "sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==", + "requires": { + "whatwg-url": "^5.0.0" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + }, + "postcss": { + "version": "8.4.24", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.24.tgz", + "integrity": "sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==", + "requires": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + } + }, + "postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "requires": { + "camelcase-css": "^2.0.1" + } + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, + "prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "peer": true + }, + "prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + }, + "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-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "requires": { + "loose-envify": "^1.1.0" + } + }, + "react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "requires": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + } + }, + "react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, + "react-redux": { + "version": "8.0.7", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-8.0.7.tgz", + "integrity": "sha512-1vRQuCQI5Y2uNmrMXg81RXKiBHY3jBzvCvNmZF437O/Z9/pZ+ba2uYHbemYXb3g8rjsacBGo+/wmfrQKzMhJsg==", + "requires": { + "@babel/runtime": "^7.12.1", + "@types/hoist-non-react-statics": "^3.3.1", + "@types/use-sync-external-store": "^0.0.3", + "hoist-non-react-statics": "^3.3.2", + "react-is": "^18.0.0", + "use-sync-external-store": "^1.0.0" + } + }, + "react-router": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.11.2.tgz", + "integrity": "sha512-74z9xUSaSX07t3LM+pS6Un0T55ibUE/79CzfZpy5wsPDZaea1F8QkrsiyRnA2YQ7LwE/umaydzXZV80iDCPkMg==", + "requires": { + "@remix-run/router": "1.6.2" + } + }, + "react-router-dom": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.11.2.tgz", + "integrity": "sha512-JNbKtAeh1VSJQnH6RvBDNhxNwemRj7KxCzc5jb7zvDSKRnPWIFj9pO+eXqjM69gQJ0r46hSz1x4l9y0651DKWw==", + "requires": { + "@remix-run/router": "1.6.2", + "react-router": "6.11.2" + } + }, + "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" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "requires": { + "picomatch": "^2.2.1" + } + }, + "redux": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", + "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", + "requires": { + "@babel/runtime": "^7.9.2" + } + }, + "redux-promise": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/redux-promise/-/redux-promise-0.6.0.tgz", + "integrity": "sha512-R2mGxJbPFgXyCNbFDE6LjTZhCEuACF54g1bxld3nqBhnRMX0OsUyWk77moF7UMGkUdl5WOAwc4BC5jOd1dunqQ==", + "requires": { + "flux-standard-action": "^2.0.3", + "is-promise": "^2.1.0" + } + }, + "redux-thunk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.2.tgz", + "integrity": "sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q==", + "requires": {} + }, + "regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + }, + "reselect": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.8.tgz", + "integrity": "sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==" + }, + "resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "requires": { + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "rollup": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.23.0.tgz", + "integrity": "sha512-h31UlwEi7FHihLe1zbk+3Q7z1k/84rb9BSwmBSr/XjOCEaBJ2YyedQDuM0t/kfOS0IxM+vk1/zI9XxYj9V+NJQ==", + "requires": { + "fsevents": "~2.3.2" + } + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "sass": { + "version": "1.62.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.62.1.tgz", + "integrity": "sha512-NHpxIzN29MXvWiuswfc1W3I0N8SXBd8UR26WntmDlRYf0bSADnwnOjsyMZ3lMezSlArD33Vs3YFhp7dWvL770A==", + "requires": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + } + }, + "scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "requires": { + "loose-envify": "^1.1.0" + } + }, + "semver": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==" + }, + "source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "symbol-observable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", + "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", + "dev": true + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==" + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + } + }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + }, + "typescript": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", + "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", + "dev": true + }, + "universal-user-agent": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", + "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==" + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "use-sync-external-store": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", + "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", + "requires": {} + }, + "vite": { + "version": "4.3.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.3.9.tgz", + "integrity": "sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==", + "requires": { + "esbuild": "^0.17.5", + "fsevents": "~2.3.2", + "postcss": "^8.4.23", + "rollup": "^3.21.0" + } + }, + "vite-plugin-mkcert": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/vite-plugin-mkcert/-/vite-plugin-mkcert-1.15.0.tgz", + "integrity": "sha512-0Pz7iExvo7pS2HsxMe6Y/HIrsFJidXN8Sju7tsL1XYQdbUKb/D0L5Wkj3UoGQmbbWZUFf8nHHa0XYbd4FH6ZrA==", + "requires": { + "@octokit/rest": "^19.0.5", + "axios": "^1.2.2", + "debug": "^4.3.4", + "picocolors": "^1.0.0" + } + }, + "vite-plugin-sass-dts": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/vite-plugin-sass-dts/-/vite-plugin-sass-dts-1.3.5.tgz", + "integrity": "sha512-yGm5uRTDq1qc17ZMJV0bQRgxNfw2a/Ejqc/T2NOILXmcR1z9zHpqqo1FwoDddyTV87GDQZYldqKZOE4O5bGBOw==", + "requires": { + "postcss-js": "^4.0.1" + } + }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 00000000..8a71f68e --- /dev/null +++ b/package.json @@ -0,0 +1,48 @@ +{ + "name": "sale-project", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "lint": "eslint src --ext ts,tsx --report-unused-disable-directives --max-warnings 0", + "preview": "vite preview" + }, + "dependencies": { + "@emotion/react": "^11.11.0", + "@emotion/styled": "^11.11.0", + "@fortawesome/fontawesome-free": "^6.4.0", + "@fortawesome/free-brands-svg-icons": "^6.4.0", + "@fortawesome/free-regular-svg-icons": "^6.4.0", + "@fortawesome/free-solid-svg-icons": "^6.4.0", + "@fortawesome/react-fontawesome": "^0.2.0", + "@mui/material": "^5.13.4", + "@reduxjs/toolkit": "^1.9.5", + "@vitejs/plugin-react-swc": "^3.3.2", + "axios": "^1.4.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-redux": "^8.0.7", + "react-router-dom": "^6.11.2", + "redux": "^4.2.1", + "redux-promise": "^0.6.0", + "redux-thunk": "^2.4.2", + "sass": "^1.62.1", + "vite-plugin-mkcert": "^1.15.0", + "vite-plugin-sass-dts": "^1.3.5" + }, + "devDependencies": { + "@types/node": "^20.2.5", + "@types/react": "^18.0.37", + "@types/react-dom": "^18.0.11", + "@types/redux-promise": "^0.5.29", + "@typescript-eslint/eslint-plugin": "^5.59.0", + "@typescript-eslint/parser": "^5.59.0", + "eslint": "^8.38.0", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.3.4", + "typescript": "^5.0.2", + "vite": "^4.3.9" + } +} diff --git a/public/images/Wink_logo.png b/public/images/Wink_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..f16b156b4f3ed9021818d4aa3ad5dd5a80caf8b2 GIT binary patch literal 19028 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 X&f%_Y4stk}C@#B;j@A@Qbn<@yM&~?` literal 0 HcmV?d00001 diff --git a/public/images/bookcover.jpg b/public/images/bookcover.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0ac3f48afc3bf894b37e118dbc2cd788bf40e1c2 GIT binary patch literal 60174 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�WcgQ{@iCw!b3Htc&lG=Lz9p#>^Wd^r7GWm}_% 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

0AZfqu;y}y>X6$`$4 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%0D*{zeg~&# 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 cq5*US>O>d_@*>Wy$2T+DV~oh0@(v(-lVUp;l!< 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 Dxp%c~ literal 0 HcmV?d00001 diff --git a/public/images/cartbookimage.jpg b/public/images/cartbookimage.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c7c1ef763bf90cc019a4dc4051071751f289b7cb GIT binary patch literal 3835 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 { +const updateHeader = tokenparam ? {...headers, 'Authorization': 'Bearer '+ tokenparam} : headers; + return { + method, + headers: updateHeader, + body: JSON.stringify(param) + } +} + + const mainURL = "https://asia-northeast3-heropy-api.cloudfunctions.net/api/auth"; + + export const JoinForm = async (email:string,displayName:string,password:string) => { + const URL = `${mainURL}/signup`; + const res = await fetch(URL,options("POST", {email,displayName,password})); + const param = await res.json(); + return param; + }; + + //const LOGINURL = "https://asia-northeast3-heropy-api.cloudfunctions.net/api/auth/login"; + + export const LoginForm = async (email:string,password:string) => { + const LOGINURL = `${mainURL}/login` + const res = await fetch(LOGINURL,options("POST", {email,password})); + const param = await res.json(); + return param; + }; + + //const LogoutURL = "https://asia-northeast3-heropy-api.cloudfunctions.net/api/auth/logout"; + + export const LogoutForm = async () => { + const LOGOUTURL = `${mainURL}/logout` + const token:string = localStorage.getItem("token") as string; + const res = await fetch(LOGOUTURL,options("POST",{} , token)); + const param = await res.json(); + return param; + }; \ No newline at end of file diff --git a/src/App.scss b/src/App.scss new file mode 100644 index 00000000..1b9d15cf --- /dev/null +++ b/src/App.scss @@ -0,0 +1,33 @@ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + margin: 0; + // width: 100%; + //height: 100vh; + background-color: #F8EDE3; + //background-color: rebeccapurple; + // font-family: 'Dovemayo_gothic'; +}; + +a { + text-decoration: none; +} + +// @font-face { +// font-family: 'Dovemayo_gothic'; +// src: url('https://cdn.jsdelivr.net/gh/projectnoonnu/noonfonts_2302@1.1/Dovemayo_gothic.woff2') format('woff2'); +// font-weight: normal; +// font-style: normal; +// } + +@font-face { + font-family: 'SUITE-Regular'; + src: url('https://cdn.jsdelivr.net/gh/projectnoonnu/noonfonts_2304-2@1.0/SUITE-Regular.woff2') format('woff2'); + font-weight: 400; + font-style: normal; +} + diff --git a/src/App.tsx b/src/App.tsx new file mode 100644 index 00000000..1f2a3294 --- /dev/null +++ b/src/App.tsx @@ -0,0 +1,14 @@ +import './App.scss' +import RoutesPage from 'routes/routes' + + + +function App() { + return ( + <> + + + ) +} + +export default App diff --git a/src/Common/Form/Login/login.scss b/src/Common/Form/Login/login.scss new file mode 100644 index 00000000..cb1c8485 --- /dev/null +++ b/src/Common/Form/Login/login.scss @@ -0,0 +1,76 @@ +@import '../Signin/join.scss'; + +.LoginContainer{ + @include Container; + font-family: 'SUITE-Regular'; + + .loginContainer-inner{ + @include FormContainerStyle; + + .JoinTextContainer{ + @include Textbox; + //background-color: pink; + + p { + margin: auto; + font-size: 30px; + } + } + + .formBox { + width: 400px; + height: 280px; + position: relative; + top: 150px; + margin: 0 auto; + //background-color: chartreuse; + + .formBox-inner{ + width: 300px; + height: 95px; + margin: 0 auto; + //background-color: red; + + input { + width:100%; + height: 50px; + margin-top: 10px; + border-radius: 10px; + padding: 10px 10px 10px 10px; + border: 2px solid #F7E9D7; + outline: none; + //font-family: 'Dovemayo_gothic'; + font-family: 'SUITE-Regular'; + } + } + + .buttonContainer { + width: 210px; + height: 50px; + position: absolute; + bottom: 30px; + left: 0; + right: 0; + margin: 0 auto; + } + + .buttonBox { + width: 200px; + height: 50px; + color: black; + background-color: #F7E9D7; + } + } + } + + .bottomText{ + display: flex; + width: 350px; + height: 20px; + //background-color: teal; + font-size: 18px; + position: absolute; + bottom: 300px; + left: 445px; + } +} \ No newline at end of file diff --git a/src/Common/Form/Login/login.tsx b/src/Common/Form/Login/login.tsx new file mode 100644 index 00000000..155f3fd8 --- /dev/null +++ b/src/Common/Form/Login/login.tsx @@ -0,0 +1,116 @@ +import './login.scss' +import { useNavigate, Link } from 'react-router-dom'; +//import { useDispatch } from "react-redux"; +import { FormEvent, useState, ChangeEvent } from 'react'; +//import { loginUser } from '_reducers/user_reducer'; +import { LoginForm } from 'Apis/apis'; + + +function Login() { + + const navigate = useNavigate(); + //const dispatch = useDispatch(); + const [email, setEmail] = useState(''); + const [password, setPassword] = useState(''); + + + + const onChangeEmail = (e: ChangeEvent) => { + setEmail(e.target.value); + }; + + const onChangeName = (e: ChangeEvent) => { + setPassword(e.target.value); + }; + + interface DataToSubmit { + email: string // 사용자 아이디 (필수!) + password: string // 사용자 비밀번호 (필수!) + } + + + async function Signin(event: FormEvent) { + event.preventDefault(); + + if (email === undefined || email === "" || email === null) { + alert('이메일을 입력해주세요.'); + return false; + } + + if (password === undefined || password === "" || password === null) { + alert('비밀번호를 입력해주세요.'); + return false; + } + + const dataToSubmit: DataToSubmit = { + email: email, + password: password + }; + + try { + + //const data = await dispatch(loginUser(dataToSubmit)); + const data = await LoginForm(email, password) + console.log(data); + + if(data.accessToken){ + alert("로그인 되었습니다!"); + window.localStorage.setItem('token', data.accessToken); + navigate("/"); + } else { + alert("로그인에 실패하였습니다. 다시 시도해주세요."); + } + } catch (error) { + console.error(error); + alert("오류가 발생했습니다. 다시 시도해주세요."); + } + } + + + return( + <> +

+ + ) +} +export default Login \ No newline at end of file diff --git a/src/Common/Form/Signin/join.scss b/src/Common/Form/Signin/join.scss new file mode 100644 index 00000000..774207f5 --- /dev/null +++ b/src/Common/Form/Signin/join.scss @@ -0,0 +1,104 @@ +@mixin Container { + width: 1200px; + //height: 780px; + padding-bottom: 80px; + background-color: aqua; + position: relative; + left: 300px; +} + +@mixin FormContainerStyle { + width: 500px; + height: 700px; + position: relative; + border-radius: 10px; + top: 50px; + margin: auto; + background-color: white; + box-shadow: 10px 10px 26px gray, -12px -12px 36px white; +} + +@mixin Textbox { + width: 200px; + height: 50px; + position: absolute; + display: flex; + margin: 0 auto; + left: 0; + right: 0; + top: 60px; +} + + +.joinContainer { + @include Container; + font-family: 'SUITE-Regular'; + + .joinContainer-inner { + @include FormContainerStyle; + + .textContainer { + @include Textbox; + p { + margin: auto; + font-size: 30px; + //background-color: aliceblue; + } + } + + .formBox { + width: 400px; + height: 450px; + position: relative; + top: 130px; + margin: 0 auto; + //background-color: chartreuse; + + .formBox-inner { + width: 300px; + height: 95px; + margin: 0 auto; + //background-color: red; + + input { + width:100%; + height: 50px; + margin-top: 10px; + border-radius: 10px; + padding: 10px 10px 10px 10px; + border: 2px solid #F7E9D7; + outline: none; + font-family: ''; + } + + span { + width: 260px; + //background-color: oldlace; + position: relative; + margin: 0 auto; + top:10px; + left: 0; + right: 0; + display: flex; + } + } + + .buttonContainer { + width: 210px; + height: 50px; + position: absolute; + bottom: 5px; + left: 0; + right: 0; + margin: 0 auto; + } + + .buttonBox { + width: 200px; + height: 50px; + color: black; + background-color: #F7E9D7; + } + } + } +} diff --git a/src/Common/Form/Signin/join.tsx b/src/Common/Form/Signin/join.tsx new file mode 100644 index 00000000..41b291b7 --- /dev/null +++ b/src/Common/Form/Signin/join.tsx @@ -0,0 +1,193 @@ +import { FormEvent, useState, useCallback } from 'react'; +import axios from 'axios'; +import { useNavigate } from 'react-router-dom'; +import { PwCheck, emailCheck } from '../Validation '; +import { JoinForm } from 'Apis/apis'; +import './join.scss' + + +function Join () { + + const navigate = useNavigate(); + + // 이름 , 비밀번호, 이메일 , 비밀번호 확인 + const [email, setUserEmail] = useState(""); + const [displayName, setdDisplayName] = useState(""); + const [password, setUserPassword] = useState(""); + const [confirmPassword, setConfirmPassword] = useState(""); + + + + //비밀번호 유효성 검사 + const [isName, setIsName] = useState(false) + const [isEmail, setIsEmail] = useState(false) + const [isPassword, setIsPassword] = useState(false) + const [isPasswordConfirm, setIsPasswordConfirm] = useState(false) + + //오류 메세지 저장 + const [nameMessage, setNameMessage] = useState('') + const [emailMessage, setEmailMessage] = useState('') + const [passwordMessage, setPasswordMessage] = useState('') + const [passwordConfirmMessage, setPasswordConfirmMessage] = useState('') + + + + const onChangeEmail = useCallback((e: React.ChangeEvent) => { + const emails = e.target.value + setUserEmail(emails) + if (emailCheck(emails)) { + setEmailMessage('올바른 이메일 형식이에요 : )') + setIsEmail(true) + } else { + setEmailMessage('이메일 형식이 틀렸습니다') + setIsEmail(false) + } + },[]) + + const onChangeName = useCallback((e: React.ChangeEvent) => { + setdDisplayName(e.target.value) + if (e.target.value.length < 2 || e.target.value.length > 21) { + setNameMessage('2글자 이상 21글자 미만으로 입력해주세요.') + setIsName(false) + } else { + setNameMessage('올바른 이름 형식입니다 :)') + setIsName(true) + } + }, []) + + const onChangePassword = useCallback((e: React.ChangeEvent) => { + const passwordCurrent = e.target.value + setUserPassword(passwordCurrent) + + if (!PwCheck(passwordCurrent)) { + setPasswordMessage('8자리 이상 입력해주세요.') + setIsPassword(false) + } else { + setPasswordMessage('안전한 비밀번호에요 : )') + setIsPassword(true) + } + }, [confirmPassword]) + + const onChangePasswordConfirm = (password:any, confirmPassword:any, setPasswordConfirmMessage:any, setIsPasswordConfirm:any) => { + if (password === confirmPassword) { + setPasswordConfirmMessage('비밀번호를 똑같이 입력했어요 : )'); + setIsPasswordConfirm(true); + } else { + setPasswordConfirmMessage('비밀번호가 틀립니다. 다시 입력해주세요.'); + setIsPasswordConfirm(false); + } + }; + + const onPasswordConfirmChange = useCallback((e: React.ChangeEvent) => { + const passwordConfirmCurrent = e.target.value; + setConfirmPassword(passwordConfirmCurrent); + onChangePasswordConfirm(password, passwordConfirmCurrent, setPasswordConfirmMessage, setIsPasswordConfirm); + }, [password]); + + + async function signUp (event: FormEvent) { + event.preventDefault() + if(email === undefined || email === "" || email === null ){ + alert("이메일 입력해주세요."); + return false; + } + + if( isEmail === false || isPassword === false || isPasswordConfirm === false){ + alert("값이 잘못 되었습니다. 다시 입력해주세요"); + return false; + } + + const param = { + email: email, + password: password, + displayName: displayName + } + + try{ + const res = await JoinForm(email,displayName,password); + if (res.accessToken) { + alert("가입되었습니다."); + //localStorage.setItem('token', res.accessToken); + navigate("/login"); + } else { + alert("가입에 실패했습니다. 다시 시도해주세요."); + } + } catch (error) { + alert("시스템 오류입니다. 문의해주세요."); + } +} + + return( + <> +
+
+
+

회원가입📖

+
+ +
+
+ + {email.length > 0 && {emailMessage}} +
+ +
+ + {displayName.length > 0 && {nameMessage}} +
+ +
+ + {password.length > 0 && ( + {passwordMessage} + )} +
+ +
+ + {confirmPassword.length > 0 && ( + {passwordConfirmMessage} + )} +
+ +
+ +
+ + +
+
+ +
+ + ) + +} +export default Join; \ No newline at end of file diff --git a/src/Common/Form/Validation .tsx b/src/Common/Form/Validation .tsx new file mode 100644 index 00000000..067a9904 --- /dev/null +++ b/src/Common/Form/Validation .tsx @@ -0,0 +1,16 @@ +// 이메일 체크 여부 +const emailExp = /^[0-9a-zA-Z]([-_\\.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_\\.]?[0-9a-zA-Z])*\.[a-zA-Z]{2,3}$/; + +export const emailCheck = (mail:string) =>{ + return emailExp.test(mail) ? true : false; +} + + +//패스워드 체크 여부 +// const PwExp = /^(?=.*[a-zA-z])(?=.*[0-9])(?=.*[A-Z])(?=.*[$`~!@$!%*#^?&\\(\\)\-_=+]).{8,}/; + + +const PwExp = /^.{8,}$/; + export const PwCheck = (password:string) => { + return PwExp.test(password) ? true : false; +} \ No newline at end of file diff --git a/src/Common/Layout/Footer/footer.scss b/src/Common/Layout/Footer/footer.scss new file mode 100644 index 00000000..b0af685a --- /dev/null +++ b/src/Common/Layout/Footer/footer.scss @@ -0,0 +1,51 @@ + +footer { + background-color: #f6f4ef; + padding-bottom: 100px; + width: 100%; + + .Footer-inner { + display: flex; + position: absolute; + width: 380px; + gap: 30px; + right: 100px; + + .wrap { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + margin-top: 20px; + + &:hover { + cursor: pointer; + } + p { + font-size: 12px; + margin-top: 5px; + } + } + } + .Logo-box { + position: absolute; + left: 170px; + + img{ + width: 110px; + height: 90px; + } + } + .title { + position: absolute; + font-size: 25px; + width: 400px; + height: 40px; + //background-color: red; + margin: 0 auto; + left: 0; + right: 0; + margin-top: 30px; + + } + } \ No newline at end of file diff --git a/src/Common/Layout/Footer/footer.tsx b/src/Common/Layout/Footer/footer.tsx new file mode 100644 index 00000000..6ae7cb55 --- /dev/null +++ b/src/Common/Layout/Footer/footer.tsx @@ -0,0 +1,79 @@ +import "./footer.scss"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { faGithub, faFacebook, faSquareInstagram } from "@fortawesome/free-brands-svg-icons"; + +const Footer = () => { + const Donguk = "https://github.com/foodeco"; + const Haeun = "https://github.com/hahahaday12"; + const Saeyeon = "https://github.com/saeyeonKim"; + const Daehyun = "https://github.com/dhmoon11"; + const Jinyoung = "https://github.com/jinyoungpark231"; + const Twinkle = "https://github.com/KDT5TeamWink"; + + return ( +
+
+
+ { + window.open(Twinkle); + }} + /> +

Twinkle

+
+
+ { + window.open(Donguk); + }} + /> +

서동욱

+
+
+ { + window.open(Haeun); + }} + /> +

김하은

+
+
+ { + window.open(Saeyeon); + }} + /> +

김세연

+
+
+ { + window.open(Daehyun); + }} + /> +

문대현

+
+
+ { + window.open(Jinyoung); + }} + /> +

박진영

+
+
+
+ logo_image +
+

toyproject ©️ 5기 7조 twinkle

+
+ ); +}; +export default Footer; \ No newline at end of file diff --git a/src/Common/Layout/Header/header.tsx b/src/Common/Layout/Header/header.tsx new file mode 100644 index 00000000..03d81809 --- /dev/null +++ b/src/Common/Layout/Header/header.tsx @@ -0,0 +1,71 @@ +import { Link, useNavigate } from 'react-router-dom'; +//import { useSelector } from 'react-redux'; +import './headers.scss' +//import { RootState } from '../_reducers'; +//import { useDispatch } from 'react-redux'; +//import { logoutUser } from '_reducers/user_reducer'; +import { LogoutForm } from 'Apis/apis'; + +function Header(){ + + // const userState = useSelector((state) => state.user); + // const accessToken = userState.accessToken; + // console.log("1", accessToken); + // const dispatch = useDispatch(); + + + const navigate = useNavigate(); + + const logoutHandler = () => { + LogoutForm() + .then(() => { + localStorage.removeItem('token'); + alert("로그아웃 되셨습니다") + navigate('/'); + }) + .catch((error:string) => { + console.log('Logout failed:', error); + }); + }; + + const token = localStorage.getItem('token'); + + return( + <> +
+
+ + + logo + + +
+ +
+ +
+ 장바구니 + 마이페이지 + {token ? ( +
+

로그아웃

+
+ ) : ( + <> + +

회원가입

+ + +

로그인

+ + + )} +
+
+
+
+ + ) +} +export default Header + diff --git a/src/Common/Layout/Header/headers.scss b/src/Common/Layout/Header/headers.scss new file mode 100644 index 00000000..5ed56426 --- /dev/null +++ b/src/Common/Layout/Header/headers.scss @@ -0,0 +1,130 @@ +.headerContainer{ + width: 100%; + margin: auto; + height: 80px; + background-color: white; + border-bottom: 2px solid rgb(202, 159, 18); + max-width: 1920px; + //position: relative; + + .itemsWrapper{ + //width: 80%; + width: 1400px; + margin: 0 auto; + left: 0; + right: 0; + //background-color: greenyellow; + display: flex; + position: absolute; + justify-content: space-between; + } + + .logoBox { + width: 150px; + margin-top: 10px; + height: 50px; + display: inline-block; + position: relative; + //background-color: aqua; + + img{ + width: 80px; + position: absolute; + margin: 0 auto; + left: 0; + right: 0; + } + } + + .searchBox{ + width: 270px; + height: 40px; + background-color: white; + border-radius: 10px; + margin-top: 10px; + + input{ + margin: auto; + display: flex; + height: 40px; + width: 250px; + outline: none; + border: none; + } + } + + + .Header-box { + display: flex; + //vertical-align: top; + align-items: center; + gap: 30px; + height: 30px; + margin-top: 20px; + //max-width: 1230px; + background-color: yellow; + + .Header-box__text{ + text-Decoration:none; + color: gray; + font-weight: bold; + } + + .cart { + width: 50px; + height: 50px; + background-color: red; + } + } + +} + + + + + + + + + + + + +// addict — 오늘 오후 3:06 +// { +// margin: 0; +// padding: 0; +// box-sizing: border-box; +// } +// body { +// background-color: #e8d5c4; +// min-height: 100vh; +// } +// .container { +// width: 1250px; +// margin: auto; +// } +// header { +// display: flex; +// background-color: transparent; +// justify-content: space-between; +// align-items: center; +// padding: 0 50px; +// border-bottom: 1px solid; +// .logo { +// width: 150px; +// height: 50px; +// margin: 25px 0; +// background-color: aqua; +// } +// .user-box { +// display: flex; +// align-items: center; +// gap: 10px; +// .cart { +// width: 50px; +// height: 50px; +// background-color: red; +// } +// } +// } \ No newline at end of file diff --git a/src/Common/Layout/LayoutPage.scss b/src/Common/Layout/LayoutPage.scss new file mode 100644 index 00000000..d0dad673 --- /dev/null +++ b/src/Common/Layout/LayoutPage.scss @@ -0,0 +1,6 @@ +// .layoutContainer{ +// width: 100vw; +// height: 100vh; +// background-color: #E8D5C4; +// position: relative; +// } diff --git a/src/Common/Layout/LayoutPage.tsx b/src/Common/Layout/LayoutPage.tsx new file mode 100644 index 00000000..da930b8c --- /dev/null +++ b/src/Common/Layout/LayoutPage.tsx @@ -0,0 +1,13 @@ + +import './LayoutPage.scss' + +function LayoutPage(){ + return( + <> +
+

전체 레이아웃 페이지 입니다.

+
+ + ) +} +export default LayoutPage \ No newline at end of file diff --git a/src/Common/section/number.scss b/src/Common/section/number.scss new file mode 100644 index 00000000..092e6cdf --- /dev/null +++ b/src/Common/section/number.scss @@ -0,0 +1,13 @@ +.YearContainer-input__selects{ + + .Year-select{ + // @include selectStyle; + width: 80px; + height: 40px; + display: block; + font-size: 15px; + //line-height: 1.0; + padding: 12px 12px 12px 25px; + border-radius: 0.25rem; + } + }; \ No newline at end of file diff --git a/src/Common/section/number.tsx b/src/Common/section/number.tsx new file mode 100644 index 00000000..ed114a8a --- /dev/null +++ b/src/Common/section/number.tsx @@ -0,0 +1,29 @@ +import './number.scss'; +import React from 'react'; +import { Year } from '../../data/data'; // Import the Year function + +function YearBox(props) { + const yearList = Year(); // Get the year data using the Year function + + const renderNum = () => yearList.map((item , index) => { + return ( + + ); + }); + + const handleChange = (e: React.ChangeEvent) => { + props.event(e); + }; + + return ( + <> +
+ +
+ + ); +} + +export default YearBox; \ No newline at end of file diff --git a/src/Components/Views/CartPage/CartItems/CartItems.scss b/src/Components/Views/CartPage/CartItems/CartItems.scss new file mode 100644 index 00000000..2395c890 --- /dev/null +++ b/src/Components/Views/CartPage/CartItems/CartItems.scss @@ -0,0 +1,164 @@ +@mixin CartNameStyle { + height: auto; + //background-color: rgb(14, 133, 237); + font-size: 20px; + position: absolute; + top: 10px; +} + + +.CartPageTable__Buy { + width: inherit; + height: 45px; + background-color: #e8e0d6; + position: absolute; + border-radius: 10px 10px 0px 0px; + + .LableBox { + width: 40px; + height: 40px; + //background-color: #e18b8b; + margin-left: 50px; + margin-top: 5px; + position: absolute; + font-size: 30px; + } +} + + .ProductNameBox { + @include CartNameStyle; + width: 60px; + left: 300px; + } + + .PriceNameBox{ + @include CartNameStyle; + right: 450px; + } + + .NumberBox{ + @include CartNameStyle; + right: 280px; + } + + .DeleteNameBox{ + @include CartNameStyle; + right: 100px; + } + + + .ItemsContainer { + width: 1300px; + top: 50px; + position: relative; + //background-color: #F8EDE3; + max-height: 450px; /* 스크롤 영역의 최대 높이 설정 */ + overflow-y: auto; /* 세로 스크롤 생성 */ + + .ItemContainer { + width: 1180px; + height: 90px; + position: relative; + margin-top: 20px; + border-bottom: 2px solid rgb(208, 203, 185); + + .CheckContainer{ + width: 60px; + height: 40px; + position: absolute; + top: 12px; + left: 30px; + } + + .ImageBox{ + width: 100px; + height: 100px; + margin-left: 150px; + + img{ + position: absolute; + width: inherit; + height: 80px; + } + } + + .TextInner { + width: 400px; + height: 100px; + position: absolute; + top: 1px; + left: 260px; + font-size: 20px; + + span:nth-child(1) { + width: 400px; + height: 20px; + position: absolute; + font-size: 20px; + } + + span:nth-child(2) { + width: 200px; + height: 30px; + position: absolute; + margin-top: 35px; + font-size: 15px; + } + } + + .PriceInner{ + width: 150px; + height: 90px; + position: absolute; + top: -10px; + right: 350px; + //background-color: olivedrab; + display: table-column; + font-size: 15px; + + + span:nth-child(1){ + width: 100px; + height: 20px; + position: absolute; + } + + span:nth-child(2){ + height: 30px; + position: absolute; + margin-top: 30px; + } + + span:nth-child(3){ + height: 30px; + position: absolute; + margin-top: 60px; + } + } + + .ChooseNumber{ + width: 90px; + height: 50px; + //background-color: brown; + position: absolute; + right: 220px; + top: 15px; + } + + .CartButtonBox{ + width: 60px; + height: 60px; + position: absolute; + top: 15px; + right: 100px; + //background-color: burlywood; + + button{ + display: block; + width: 50px; + height: 30px; + margin-top: 5px; + } + } + } +} \ No newline at end of file diff --git a/src/Components/Views/CartPage/CartItems/CartItems.tsx b/src/Components/Views/CartPage/CartItems/CartItems.tsx new file mode 100644 index 00000000..95f01b3b --- /dev/null +++ b/src/Components/Views/CartPage/CartItems/CartItems.tsx @@ -0,0 +1,136 @@ +import React from "react" +import { useState } from "react"; +import Box from '@mui/material/Box'; +import Checkbox from '@mui/material/Checkbox'; +import FormControlLabel from '@mui/material/FormControlLabel'; +import YearBox from "Common/section/number"; +import './CartItems.scss' + +function CartItems() { + + interface Item { + id: number; + // image:string; + name: string; + text: string; + price: string; + sale: string; + malize:string; + } + + const [info, setInfo] = useState([]) + const [checked, setChecked] = useState([true, false]); + const [items, setItems] = useState([ + { id: 1, name: '[국내도서]시작하세요! C# 10프로그래밍', text:"*밤 11시 잠들기전 배송", + price:"정가: 36000", sale:"판매가:32,400", malize:"마일리지: 1,800원"}, + { id: 2, name: '도서명2', text:"*밤 11시 잠들기전 배송", + price:"정가: 36000", sale:"판매가:32,400", malize:"마일리지: 1,800원" }, + { id: 3, name: '도서명3', text:"*밤 11시 잠들기전 배송", + price:"정가: 36000", sale:"판매가:32,400", malize:"마일리지: 1,800원"}, + { id: 4, name: '도서명3', text:"*밤 11시 잠들기전 배송", + price:"정가: 36000", sale:"판매가:32,400", malize:"마일리지: 1,800원"}, + { id: 5, name: '도서명3', text:"*밤 11시 잠들기전 배송", + price:"정가: 36000", sale:"판매가:32,400", malize:"마일리지: 1,800원"}, + ]); + const [checkedItems, setCheckedItems] = useState([]); + + const handleChange1 = (event: React.ChangeEvent) => { + const checkedValue = event.target.checked; + const updatedCheckedItems = checkedValue ? items.map((item) => item.id) : []; + setCheckedItems(updatedCheckedItems); + }; + + const handleChange2 = (event: React.ChangeEvent) => { + const itemId = parseInt(event.target.name); + let updatedCheckedItems: number[] = []; + + if (event.target.checked) { + updatedCheckedItems = [...checkedItems, itemId]; + } else { + updatedCheckedItems = checkedItems.filter((id) => id !== itemId); + } + setCheckedItems(updatedCheckedItems); + }; + + const children = (itemId: number) => ( + + } + /> + + ); + + const handleChange = (e: React.ChangeEvent) => { + console.log() + setInfo({ + ...info, [e.target.name]: e.target.value + }); + }; + + return( + <> +
+ + 0 && checkedItems.length < items.length} + onChange={handleChange1} + /> +
+ } + /> + + {/*
+ 구매 +
*/} + +
+ 상품명 +
+ +
+

가격

+
+ +
+ 보관/삭제 +
+ + +
+ {items.map((item) => ( +
+
+ {children(item.id)} +
+
+ cartbookimage +
+
+ {item.name} + {item.text} +
+ +
+ {item.price} + {item.sale} + {item.malize} +
+ + + +
+ +
+
+ ))} +
+ + ) +} +export default CartItems \ No newline at end of file diff --git a/src/Components/Views/CartPage/CartPage.scss b/src/Components/Views/CartPage/CartPage.scss new file mode 100644 index 00000000..792ee031 --- /dev/null +++ b/src/Components/Views/CartPage/CartPage.scss @@ -0,0 +1,161 @@ +@mixin CartNameStyle { + height: auto; + font-size: 20px; + position: absolute; + top: 10px; +} + +@mixin TableStyle { + +} + +// 장바구니 전체 레이아웃 +.CartPage-AllLayout { + //font-family: 'SUITE-Regular'; + width: 1200px; + padding-bottom: 1400px; + position: relative; + margin: 0 auto; + font-weight: 600; + //background-color: aquamarine; + + .ProductText{ + @include CartNameStyle; + top:10px; + left: 45px; + position: absolute; + //background-color: red; + } + + .CartContainer{ + position: absolute; + display: flex; + justify-content: center; + width: inherit; + height: 500px; + top: 50px; + border-radius: 10px; + background-color: rgb(249, 249, 249); + } + + //장바구니 나타나는 부분 + .CartPageTable { + position: relative; + width: 1200px; + //padding-bottom: 520px; + //background-color: #7fe41f; + margin: 0 auto; + left: 0; + right: 0; + top: 50px; + } + + .RentText{ + //background-color: olive; + position: absolute; + font-size: 20px; + top: 600px; + left: 45px; + } + + .RentContainer { + position: absolute; + display: flex; + justify-content: center; + width: inherit; + //height: 500px; + padding-bottom: 50px; + top: 640px; + //background-color: rgb(207, 119, 245); + } + + .BuyText { + //background-color: olive; + position: absolute; + height: 50px; + font-size: 20px; + bottom: 200px; + left: 45px; + } + + .BuyContainer{ + position: absolute; + //justify-content: center; + width: inherit; + padding-bottom: 200px; + bottom:10px; + background-color: #EDDBC7; + + .NowBuy{ + width: 500px; + position: absolute; + height: 100px; + //margin: 0 auto; + left: 100px; + //right: 0; + //background-color: wheat; + border-bottom: 2px solid black; + //bottom: 100px; + + .Buy-Container { + width: 250px; + position: absolute; + padding-bottom: 10px; + //background-color: gold; + margin: 0 auto; + left: 0; + right: 0; + top: 30px; + + .Pay-Container { + width: inherit; + height: 30px; + //background-color: rosybrown; + display: flex; + gap: 40px; + } + } + } + + .AllCount-Container { + width: 500px; + position: absolute; + height: 50px; + //background-color: rebeccapurple; + top: 120px; + left: 100px; + + .AllCount-Container__box{ + width: 300px; + height: 50px; + //background-color: darkblue; + display: flex; + gap: 50px; + margin: 0 auto; + } + } + + .Buy-ButtonBox{ + width: 300px; + height: 55px; + //background-color: firebrick; + position: absolute; + right: 100px; + top: 50px; + + button{ + width: inherit; + height: inherit; + border-radius: 5px; + color: white; + font-weight: bold; + background-color: #F99417; + border: none; + } + } + } + + +} + + diff --git a/src/Components/Views/CartPage/CartPage.tsx b/src/Components/Views/CartPage/CartPage.tsx new file mode 100644 index 00000000..915c301f --- /dev/null +++ b/src/Components/Views/CartPage/CartPage.tsx @@ -0,0 +1,80 @@ +import './CartPage.scss' +import { FormEvent, useState } from 'react'; +import CartItems from './CartItems/CartItems'; +import { Value } from 'sass'; +import RentalItems from './CartRent/CartRent'; + + +function CartPage() { + + // const [rentalbook, setRentalBook] = useState([ + // { id: 1, name: '[국내도서]시작하세요! C# 10프로그래밍', text:"*밤 11시 잠들기전 배송", + // price:"정가: 36000", sale:"판매가:32,400", malize:"마일리지: 1,800원"}, + // ]) + + const Text = { + '1':'상품명', + '2':'가격', + '3':'수량', + '4':'대여날자', + } as const; + + const BuyProducts = () => { + alert("주문완료!") + } + + return ( + <> +
+ + {/*
*/} + + 구매 +
+ +
+ + + {/*
*/} + + {/* 여기에서는 대여 부분 */} + 대여 +
+ +
+ + + 결제 +
+ +
+
+
+ 총 상품 가격 + 28,000 +
+ +
+ 총 주문 상품수 + 1종 1권(개) +
+
+
+ +
+
+ 총 결제 예상 금액 + 28,000 원 +
+
+ +
+ +
+ +
+
+ + ); +} +export default CartPage; \ No newline at end of file diff --git a/src/Components/Views/CartPage/CartRent/CartRent.scss b/src/Components/Views/CartPage/CartRent/CartRent.scss new file mode 100644 index 00000000..4b2840e1 --- /dev/null +++ b/src/Components/Views/CartPage/CartRent/CartRent.scss @@ -0,0 +1,133 @@ +@mixin CartNameStyle { + height: auto; + //background-color: rgb(14, 133, 237); + font-size: 20px; + position: absolute; + top: 10px; +} + +.RentPageTable{ + width: inherit; + height: 45px; + // background-color: #bff12b; + background-color: #f6e4cc; + position: absolute; + + .Rent-LableBox{ + width: 40px; + height: 40px; + //background-color: #e18b8b; + margin-left: 50px; + margin-top: 5px; + position: absolute; + font-size: 30px; + } + + .Rental-Namebox{ + @include CartNameStyle; + left: 300px; + } + + .Renatal-Price{ + @include CartNameStyle; + right: 420px; + } + + .RentDay{ + @include CartNameStyle; + right: 100px; + } +} + +.Rental-ItemsContainer { + width: 1300px; + top: 50px; + position: relative; + //background-color: #d16f14; + max-height: 450px; /* 스크롤 영역의 최대 높이 설정 */ + overflow-y: auto; /* 세로 스크롤 생성 */ + + .Rental-ItemContainer { + width: 1180px; + height: 90px; + position: relative; + margin-top: 20px; + border-bottom: 2px solid rgb(202, 159, 18); + + .Rental-CheckContainer{ + width: 60px; + height: 40px; + position: absolute; + top: 12px; + left: 30px; + } + + .ImageBox{ + width: 100px; + height: 100px; + margin-left: 150px; + + img{ + position: absolute; + width: inherit; + height: 80px; + } + } + + .Rental-TextInner { + width: 400px; + height: 100px; + position: absolute; + top: 1px; + left: 260px; + font-size: 20px; + + span:nth-child(1) { + position: absolute; + font-size: 20px; + } + + span:nth-child(2) { + position: absolute; + margin-top: 35px; + font-size: 15px; + } + } + + .Rental-PriceInner{ + width: 120px; + height: 30px; + position: absolute; + top: 20px; + right: 370px; + ///background-color: olivedrab; + display: table-column; + font-size: 18px; + + span { + position: absolute; + //background-color: red; + } + } + + .Rental-RentDay{ + width: 70px; + height: 30px; + position: absolute; + top: 20px; + right: 80px; + background-color: olivedrab; + display: table-column; + font-size: 18px; + + span{ + width: 50px; + position: absolute; + margin: 0 auto; + left: 0; + right: 0; + background-color: #bff12b; + } + } + } +} \ No newline at end of file diff --git a/src/Components/Views/CartPage/CartRent/CartRent.tsx b/src/Components/Views/CartPage/CartRent/CartRent.tsx new file mode 100644 index 00000000..4d309b06 --- /dev/null +++ b/src/Components/Views/CartPage/CartRent/CartRent.tsx @@ -0,0 +1,123 @@ +import React from "react" +import { useState } from "react"; +import Box from '@mui/material/Box'; +import Checkbox from '@mui/material/Checkbox'; +import FormControlLabel from '@mui/material/FormControlLabel'; +//import YearBox from "Common/section/number"; +// import './CartItems.scss' +import './CartRent.scss' + +function RentalItems() { + + interface Item { + id: number; + // image:string; + name: string; + text: string; + rentprice: string; + day:string; + } + + const [checked, setChecked] = useState([true, false]); + const [items, setItems] = useState([ + { id: 1, name: '[국내도서]코어 자바스크립트', text:"*+2추가 대여 이벤트 진행", + rentprice:"대여가: 18000", day:"7일"}, + { id: 2, name: '[국내도서]코어 자바스크립트', text:"*+2추가 대여 이벤트 진행", + rentprice:"대여가: 18000", day:"7일"}, + { id: 3, name: '[국내도서]코어 자바스크립트', text:"*+2추가 대여 이벤트 진행", + rentprice:"대여가: 18000", day:"7일"}, + { id: 4, name: '[국내도서]코어 자바스크립트', text:"*+2추가 대여 이벤트 진행", + rentprice:"대여가: 18000", day:"7일"}, + + ]); + const [checkedItems, setCheckedItems] = useState([]); + + const handleChange1 = (event: React.ChangeEvent) => { + const checkedValue = event.target.checked; + const updatedCheckedItems = checkedValue ? items.map((item) => item.id) : []; + setCheckedItems(updatedCheckedItems); + }; + + const handleChange2 = (event: React.ChangeEvent) => { + const itemId = parseInt(event.target.name); + let updatedCheckedItems: number[] = []; + + if (event.target.checked) { + updatedCheckedItems = [...checkedItems, itemId]; + } else { + updatedCheckedItems = checkedItems.filter((id) => id !== itemId); + } + setCheckedItems(updatedCheckedItems); + }; + + const children = (itemId: number) => ( + + } + /> + + ); + + + return( + <> +
+ + 0 && checkedItems.length < items.length} + onChange={handleChange1} + /> +
+ } + /> +
+ 상품명 +
+ +
+

대여가격

+
+ + +
+ 대여날짜 +
+ + +
+ {items.map((item) => ( +
+
+ {children(item.id)} +
+
+ cartbookimage +
+
+ {item.name} + {item.text} +
+ +
+ {item.rentprice} +
+ +
+ {/* {item.day}
*/} + 135일 +
+ + +
+ ))} +
+ + ) +} +export default RentalItems \ No newline at end of file diff --git a/src/Components/Views/DetailPage/DetailPage.scss b/src/Components/Views/DetailPage/DetailPage.scss new file mode 100644 index 00000000..4056ab5e --- /dev/null +++ b/src/Components/Views/DetailPage/DetailPage.scss @@ -0,0 +1,189 @@ +@mixin PriceContainer { + width: 300px; + height: 30px; + } + + @mixin PriceText { + font-size: 20px; + height: 30px; + } + + @mixin PriceNumber{ + font-size: 20px; + margin-left: 50px; + } + + .DetailContainer { + position: relative; + width: 1400px; + margin: 0 auto; + left: 0; + right: 0; + //font-family: 'Dovemayo_gothic'; + + .ImgContainer{ + height: 780px; + position: relative; + } + + .LeftContainer { + width: 600px; + max-width: 500px; + //background-color: yellow; + position: absolute; + height: 650px; + top: 60px; + left: 100px; + z-index: 100; + + .TitleBox{ + width: 250px; + height: 60px; + position: absolute; + margin: 0 auto; + left: 0; + right: 0; + //background-color: red; + + p{ + font-size: 40px; + } + } + .BookimgBox{ + width: 450px; + height: 560px; + border-radius: 10px; + background-color: rgb(253, 251, 251); + border: 2px solid rgb(116, 45, 1); + position: absolute; + top: 80px; + margin: auto; + left: 0; + right: 0; + + img{ + width: 360px; + height: auto; + position: absolute; + margin: auto; + left: 0; + right: 0; + } + } + } + + .RightContainer{ + width: 500px; + max-width: 500px; + padding-bottom: 540px; + //background-color: yellow; + position: absolute; + top: 100px; + right: 130px; + z-index: 100; + + .RightContainer-TopText{ + width: 300px; + height: 60px; + font-size: 20px; + color: rgb(234, 72, 99); + } + + .RightContainer-Content{ + width: inherit; + height: 400px; + //background-color: blue; + position: absolute; + top: 100px; + + + .OriginPrice{ + @include PriceContainer; + margin-top: 20px; + //background-color: aliceblue; + //position: relative; + + .PriceText{ + @include PriceText; + //background-color: yellow; + } + + .PriceNumber{ + @include PriceNumber; + //background-color: rgb(18, 220, 18); + } + } + + .ContentContainer{ + width: 400px; + height: 200px; + //background-color: blanchedalmond; + margin-top: 10px; + position: relative; + + .ContentBox{ + width: 200px; + height: 100px; + //background-color: olive; + font-size: 20px; + } + + .contentText{ + width: 400px; + height: 100px; + //background-color: orangered; + position: absolute; + top: 40px; + left: 0; + right: 0; + } + } + + + .CardPrice{ + width: 350px; + height: 30px; + //background-color: palevioletred; + margin-top: 10px; + + .CardText{ + font-size: 20px; + height: 30px; + //background-color: yellow; + } + + .PriceNumber{ + @include PriceNumber; + } + } + + .ButtonContainer{ + width: 400px; + height: 50px; + //background-color: orchid; + position: relative; + margin: 0 auto; + margin-top: 20px; + + .CartAdd{ + width: 150px; + height: 50px; + background-color: palegreen; + position: absolute; + margin: auto; + } + + .BookBill{ + width: 150px; + height: 50px; + background-color: rgb(228, 207, 13); + position: absolute; + right: 20px; + } + } + } + } + + + } + \ No newline at end of file diff --git a/src/Components/Views/DetailPage/DetailPage.tsx b/src/Components/Views/DetailPage/DetailPage.tsx new file mode 100644 index 00000000..0421fd81 --- /dev/null +++ b/src/Components/Views/DetailPage/DetailPage.tsx @@ -0,0 +1,101 @@ +import BookCustom from '../../../bookcustom/bookcustom' +import axios from 'axios'; +import { useEffect, useState } from 'react'; +import './DetailPage.scss' + + +const { VITE_CLIENT_ID } = import.meta.env; +const ajax = axios.create({ + baseURL: '/cafe24/api/v2', + headers: { + 'Content-Type': 'application/json', + 'X-Cafe24-Client-Id': VITE_CLIENT_ID, + }, +}); + + +function DetailPage(){ + + const [detail, setDetail] = useState({} as Product); + async function getDetails() { + try { + const { data } = await ajax.get('/products/21'); + setDetail(data.product); + } catch (err) { + console.log(err); + } + } + + + useEffect(() => { + (async () => { + await getDetails(); + })(); + }, []); + + + return( + <> + +
+
+ +
+ +
+
+

제목입니다.

+
+
+ bookimgs +
+
+ +
+
+

책모양 아크릴 거울
(대상 도서 포함 3만원 이상 구매 시)

+
+ +
+
+ 정가 + 22,000 +
+
+ 판매가 + 22,000 +
+
+ 수량 + 22,000 +
+
+ 줄거리 + +

더 이상 설명이 필요 없는 20세기 환경학 최고의 고전 [침묵의 봄]이 + 50주년 기념 개정판으로 나왔다. 이번 개정판에는 서문과 후기가 + 완전히 새롭게 단장되었으며, 2002년 출간본에는 없던(원서에도 + 없었음) 찾아보기를 새롭게 추가했다. 그리고 편집과 장정도 완전히 + 바뀌었다.

+
+
+
+ 카드 + 무이자 할부 + 소득공제300원 +
+ +
+ + +
+
+
+ +
+ +
+ + ) +} +export default DetailPage \ No newline at end of file diff --git a/src/Components/Views/MyPage/MyPage.scss b/src/Components/Views/MyPage/MyPage.scss new file mode 100644 index 00000000..c1d69768 --- /dev/null +++ b/src/Components/Views/MyPage/MyPage.scss @@ -0,0 +1,193 @@ +// .MyPageContainer{ +// width: 1200px; +// padding-bottom: 820px; +// //height: auto; +// background-color: rgb(157, 247, 244); +// position: relative; +// margin: 0 auto; +// } + + +.MyPage-AllLayout { + width: 1200px; + padding-bottom: 950px; + position: relative; + margin: 0 auto; + background-color: rgb(157, 247, 244); + + .myPageContainer{ + //background-color: rgb(204, 89, 89); + width: 1100px; + position: absolute; + display: flex; + margin: 0 auto; + left: 0; + right: 0; + top:30px; + + .subContainer{ + width: 250px; + padding-bottom: 300px; + // background-color: aliceblue; + background-color: #F2E7D5; + border-radius: 10px 0px 0px 10px; + + .profile{ + //border: solid 1px rgb(228, 169, 114); + position: relative; + top:21.5px; + height: 250px; + background-color: bisque; + + .profilePhoto{ + position: relative; + top:20px; + width: 120px; + height: 120px; + margin-left: auto; + margin-right: auto; + border: solid 1px rgb(243, 214, 172); + border-radius: 50%; + box-shadow: 2px 5px 5px rgb(0,0,0,.3); + background-image: url(./59932b0eb046f9fa3e063b8875032edd_crop.jpeg); + background-position: center; + background-size: contain; + background-repeat: no-repeat; + overflow: hidden; + object-fit: cover; + } + + .profileContainer{ + position: relative; + margin-top: 2.5rem; + color:black; + text-align: center; + + .profileName{ + font-size: 20px; + font-weight: 1000; + } + + .profileText{ + font-size: 15px; + margin-top: 1rem; + } + } + } + + .category { + flex-direction: column; + position: relative; + height: 350px; + top:30px; + //background-color: #ca8b25; + //border: solid 1px rgb(185, 58, 58); + + .categoryTap { + font-weight: bold; + padding: 15px; + color: black; + //background-color: #f8e4d1; + //padding: 1.2rem 0 0 0; + border-bottom: solid 2px rgb(239, 211, 174); + text-align: center; + } + } + } + + .detailsContainer{ + width: 75%; + flex-direction: column; + border-radius: 0px 10px 10px 0px; + background-color: rgb(255, 255, 255); + + .orderContainer{ + position: relative; + padding-bottom: 50px; + background-color: rgb(148, 255, 124); + top: 50px; + + .orderText{ + position: relative; + left:3rem; + width: 120px; + font-size: 20px; + margin-left: 2rem; + background-color: #F2E7D5; + } + + + .orderBox{ + position: relative; + background-color: cadetblue; + border: dotted 1px black; + width:700px; + display: flex; + margin: 0 auto; + top: 20px; + max-width: 650px; /* 스크롤 영역의 최대 높이 설정 */ + overflow-x: auto; + + .orderList{ + background-image: url(./8954699375_2.jpg); + background-position: center; + background-size: contain; + width: 300px; + height: 300px; + margin-left: 10px; + gap: 10px; + display: flex; + background-repeat: no-repeat; + background-color: rebeccapurple; + } + + } + } + + + .rentContainer{ + position: relative; + //height: 40%; + top: 120px; + padding-bottom: 100px; + //background-color: rgb(192, 38, 244); + + .rent{ + position: relative; + // background-color: rgb(224, 57, 57); + top:3rem; + + .rentText{ + font-size: 20px; + font-weight:700; + color:black; + padding: 0 0 0 6rem; + } + + .rentBox{ + position: relative; + margin: 2rem 6rem 0 6rem; + // background-color: cadetblue; + border:dotted 1px black; + width:auto; + height: 12rem; + display: flex; + flex-wrap: nowrap; + + + .rentList{ + background-image: url(./8954699375_2.jpg); + background-position: center; + background-size: contain; + background-repeat: no-repeat; + overflow: hidden; + padding: 3rem; + // width: 100%; + margin:0 auto; + } + } + } + } + } + } +} \ No newline at end of file diff --git a/src/Components/Views/MyPage/MyPage.tsx b/src/Components/Views/MyPage/MyPage.tsx new file mode 100644 index 00000000..0fde3be1 --- /dev/null +++ b/src/Components/Views/MyPage/MyPage.tsx @@ -0,0 +1,80 @@ +// import { useState, useEffect } from 'react'; +import { Link } from 'react-router-dom'; +import './MyPage.scss' + +function MyPage () { + return( + <> +
+
+ +
+
+
+
+
+

닉네임

+
+
+

프로필 자기소개란입니다.

+
+
+
+
+ +
주문내역조회
+
+ +
회원정보 수정
+
+ +
배송지 관리
+
+ +
결제수단 관리
+
+ +
1:1 문의
+
+
+
+ + + +
+
+ + +
+ 구매 내역 +
+ +
+
+
+
+
+
+
+ +
+ +
+
+
대여 내역
+
+ {/*
+
+
+
*/} +
+
+
+
+
+
+ + ) +} + +export default MyPage diff --git a/src/Components/Views/MyPage/UserInfo.scss b/src/Components/Views/MyPage/UserInfo.scss new file mode 100644 index 00000000..87ecabda --- /dev/null +++ b/src/Components/Views/MyPage/UserInfo.scss @@ -0,0 +1,220 @@ + .myPageContainer{ + background-color: white; + width: 1600px; + height: 900px; + position: relative; + left: 200px; + display: flex; + + .subContainer{ + width: 25%; + // background-color: red; + + .profile{ + border: solid 1px rgb(221, 221, 221); + position: relative; + top:21.5px; + height: 250px; + // background-color: bisque; + + .profilePhoto{ + position: relative; + top:20px; + width: 120px; + height: 120px; + margin-left: auto; + margin-right: auto; + border: solid 1px rgb(221,221,221); + border-radius: 50%; + box-shadow: 2px 5px 5px rgb(0,0,0,.3); + background-image: url(./59932b0eb046f9fa3e063b8875032edd_crop.jpeg); + background-position: center; + background-size: contain; + background-repeat: no-repeat; + overflow: hidden; + object-fit: cover; + } + + .profileContainer{ + position: relative; + margin-top: 2.5rem; + color:black; + text-align: center; + + .profileName{ + font-size: 20px; + font-weight: 1000; + } + + .profileText{ + font-size: 15px; + margin-top: 1rem; + } + } + } + + .category { + // margin-top: 4rem; + display: block; + flex-direction: column; + // background-color: gray; + position: relative; + height: auto; + top:20px; + border: solid 1px rgb(221, 221, 221); + + .categoryTap { + font-weight: 700; + padding: 1.2rem 0 0 0; + border-top: solid 1px rgb(221, 221, 221); + text-align: center; + } + } + } + + .detailsContainer{ + width: 75%; + flex-direction: column; + // background-color: aquamarine; + + .infoContainer{ + position: relative; + top: 3rem; + margin-left: 3rem; + margin-right: 3rem; + height: 90%; + border: solid 1px rgb(221,221,221); + // background-color: rgb(124, 255, 255); + + .info{ + position: relative; + // background-color: rgb(224, 57, 57); + top:3rem; + + .infoTag{ + display: flex; + + .infoText{ + position: relative; + left:2rem; + // border: solid 1px black; + font-size: 24px; + font-weight: 900; + color:black; + padding:.5rem 1rem; + margin-left: 2rem; + } + } + + .infoBox{ + position: relative; + margin: 2rem 4rem 0 4rem; + // background-color: cadetblue; + // border: dotted 1px black; + width:auto; + height: 30rem; + // display: flex; + + .infoList{ + display:flex; + // background-color: rgb(245, 242, 97); + padding: 1.5rem 1.2rem; + + + .infoTitle{ + width: 8rem; + padding-top: 10px; + text-align: center; + } + + .infoItem{ + .infoItemForm{ + padding: 15px; + margin-left: 15px; + width:500px; + background-color: white; + border: solid 1px rgb(221, 221, 221); + border-radius: .5rem; + } + + .infoPic{ + padding: 15px; + margin-left: 10px; + width: 200px; + background-color: white; + border: solid 1px rgb(221,221,221); + color: gray; + } + + } + + .infoFix{ + background-color:rgb(53, 197, 240); + border-radius: .5rem; + margin-left: 10rem; + padding: 15px; + width: 18rem; + color:white; + font-weight: 700; + font-size: 18px; + } + + + // background-position: center; + // background-size: contain; + // background-repeat: no-repeat; + // overflow: hidden; + // padding-top: 30px; + // width: 100px; + // margin:0 auto; + } + } + } + } + + + // .rentContainer{ + // position: relative; + // height: 40%; + // // background-color: rgb(124, 255, 255); + + // .rent{ + // position: relative; + // // background-color: rgb(224, 57, 57); + // top:3rem; + + // .rentText{ + // font-size: 20px; + // font-weight:700; + // color:black; + // padding: 0 0 0 6rem; + // } + + // .rentBox{ + // position: relative; + // margin: 2rem 6rem 0 6rem; + // // background-color: cadetblue; + // border:dotted 1px black; + // width:auto; + // height: 12rem; + // display: flex; + // flex-wrap: nowrap; + + + // .rentList{ + // background-image: url(./8954699375_2.jpg); + // background-position: center; + // background-size: contain; + // background-repeat: no-repeat; + // overflow: hidden; + // padding: 3rem; + // // width: 100%; + // margin:0 auto; + // } + // } + // } + // } + + + } + } \ No newline at end of file diff --git a/src/Components/Views/MyPage/UserInfo.tsx b/src/Components/Views/MyPage/UserInfo.tsx new file mode 100644 index 00000000..479720cc --- /dev/null +++ b/src/Components/Views/MyPage/UserInfo.tsx @@ -0,0 +1,122 @@ +// import { useState, useEffect } from 'react'; +import { Link } from 'react-router-dom'; +import './userInfo.scss' + +function userInfo () { + return( + <> +
+
+ My Page +
+
+
+
+

닉네임

+
+
+

프로필 자기소개란입니다.

+
+
+
+
+ +
주문내역조회
+
+ +
회원정보 수정
+
+ +
배송지 관리
+
+ +
결제수단 관리
+
+ +
1:1 문의
+
+
+
+ + +
+ +
+
+
+
회원정보 수정
+
+
+
+
+
아이디
+
+ +
+
+
+
비밀번호
+
+ +
+
+
+
닉네임
+
+ +
+
+
+
한줄 소개
+
+ +
+
+
+
프로필 이미지
+
+ +
+
+
+
+ +
+
+ +
+ + +
+ + +
+
+ + + + + {/*
+
+
대여 내역
+
+
+
+
+
+
+
+
*/} + + + +
+ + +
+ + + ) +} + +export default userInfo diff --git a/src/bookcustom/bookcustom.scss b/src/bookcustom/bookcustom.scss new file mode 100644 index 00000000..f7867d5d --- /dev/null +++ b/src/bookcustom/bookcustom.scss @@ -0,0 +1,165 @@ +@import url(https://fonts.googleapis.com/css?family=Crimson+Text:400,700,900,400italic,700italic,900italic|Playfair+Display:400,700,900,400italic,700italic,900italic|Rock+Salt:400); + + + +#container { + float: left; + padding: 1em; + width: 100%; +} + +/*** OPEN BOOK ***/ +.open-book { + width: 1300PX; + box-shadow: rgba(0,0,0,0.5) 0 1em 3em; + padding: 0.7em; + background-color:rgb(129, 90, 4); +} + +.open-book * { + position: relative; + height: 700px; + background-color:rgb(255, 255, 254); +} + + +/* Body Copy */ +.open-book article { + line-height: 1.5; +} + +.open-book article *:not(.chapter-title):not(hr):not(dl) { + margin: 0 auto; + max-width: 28.125em; +} + +.open-book article > ul ul { + padding-left: 1em; +} + +.open-book hr { + background-color: #000; + border: 0; + height: 2px; + margin: 1em 0; +} + +/*** MEDIA QUERIES ***/ +@media only screen and ( min-width: 50em ) { + + .open-book { + margin: 1em; + position: relative; + } + + // .open-book:before { + // background-color: #8B4513; + // border-radius: 0.25em; + // bottom: -1em; + // content: ''; + // left: -1em; + // position: absolute; + // right: -1em; + // top: -1em; + // z-index: -1; + // } + + .open-book:after { + background: linear-gradient(to right, transparent 0%,rgba(0,0,0,0.2) 46%,rgba(0,0,0,0.5) 49%,rgba(0,0,0,0.6) 50%,rgba(0,0,0,0.5) 51%,rgba(0,0,0,0.2) 52%,transparent 100%); + bottom: 0.5em; + content: ''; + left: 50%; + position: absolute; + top: 0.5em; + transform: translate(-50%,0); + width: 3em; + z-index: 1; + } + + .open-book > * { + column-count: 2; + column-gap: 6em; + position: relative; + z-index: 1; + } + + /* Header/Footer */ + .open-book header:before, + .open-book header:after, + .open-book footer:before, + .open-book footer:after { + background: #fff; + border-radius: 25%; + content: ''; + height: 2em; + position: absolute; + z-index: -1; + width: calc(50% + 2em); + } + + .open-book header:before, + .open-book footer:before, + .open-book footer:after { + border-top-left-radius: 0; + } + + .open-book header:after, + .open-book footer:before, + .open-book footer:after { + border-top-right-radius: 0; + } + + .open-book header:before, + .open-book header:after, + .open-book footer:after { + border-bottom-right-radius: 0; + } + + .open-book header:before, + .open-book header:after, + .open-book footer:before { + border-bottom-left-radius: 0; + } + + .open-book header:before, + .open-book header:after { + top: -2.65em; + } + + .open-book header:before, + .open-book footer:before { + right: 50%; + } + + .open-book header:before { + transform: rotate(-2deg); + } + + .open-book header:after, + .open-book footer:after { + left: 50%; + } + + .open-book header:after { + transform: rotate(2deg); + } + + .open-book footer:before, + .open-book footer:after { + bottom: -2.65em; + } + + .open-book footer:before { + transform: rotate(2deg); + } + + .open-book footer:after { + transform: rotate(-2deg); + } + + .open-book header > *:last-child, + .open-book footer > *:last-child { + text-align: right; + } + +} \ No newline at end of file diff --git a/src/bookcustom/bookcustom.tsx b/src/bookcustom/bookcustom.tsx new file mode 100644 index 00000000..375753a2 --- /dev/null +++ b/src/bookcustom/bookcustom.tsx @@ -0,0 +1,23 @@ +import'./bookcustom.scss' + + +function BookCustom(){ + return( + <> +
+
+
+
+ +
+
+
+
+ + ) +} +export default BookCustom + + + + diff --git a/src/index.scss b/src/index.scss new file mode 100644 index 00000000..e69de29b diff --git a/src/main.tsx b/src/main.tsx new file mode 100644 index 00000000..39808af3 --- /dev/null +++ b/src/main.tsx @@ -0,0 +1,22 @@ +import React from 'react' +import ReactDOM from 'react-dom/client' +import App from './App.tsx' +import './index.scss' +import { Provider } from 'react-redux'; +import store from './store/' +//import ReduxThunk from 'redux-thunk'; +// import thunk from 'redux-thunk'; +// import { createStore, applyMiddleware } from 'redux'; +// import reducer from '_reducers/user_reducer.tsx'; + + +//const createStoreWithMiddleware = applyMiddleware(promiseMiddleware, ReduxThunk)(createStore); +//const store = createStore(reducer, applyMiddleware(thunk)); + +ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render( + + + + + +) diff --git a/src/routes/privateRoute.tsx b/src/routes/privateRoute.tsx new file mode 100644 index 00000000..9730da17 --- /dev/null +++ b/src/routes/privateRoute.tsx @@ -0,0 +1,22 @@ +import { Navigate } from 'react-router-dom'; + + +function PrivatePage({component:Component, status:Status}) { + + const token = localStorage.getItem("token") + + let tokenCheck = false; + let result = null; + + if(token){ + tokenCheck = true; + } + + if(tokenCheck){ + result = Component; + } else { + !Status ? result = : result = Status; + } + return result; +} +export default PrivatePage \ No newline at end of file diff --git a/src/routes/routes.tsx b/src/routes/routes.tsx new file mode 100644 index 00000000..63546b65 --- /dev/null +++ b/src/routes/routes.tsx @@ -0,0 +1,50 @@ +import Header from 'Common/Layout/Header/header' +import Footer from 'Common/Layout/Footer/footer' +import MainPage from 'Components/Views/MainPage/mainPage' +import Join from 'Common/Form/Signin/join' +import Login from 'Common/Form/Login/login' +import CartPage from 'Components/Views/CartPage/CartPage' +import MyPage from 'Components/Views/MyPage/MyPage' +import PrivatePage from './privateRoute' +import DetailPage from 'Components/Views/DetailPage/DetailPage' + +import { Routes, BrowserRouter, Route, Outlet } from 'react-router-dom' + + const Layout = () => { + return( + <> +
+ +
+ + ); } -export default Header - +export default Header; diff --git a/src/Components/Views/DetailPage/DetailPage.tsx b/src/Components/Views/DetailPage/DetailPage.tsx index 0421fd81..461799ee 100644 --- a/src/Components/Views/DetailPage/DetailPage.tsx +++ b/src/Components/Views/DetailPage/DetailPage.tsx @@ -1,101 +1,92 @@ -import BookCustom from '../../../bookcustom/bookcustom' -import axios from 'axios'; +import BookCustom from '../../../bookcustom/bookcustom'; import { useEffect, useState } from 'react'; -import './DetailPage.scss' - - -const { VITE_CLIENT_ID } = import.meta.env; -const ajax = axios.create({ - baseURL: '/cafe24/api/v2', - headers: { - 'Content-Type': 'application/json', - 'X-Cafe24-Client-Id': VITE_CLIENT_ID, - }, -}); - - -function DetailPage(){ +import './DetailPage.scss'; +import { useParams } from 'react-router-dom'; +import { getDetail } from '@/Apis/productApi'; +function DetailPage() { const [detail, setDetail] = useState({} as Product); + const { productNo } = useParams(); async function getDetails() { try { - const { data } = await ajax.get('/products/21'); + const data = await getDetail(productNo as string); setDetail(data.product); } catch (err) { console.log(err); } } - useEffect(() => { (async () => { await getDetails(); })(); }, []); - - return( + return ( <> - -
-
- -
- -
-
-

제목입니다.

+
+
+
-
- bookimgs -
-
-
-
-

책모양 아크릴 거울
(대상 도서 포함 3만원 이상 구매 시)

-
- -
-
- 정가 - 22,000 -
-
- 판매가 - 22,000 +
+
+

제목입니다.

-
- 수량 - 22,000 +
+ bookimgs
-
- 줄거리 - -

더 이상 설명이 필요 없는 20세기 환경학 최고의 고전 [침묵의 봄]이 - 50주년 기념 개정판으로 나왔다. 이번 개정판에는 서문과 후기가 - 완전히 새롭게 단장되었으며, 2002년 출간본에는 없던(원서에도 - 없었음) 찾아보기를 새롭게 추가했다. 그리고 편집과 장정도 완전히 - 바뀌었다.

-
-
-
- 카드 - 무이자 할부 - 소득공제300원 +
+ +
+
+

+ 책모양 아크릴 거울
+ (대상 도서 포함 3만원 이상 구매 시) +

-
- - +
+
+ 정가 + 22,000 +
+
+ 판매가 + 22,000 +
+
+ 수량 + 22,000 +
+
+ 줄거리 + +

+ 더 이상 설명이 필요 없는 20세기 환경학 최고의 고전 [침묵의 + 봄]이 50주년 기념 개정판으로 나왔다. 이번 개정판에는 서문과 + 후기가 완전히 새롭게 단장되었으며, 2002년 출간본에는 + 없던(원서에도 없었음) 찾아보기를 새롭게 추가했다. 그리고 + 편집과 장정도 완전히 바뀌었다. +

+
+
+
+ 카드 + 무이자 할부 + 소득공제300원 +
+ +
+ + +
-
- -
+
- ) + ); } -export default DetailPage \ No newline at end of file +export default DetailPage; diff --git a/src/Components/Views/MainPage/Component/Carousel.tsx b/src/Components/Views/MainPage/Component/Carousel.tsx index 1066b6ea..ac69fb3d 100644 --- a/src/Components/Views/MainPage/Component/Carousel.tsx +++ b/src/Components/Views/MainPage/Component/Carousel.tsx @@ -63,7 +63,7 @@ export default function Carousel() { > {arr.map((v, i) => (
- +
))}
diff --git a/src/Components/Views/MainPage/Component/Genre.tsx b/src/Components/Views/MainPage/Component/Genre.tsx index 46e53818..e9b08323 100644 --- a/src/Components/Views/MainPage/Component/Genre.tsx +++ b/src/Components/Views/MainPage/Component/Genre.tsx @@ -1,6 +1,7 @@ import axios from 'axios'; import { useEffect, useState } from 'react'; import { getList } from '@/Apis/productApi'; +import { Link } from 'react-router-dom'; interface Props { type: string; @@ -31,7 +32,11 @@ export default function Genre({ category }: { category: Props }) {
{list && list.map((item) => ( -
+ {item.product_name}
{item.product_name},{item.product_no} @@ -39,7 +44,7 @@ export default function Genre({ category }: { category: Props }) {
{item.retail_price}
{item.price}
{item.main ? item.main.map((v) =>
{v}
) : null} -
+ ))}
diff --git a/src/Components/Views/MainPage/Component/Main.tsx b/src/Components/Views/MainPage/Component/Main.tsx index f1a9880a..f3fb6cef 100644 --- a/src/Components/Views/MainPage/Component/Main.tsx +++ b/src/Components/Views/MainPage/Component/Main.tsx @@ -43,24 +43,19 @@ export default function Main() { return (
-
-
    - {category.map((item) => ( -
  • - {item.type} -
  • - ))} -
- -
- {/* CATEGORY */} - {category.map((item) => ( - - ))} -
+
    + {category.map((item) => ( +
  • + {item.type} +
  • + ))} +
+ +
+ {/* CATEGORY */} + {category.map((item) => ( + + ))}
); diff --git a/src/Components/Views/MainPage/Component/Recommand.scss b/src/Components/Views/MainPage/Component/Recommand.scss new file mode 100644 index 00000000..2f329206 --- /dev/null +++ b/src/Components/Views/MainPage/Component/Recommand.scss @@ -0,0 +1,41 @@ +.recommand { + border: 2px solid; + border-radius: 10px; + margin-top: 100px; + overflow: hidden; + + h1 { + border-bottom: 1px solid; + } +} +.recommand-wrapper { + display: grid; + grid-template-columns: 2fr 8fr; +} +.title { + border-right: 1px solid; + padding: 10px 10px; + cursor: pointer; + &:not(:last-child) { + border-bottom: 1px solid; + } +} +.description { + position: relative; + padding: 5% 5%; + background-color: rgb(254, 246, 243); + + a { + position: absolute; + font-size: 0.8rem; + right: 10%; + bottom: 10%; + &:hover { + color: blue; + } + } +} +.selected { + border-right: none; + background-color: rgb(254, 246, 243); +} diff --git a/src/Components/Views/MainPage/Component/Recommand.tsx b/src/Components/Views/MainPage/Component/Recommand.tsx index d537fd51..5f06dd7f 100644 --- a/src/Components/Views/MainPage/Component/Recommand.tsx +++ b/src/Components/Views/MainPage/Component/Recommand.tsx @@ -1,8 +1,20 @@ import { useEffect, useState } from 'react'; import { getRecommand } from '@/Apis/productApi'; +import './Recommand.scss'; +import { Link } from 'react-router-dom'; + +type RecommandProducts = RecommandProduct[]; + +interface RecommandProduct { + shop_no: number; + product_no: number; + product_name: string; + summary_description: string; +} export default function Recommand() { - const [list, setList] = useState(); + const [list, setList] = useState(); + const [recommandBook, setRecommandBook] = useState(''); async function recommand() { try { const res = await getRecommand(); @@ -18,15 +30,39 @@ export default function Recommand() { })(); }, []); return ( -
-

Recommand!

-
- {list && - list.map((item) => ( -
-
{item.product_name}
-
- ))} +
+

추천도서

+
+
+ {list && + list.map((item) => ( +
{ + setRecommandBook(item.product_name); + }} + className={`title ${ + recommandBook === item.product_name ? 'selected' : '' + }`} + > + {item.product_name} +
+ ))} +
+ +
+ {list && + list.map((item) => { + if (recommandBook === item.product_name) { + return ( + <> + {item.summary_description} + 책 살펴보기 + + ); + } + })} +
); diff --git a/src/Components/Views/MainPage/MainPage.scss b/src/Components/Views/MainPage/MainPage.scss index 030a8cd6..cee92cc3 100644 --- a/src/Components/Views/MainPage/MainPage.scss +++ b/src/Components/Views/MainPage/MainPage.scss @@ -4,15 +4,25 @@ margin: 0; padding: 0; } -main { - position: relative; - display: flex; +.wrapper { + width: 1200px; + margin: 100px auto 0; } a { display: block; text-decoration: none; color: black; } +// CATEGORY +main { + position: relative; + display: flex; + width: 1200px; + margin: 100px auto; + .tag-box { + width: 300px; + } +} .category-menu { position: sticky; top: 0; @@ -34,16 +44,6 @@ a { border-radius: 30px; } } -// CATEGORY -.wrapper { - position: relative; - display: flex; - width: 1200px; - margin: 100px auto; - .tag-box { - width: 300px; - } -} .books { display: flex; diff --git a/src/Components/Views/MainPage/MainPage.tsx b/src/Components/Views/MainPage/MainPage.tsx index 024cf775..914d8b84 100644 --- a/src/Components/Views/MainPage/MainPage.tsx +++ b/src/Components/Views/MainPage/MainPage.tsx @@ -20,10 +20,10 @@ if (params.get('code')) { export default function MainPage() { return ( - <> +
- +
); } diff --git a/src/main.tsx b/src/main.tsx index 39808af3..a9043054 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -1,22 +1,16 @@ -import React from 'react' -import ReactDOM from 'react-dom/client' -import App from './App.tsx' -import './index.scss' -import { Provider } from 'react-redux'; -import store from './store/' +import React from 'react'; +import ReactDOM from 'react-dom/client'; +import App from './App'; +import './index.scss'; + //import ReduxThunk from 'redux-thunk'; // import thunk from 'redux-thunk'; // import { createStore, applyMiddleware } from 'redux'; // import reducer from '_reducers/user_reducer.tsx'; - //const createStoreWithMiddleware = applyMiddleware(promiseMiddleware, ReduxThunk)(createStore); //const store = createStore(reducer, applyMiddleware(thunk)); ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render( - - - - - -) + +); diff --git a/src/routes/routes.tsx b/src/routes/routes.tsx index 63546b65..71b91cde 100644 --- a/src/routes/routes.tsx +++ b/src/routes/routes.tsx @@ -1,50 +1,49 @@ -import Header from 'Common/Layout/Header/header' -import Footer from 'Common/Layout/Footer/footer' -import MainPage from 'Components/Views/MainPage/mainPage' -import Join from 'Common/Form/Signin/join' -import Login from 'Common/Form/Login/login' -import CartPage from 'Components/Views/CartPage/CartPage' -import MyPage from 'Components/Views/MyPage/MyPage' -import PrivatePage from './privateRoute' -import DetailPage from 'Components/Views/DetailPage/DetailPage' +import Header from '@/Common/Layout/Header/header'; +import Footer from '@/Common/Layout/Footer/footer'; +import MainPage from '@/Components/Views/MainPage/mainPage'; +import Join from '@/Common/Form/Signin/join'; +import Login from '@/Common/Form/Login/login'; +import CartPage from '@/Components/Views/CartPage/CartPage'; +import MyPage from '@/Components/Views/MyPage/MyPage'; +import PrivatePage from './privateRoute'; +import DetailPage from '@/Components/Views/DetailPage/DetailPage'; -import { Routes, BrowserRouter, Route, Outlet } from 'react-router-dom' +import { Routes, BrowserRouter, Route, Outlet } from 'react-router-dom'; - const Layout = () => { - return( +const Layout = () => { + return ( <> -
+
-
+
- ) -} + ); +}; function RoutesPage() { - - return( + return ( <> - - - }> - }/> - }/> - }/> - } /> - } status={""}/>}/> - } status={""}/>} - /> - - - + + + }> + } /> + } /> + } /> + } /> + } status={''} />} + /> + } status={''} />} + /> - {/* }/> */} - - - + {/* }/> */} + + + - ) + ); } -export default RoutesPage \ No newline at end of file +export default RoutesPage; diff --git a/tsconfig.json b/tsconfig.json index 5518d03d..4e0d67aa 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -7,7 +7,7 @@ "skipLibCheck": true, "baseUrl": "./", "paths": { - "@/": ["src/"] + "@/*": ["src/*"] }, /* Bundler mode */ From f5ea74cd7c3af21762cb42a21e7144900e59a42d Mon Sep 17 00:00:00 2001 From: Seo Donguk Date: Mon, 12 Jun 2023 22:02:26 +0900 Subject: [PATCH 05/75] =?UTF-8?q?Feat:=20=EC=B6=94=EC=B2=9C=EB=8F=84?= =?UTF-8?q?=EC=84=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.scss | 11 +- .../Views/CartPage/CartItems/CartItems.tsx | 189 +++++++++++------- .../Views/MainPage/Component/Recommand.scss | 72 ++++++- .../Views/MainPage/Component/Recommand.tsx | 46 ++--- 4 files changed, 200 insertions(+), 118 deletions(-) diff --git a/src/App.scss b/src/App.scss index 1b9d15cf..78fe4718 100644 --- a/src/App.scss +++ b/src/App.scss @@ -6,12 +6,13 @@ body { margin: 0; - // width: 100%; + // width: 100%; //height: 100vh; - background-color: #F8EDE3; + background-color: #f8ede3; //background-color: rebeccapurple; // font-family: 'Dovemayo_gothic'; -}; + font-family: 'SUITE-Regular'; +} a { text-decoration: none; @@ -26,8 +27,8 @@ a { @font-face { font-family: 'SUITE-Regular'; - src: url('https://cdn.jsdelivr.net/gh/projectnoonnu/noonfonts_2304-2@1.0/SUITE-Regular.woff2') format('woff2'); + src: url('https://cdn.jsdelivr.net/gh/projectnoonnu/noonfonts_2304-2@1.0/SUITE-Regular.woff2') + format('woff2'); font-weight: 400; font-style: normal; } - diff --git a/src/Components/Views/CartPage/CartItems/CartItems.tsx b/src/Components/Views/CartPage/CartItems/CartItems.tsx index 95f01b3b..473ce715 100644 --- a/src/Components/Views/CartPage/CartItems/CartItems.tsx +++ b/src/Components/Views/CartPage/CartItems/CartItems.tsx @@ -1,13 +1,12 @@ -import React from "react" -import { useState } from "react"; +import React from 'react'; +import { useState } from 'react'; import Box from '@mui/material/Box'; import Checkbox from '@mui/material/Checkbox'; import FormControlLabel from '@mui/material/FormControlLabel'; -import YearBox from "Common/section/number"; -import './CartItems.scss' +import YearBox from 'Common/section/number'; +import './CartItems.scss'; function CartItems() { - interface Item { id: number; // image:string; @@ -15,28 +14,60 @@ function CartItems() { text: string; price: string; sale: string; - malize:string; + malize: string; } - const [info, setInfo] = useState([]) + const [info, setInfo] = useState([]); const [checked, setChecked] = useState([true, false]); const [items, setItems] = useState([ - { id: 1, name: '[국내도서]시작하세요! C# 10프로그래밍', text:"*밤 11시 잠들기전 배송", - price:"정가: 36000", sale:"판매가:32,400", malize:"마일리지: 1,800원"}, - { id: 2, name: '도서명2', text:"*밤 11시 잠들기전 배송", - price:"정가: 36000", sale:"판매가:32,400", malize:"마일리지: 1,800원" }, - { id: 3, name: '도서명3', text:"*밤 11시 잠들기전 배송", - price:"정가: 36000", sale:"판매가:32,400", malize:"마일리지: 1,800원"}, - { id: 4, name: '도서명3', text:"*밤 11시 잠들기전 배송", - price:"정가: 36000", sale:"판매가:32,400", malize:"마일리지: 1,800원"}, - { id: 5, name: '도서명3', text:"*밤 11시 잠들기전 배송", - price:"정가: 36000", sale:"판매가:32,400", malize:"마일리지: 1,800원"}, + { + id: 1, + name: '[국내도서]시작하세요! C# 10프로그래밍', + text: '*밤 11시 잠들기전 배송', + price: '정가: 36000', + sale: '판매가:32,400', + malize: '마일리지: 1,800원', + }, + { + id: 2, + name: '도서명2', + text: '*밤 11시 잠들기전 배송', + price: '정가: 36000', + sale: '판매가:32,400', + malize: '마일리지: 1,800원', + }, + { + id: 3, + name: '도서명3', + text: '*밤 11시 잠들기전 배송', + price: '정가: 36000', + sale: '판매가:32,400', + malize: '마일리지: 1,800원', + }, + { + id: 4, + name: '도서명3', + text: '*밤 11시 잠들기전 배송', + price: '정가: 36000', + sale: '판매가:32,400', + malize: '마일리지: 1,800원', + }, + { + id: 5, + name: '도서명3', + text: '*밤 11시 잠들기전 배송', + price: '정가: 36000', + sale: '판매가:32,400', + malize: '마일리지: 1,800원', + }, ]); const [checkedItems, setCheckedItems] = useState([]); const handleChange1 = (event: React.ChangeEvent) => { const checkedValue = event.target.checked; - const updatedCheckedItems = checkedValue ? items.map((item) => item.id) : []; + const updatedCheckedItems = checkedValue + ? items.map((item) => item.id) + : []; setCheckedItems(updatedCheckedItems); }; @@ -51,86 +82,98 @@ function CartItems() { } setCheckedItems(updatedCheckedItems); }; - + const children = (itemId: number) => ( - + } + control={ + + } /> ); const handleChange = (e: React.ChangeEvent) => { - console.log() + console.log(); setInfo({ - ...info, [e.target.name]: e.target.value + ...info, + [e.target.name]: e.target.value, }); }; - return( + return ( <> -
- - 0 && checkedItems.length < items.length} - onChange={handleChange1} - /> -
- } - /> +
+ + 0 && checkedItems.length < items.length + } + onChange={handleChange1} + /> +
+ } + /> - {/*
+ {/*
구매
*/} -
+
상품명 -
+
-
+

가격

-
+
-
+
보관/삭제 -
-
- -
- {items.map((item) => ( -
-
- {children(item.id)} -
-
- cartbookimage -
-
- {item.name} - {item.text} -
+
+
-
- {item.price} - {item.sale} - {item.malize} -
+
+ {items.map((item) => ( +
+
{children(item.id)}
+
+ cartbookimage +
+
+ {item.name} + {item.text} +
- +
+ {item.price} + {item.sale} + {item.malize} +
-
- +
+ +
-
- ))} -
+ ))} +
- ) + ); } -export default CartItems \ No newline at end of file +export default CartItems; diff --git a/src/Components/Views/MainPage/Component/Recommand.scss b/src/Components/Views/MainPage/Component/Recommand.scss index 2f329206..7a51f994 100644 --- a/src/Components/Views/MainPage/Component/Recommand.scss +++ b/src/Components/Views/MainPage/Component/Recommand.scss @@ -1,16 +1,74 @@ .recommand { - border: 2px solid; - border-radius: 10px; - margin-top: 100px; + //border: 2px solid; + //border-radius: 10px; + margin: 100px auto 0; + width: 80%; overflow: hidden; h1 { border-bottom: 1px solid; + padding-bottom: 10px; } } .recommand-wrapper { - display: grid; - grid-template-columns: 2fr 8fr; + //display: grid; + //grid-template-columns: 2fr 8fr; + display: flex; + flex-wrap: wrap; + justify-content: space-evenly; + gap: 20px; + padding: 20px 0; + background-color: #fff; +} +.test { + width: calc(100% / 4); + height: 150px; + overflow: hidden; + border-radius: 10px; + + h3 { + padding: 10px 5px; + text-align: center; + } + p { + padding: 5px; + } + + &:nth-child(1) { + background-color: #3e47bc; + color: #fafffb; + p { + color: #c3c2ea; + } + } + &:nth-child(2) { + background-color: #8edcb4; + color: #000000; + p { + color: #56886f; + } + } + &:nth-child(3) { + background-color: #f8e83b; + color: #000201; + p { + color: #807718; + } + } + &:nth-child(4) { + background-color: #f8ff97; + color: #000004; + p { + color: #9c9f5a; + } + } + &:nth-child(5) { + background-color: #f1eae2; + color: #000000; + p { + color: #94918c; + } + } } .title { border-right: 1px solid; @@ -35,7 +93,3 @@ } } } -.selected { - border-right: none; - background-color: rgb(254, 246, 243); -} diff --git a/src/Components/Views/MainPage/Component/Recommand.tsx b/src/Components/Views/MainPage/Component/Recommand.tsx index 5f06dd7f..f0b19231 100644 --- a/src/Components/Views/MainPage/Component/Recommand.tsx +++ b/src/Components/Views/MainPage/Component/Recommand.tsx @@ -14,7 +14,6 @@ interface RecommandProduct { export default function Recommand() { const [list, setList] = useState(); - const [recommandBook, setRecommandBook] = useState(''); async function recommand() { try { const res = await getRecommand(); @@ -33,36 +32,21 @@ export default function Recommand() {

추천도서

-
- {list && - list.map((item) => ( -
{ - setRecommandBook(item.product_name); - }} - className={`title ${ - recommandBook === item.product_name ? 'selected' : '' - }`} - > - {item.product_name} -
- ))} -
- -
- {list && - list.map((item) => { - if (recommandBook === item.product_name) { - return ( - <> - {item.summary_description} - 책 살펴보기 - - ); - } - })} -
+ {list && + list.map((item) => ( + +

{item.product_name}

+

+ {item.summary_description.length > 85 + ? item.summary_description.slice(0, 85) + '...' + : item.summary_description} +

+ + ))}
); From a35824b7c5994be7d70744cd4335f50473665a60 Mon Sep 17 00:00:00 2001 From: saeyeon Date: Mon, 12 Jun 2023 22:09:01 +0900 Subject: [PATCH 06/75] test --- src/App.tsx | 14 +- src/Common/Form/Login/login.tsx | 124 ++++---- src/Common/Form/Signin/join.tsx | 349 +++++++++++---------- src/Common/Layout/Header/header.tsx | 101 +++--- src/Components/Views/MainPage/MainPage.tsx | 2 +- src/main.tsx | 23 +- src/routes/routes.tsx | 77 +++-- teamwink.com-key.pem | 28 ++ teamwink.com.pem | 25 ++ tsconfig.json | 2 +- 10 files changed, 412 insertions(+), 333 deletions(-) create mode 100644 teamwink.com-key.pem create mode 100644 teamwink.com.pem diff --git a/src/App.tsx b/src/App.tsx index 1f2a3294..f4ea5f2c 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,14 +1,12 @@ -import './App.scss' -import RoutesPage from 'routes/routes' - - +import "./App.scss"; +import RoutesPage from "./routes/routes"; function App() { - return ( + return ( <> - + - ) + ); } -export default App +export default App; diff --git a/src/Common/Form/Login/login.tsx b/src/Common/Form/Login/login.tsx index 155f3fd8..de9d43a0 100644 --- a/src/Common/Form/Login/login.tsx +++ b/src/Common/Form/Login/login.tsx @@ -1,19 +1,15 @@ -import './login.scss' -import { useNavigate, Link } from 'react-router-dom'; +import "./login.scss"; +import { useNavigate, Link } from "react-router-dom"; //import { useDispatch } from "react-redux"; -import { FormEvent, useState, ChangeEvent } from 'react'; +import { FormEvent, useState, ChangeEvent } from "react"; //import { loginUser } from '_reducers/user_reducer'; -import { LoginForm } from 'Apis/apis'; +import { LoginForm } from "@/Apis/register"; - function Login() { - const navigate = useNavigate(); //const dispatch = useDispatch(); - const [email, setEmail] = useState(''); - const [password, setPassword] = useState(''); - - + const [email, setEmail] = useState(""); + const [password, setPassword] = useState(""); const onChangeEmail = (e: ChangeEvent) => { setEmail(e.target.value); @@ -24,38 +20,36 @@ function Login() { }; interface DataToSubmit { - email: string // 사용자 아이디 (필수!) - password: string // 사용자 비밀번호 (필수!) + email: string; // 사용자 아이디 (필수!) + password: string; // 사용자 비밀번호 (필수!) } - async function Signin(event: FormEvent) { event.preventDefault(); - + if (email === undefined || email === "" || email === null) { - alert('이메일을 입력해주세요.'); + alert("이메일을 입력해주세요."); return false; } - + if (password === undefined || password === "" || password === null) { - alert('비밀번호를 입력해주세요.'); + alert("비밀번호를 입력해주세요."); return false; } - + const dataToSubmit: DataToSubmit = { email: email, - password: password + password: password, }; try { - //const data = await dispatch(loginUser(dataToSubmit)); - const data = await LoginForm(email, password) + const data = await LoginForm(email, password); console.log(data); - if(data.accessToken){ + if (data.accessToken) { alert("로그인 되었습니다!"); - window.localStorage.setItem('token', data.accessToken); + window.localStorage.setItem("token", data.accessToken); navigate("/"); } else { alert("로그인에 실패하였습니다. 다시 시도해주세요."); @@ -65,52 +59,60 @@ function Login() { alert("오류가 발생했습니다. 다시 시도해주세요."); } } - - return( + return ( <> -
-
-
-

로그인

-
- -
-
- +
+ +
+

로그인

-
- -
+
+
+ +
-
- +
+ +
+ +
+ +
-
- -
-

아이디가 없으신가요?

- + +
+

아이디가 없으신가요?

+

회원가입 하러 가기!

+
-
- ) + ); } -export default Login \ No newline at end of file +export default Login; diff --git a/src/Common/Form/Signin/join.tsx b/src/Common/Form/Signin/join.tsx index 41b291b7..923eeca0 100644 --- a/src/Common/Form/Signin/join.tsx +++ b/src/Common/Form/Signin/join.tsx @@ -1,193 +1,226 @@ -import { FormEvent, useState, useCallback } from 'react'; -import axios from 'axios'; -import { useNavigate } from 'react-router-dom'; -import { PwCheck, emailCheck } from '../Validation '; -import { JoinForm } from 'Apis/apis'; -import './join.scss' - - -function Join () { - +import { FormEvent, useState, useCallback } from "react"; +import axios from "axios"; +import { useNavigate } from "react-router-dom"; +import { PwCheck, emailCheck } from "../Validation "; +import { JoinForm } from "@/Apis/register"; +import "./join.scss"; + +function Join() { const navigate = useNavigate(); - - // 이름 , 비밀번호, 이메일 , 비밀번호 확인 + + // 이름 , 비밀번호, 이메일 , 비밀번호 확인 const [email, setUserEmail] = useState(""); const [displayName, setdDisplayName] = useState(""); const [password, setUserPassword] = useState(""); const [confirmPassword, setConfirmPassword] = useState(""); - - - //비밀번호 유효성 검사 - const [isName, setIsName] = useState(false) - const [isEmail, setIsEmail] = useState(false) - const [isPassword, setIsPassword] = useState(false) - const [isPasswordConfirm, setIsPasswordConfirm] = useState(false) + //비밀번호 유효성 검사 + const [isName, setIsName] = useState(false); + const [isEmail, setIsEmail] = useState(false); + const [isPassword, setIsPassword] = useState(false); + const [isPasswordConfirm, setIsPasswordConfirm] = useState(false); //오류 메세지 저장 - const [nameMessage, setNameMessage] = useState('') - const [emailMessage, setEmailMessage] = useState('') - const [passwordMessage, setPasswordMessage] = useState('') - const [passwordConfirmMessage, setPasswordConfirmMessage] = useState('') - - - - const onChangeEmail = useCallback((e: React.ChangeEvent) => { - const emails = e.target.value - setUserEmail(emails) - if (emailCheck(emails)) { - setEmailMessage('올바른 이메일 형식이에요 : )') - setIsEmail(true) - } else { - setEmailMessage('이메일 형식이 틀렸습니다') - setIsEmail(false) - } - },[]) + const [nameMessage, setNameMessage] = useState(""); + const [emailMessage, setEmailMessage] = useState(""); + const [passwordMessage, setPasswordMessage] = useState(""); + const [passwordConfirmMessage, setPasswordConfirmMessage] = useState(""); + + const onChangeEmail = useCallback( + (e: React.ChangeEvent) => { + const emails = e.target.value; + setUserEmail(emails); + if (emailCheck(emails)) { + setEmailMessage("올바른 이메일 형식이에요 : )"); + setIsEmail(true); + } else { + setEmailMessage("이메일 형식이 틀렸습니다"); + setIsEmail(false); + } + }, + [] + ); const onChangeName = useCallback((e: React.ChangeEvent) => { - setdDisplayName(e.target.value) + setdDisplayName(e.target.value); if (e.target.value.length < 2 || e.target.value.length > 21) { - setNameMessage('2글자 이상 21글자 미만으로 입력해주세요.') - setIsName(false) - } else { - setNameMessage('올바른 이름 형식입니다 :)') - setIsName(true) - } - }, []) - - const onChangePassword = useCallback((e: React.ChangeEvent) => { - const passwordCurrent = e.target.value - setUserPassword(passwordCurrent) - - if (!PwCheck(passwordCurrent)) { - setPasswordMessage('8자리 이상 입력해주세요.') - setIsPassword(false) + setNameMessage("2글자 이상 21글자 미만으로 입력해주세요."); + setIsName(false); } else { - setPasswordMessage('안전한 비밀번호에요 : )') - setIsPassword(true) - } - }, [confirmPassword]) - - const onChangePasswordConfirm = (password:any, confirmPassword:any, setPasswordConfirmMessage:any, setIsPasswordConfirm:any) => { + setNameMessage("올바른 이름 형식입니다 :)"); + setIsName(true); + } + }, []); + + const onChangePassword = useCallback( + (e: React.ChangeEvent) => { + const passwordCurrent = e.target.value; + setUserPassword(passwordCurrent); + + if (!PwCheck(passwordCurrent)) { + setPasswordMessage("8자리 이상 입력해주세요."); + setIsPassword(false); + } else { + setPasswordMessage("안전한 비밀번호에요 : )"); + setIsPassword(true); + } + }, + [confirmPassword] + ); + + const onChangePasswordConfirm = ( + password: any, + confirmPassword: any, + setPasswordConfirmMessage: any, + setIsPasswordConfirm: any + ) => { if (password === confirmPassword) { - setPasswordConfirmMessage('비밀번호를 똑같이 입력했어요 : )'); + setPasswordConfirmMessage("비밀번호를 똑같이 입력했어요 : )"); setIsPasswordConfirm(true); } else { - setPasswordConfirmMessage('비밀번호가 틀립니다. 다시 입력해주세요.'); + setPasswordConfirmMessage("비밀번호가 틀립니다. 다시 입력해주세요."); setIsPasswordConfirm(false); } }; - const onPasswordConfirmChange = useCallback((e: React.ChangeEvent) => { - const passwordConfirmCurrent = e.target.value; - setConfirmPassword(passwordConfirmCurrent); - onChangePasswordConfirm(password, passwordConfirmCurrent, setPasswordConfirmMessage, setIsPasswordConfirm); - }, [password]); - - - async function signUp (event: FormEvent) { - event.preventDefault() - if(email === undefined || email === "" || email === null ){ + const onPasswordConfirmChange = useCallback( + (e: React.ChangeEvent) => { + const passwordConfirmCurrent = e.target.value; + setConfirmPassword(passwordConfirmCurrent); + onChangePasswordConfirm( + password, + passwordConfirmCurrent, + setPasswordConfirmMessage, + setIsPasswordConfirm + ); + }, + [password] + ); + + async function signUp(event: FormEvent) { + event.preventDefault(); + if (email === undefined || email === "" || email === null) { alert("이메일 입력해주세요."); return false; } - if( isEmail === false || isPassword === false || isPasswordConfirm === false){ + if ( + isEmail === false || + isPassword === false || + isPasswordConfirm === false + ) { alert("값이 잘못 되었습니다. 다시 입력해주세요"); return false; - } - - const param = { - email: email, - password: password, - displayName: displayName - } + } - try{ - const res = await JoinForm(email,displayName,password); - if (res.accessToken) { - alert("가입되었습니다."); - //localStorage.setItem('token', res.accessToken); - navigate("/login"); - } else { - alert("가입에 실패했습니다. 다시 시도해주세요."); + const param = { + email: email, + password: password, + displayName: displayName, + }; + + try { + const res = await JoinForm(email, displayName, password); + if (res.accessToken) { + alert("가입되었습니다."); + //localStorage.setItem('token', res.accessToken); + navigate("/login"); + } else { + alert("가입에 실패했습니다. 다시 시도해주세요."); + } + } catch (error) { + alert("시스템 오류입니다. 문의해주세요."); } - } catch (error) { - alert("시스템 오류입니다. 문의해주세요."); } -} - return( + return ( <> -
-
-
-

회원가입📖

-
- -
-
- - {email.length > 0 && {emailMessage}} -
- -
- - {displayName.length > 0 && {nameMessage}} +
+ +
+

회원가입📖

-
- - {password.length > 0 && ( - {passwordMessage} - )} +
+
+ + {email.length > 0 && ( + + {emailMessage} + + )} +
+ +
+ + {displayName.length > 0 && ( + + {nameMessage} + + )} +
+ +
+ + {password.length > 0 && ( + + {passwordMessage} + + )} +
+ +
+ + {confirmPassword.length > 0 && ( + + {passwordConfirmMessage} + + )} +
+ +
+ +
- -
- - {confirmPassword.length > 0 && ( - {passwordConfirmMessage} - )} -
- -
- -
- - -
- - -
+ +
- ) - + ); } -export default Join; \ No newline at end of file +export default Join; diff --git a/src/Common/Layout/Header/header.tsx b/src/Common/Layout/Header/header.tsx index 03d81809..c2e01b59 100644 --- a/src/Common/Layout/Header/header.tsx +++ b/src/Common/Layout/Header/header.tsx @@ -1,71 +1,70 @@ -import { Link, useNavigate } from 'react-router-dom'; +import { Link, useNavigate } from "react-router-dom"; //import { useSelector } from 'react-redux'; -import './headers.scss' +import "./headers.scss"; //import { RootState } from '../_reducers'; //import { useDispatch } from 'react-redux'; //import { logoutUser } from '_reducers/user_reducer'; -import { LogoutForm } from 'Apis/apis'; - -function Header(){ +import { LogoutForm } from "@/Apis/register"; +function Header() { // const userState = useSelector((state) => state.user); // const accessToken = userState.accessToken; // console.log("1", accessToken); // const dispatch = useDispatch(); - const navigate = useNavigate(); - + const logoutHandler = () => { LogoutForm() - .then(() => { - localStorage.removeItem('token'); - alert("로그아웃 되셨습니다") - navigate('/'); - }) - .catch((error:string) => { - console.log('Logout failed:', error); - }); + .then(() => { + localStorage.removeItem("token"); + alert("로그아웃 되셨습니다"); + navigate("/"); + }) + .catch((error: string) => { + console.log("Logout failed:", error); + }); }; - const token = localStorage.getItem('token'); + const token = localStorage.getItem("token"); - return( - <> -
-
- - - logo - - -
- -
+ return ( + <> +
+
+ + logo + +
+ +
-
- 장바구니 - 마이페이지 - {token ? ( -
-

로그아웃

-
- ) : ( - <> - -

회원가입

+
+ + 장바구니 - -

로그인

+ + 마이페이지 - - )} -
-
-
-
- - ) + {token ? ( +
+

로그아웃

+
+ ) : ( + <> + +

회원가입

+ + +

로그인

+ + + )} +
+
+
+
+ + ); } -export default Header - +export default Header; diff --git a/src/Components/Views/MainPage/MainPage.tsx b/src/Components/Views/MainPage/MainPage.tsx index 1e4af024..217f6602 100644 --- a/src/Components/Views/MainPage/MainPage.tsx +++ b/src/Components/Views/MainPage/MainPage.tsx @@ -1,6 +1,6 @@ import "./MainPage.scss"; import Carousel from "./Component/Carousel"; -import ajax from "src/Apis/adminAuth"; +import ajax from "@/Apis/adminAuth"; import Main from "./Component/Main"; import Recommand from "./Component/Recommand"; diff --git a/src/main.tsx b/src/main.tsx index 39808af3..5165c54b 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -1,22 +1,17 @@ -import React from 'react' -import ReactDOM from 'react-dom/client' -import App from './App.tsx' -import './index.scss' -import { Provider } from 'react-redux'; -import store from './store/' +import React from "react"; +import ReactDOM from "react-dom/client"; +import App from "./App.tsx"; +import "./index.scss"; +import { Provider } from "react-redux"; + //import ReduxThunk from 'redux-thunk'; // import thunk from 'redux-thunk'; // import { createStore, applyMiddleware } from 'redux'; // import reducer from '_reducers/user_reducer.tsx'; - //const createStoreWithMiddleware = applyMiddleware(promiseMiddleware, ReduxThunk)(createStore); //const store = createStore(reducer, applyMiddleware(thunk)); -ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render( - - - - - -) +ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render( + +); diff --git a/src/routes/routes.tsx b/src/routes/routes.tsx index 63546b65..3dd26012 100644 --- a/src/routes/routes.tsx +++ b/src/routes/routes.tsx @@ -1,50 +1,49 @@ -import Header from 'Common/Layout/Header/header' -import Footer from 'Common/Layout/Footer/footer' -import MainPage from 'Components/Views/MainPage/mainPage' -import Join from 'Common/Form/Signin/join' -import Login from 'Common/Form/Login/login' -import CartPage from 'Components/Views/CartPage/CartPage' -import MyPage from 'Components/Views/MyPage/MyPage' -import PrivatePage from './privateRoute' -import DetailPage from 'Components/Views/DetailPage/DetailPage' +import Header from "@/Common/Layout/Header/header"; +import Footer from "@/Common/Layout/Footer/footer"; +import MainPage from "@/Components/Views/MainPage/MainPage"; +import Join from "@/Common/Form/Signin/join"; +import Login from "@/Common/Form/Login/login"; +import CartPage from "@/Components/Views/CartPage/CartPage"; +import MyPage from "@/Components/Views/MyPage/MyPage"; +import PrivatePage from "./privateRoute"; +import DetailPage from "@/Components/Views/DetailPage/DetailPage"; -import { Routes, BrowserRouter, Route, Outlet } from 'react-router-dom' +import { Routes, BrowserRouter, Route, Outlet } from "react-router-dom"; - const Layout = () => { - return( +const Layout = () => { + return ( <> -
+
-
+
- ) -} + ); +}; function RoutesPage() { - - return( + return ( <> - - - }> - }/> - }/> - }/> - } /> - } status={""}/>}/> - } status={""}/>} - /> - - - + + + }> + } /> + } /> + } /> + } /> + } status={""} />} + /> + } status={""} />} + /> - {/* }/> */} - - - + {/* }/> */} + + + - ) + ); } -export default RoutesPage \ No newline at end of file +export default RoutesPage; diff --git a/teamwink.com-key.pem b/teamwink.com-key.pem new file mode 100644 index 00000000..8468774f --- /dev/null +++ b/teamwink.com-key.pem @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCaL6qFc6t6Jx0S +mFvGJF6H4vtBMNtOq9ultbm3jhDJsN369vEs1/53bs8toTiYVWw5Bl8wv7BvM1t0 +wos/SseLM7GLe7XUrPdnZpKX0MTDduhgUdoLQNux28b9W5pGdMz8W2l4xj7dYSnG +FBCSJwALEh/tEBz+6JPNaw5/GQbWp6g5+J+G/zlNevIOdojLY5G6fZnQsssjy3H0 +YAtLKVZ97CS+tmXOXZgtxyhHPIowlYj2ZBHY9N413unWim42mW/U2+fD7KC6tU9z +2tR/Apptjl2XhNgKgHz83LQ7kAIIIvVHcA5pwkvX6iA7GY6eOHyTdcnkH9kmKxkO +hHehwo3bAgMBAAECggEAFvM/Y4vbG1yVFD5/cpfZRkq/8W0vR5+HGzxYf3zy/MKJ +2CBHt9ASvX5N8lHMFcipSjerlZsCzRqM421NwscDurGgHM32O8jfLpHzAgv+LcYW +QrgMR56I1QmMrgujhBdAp9OHeIWxt8wNpsE30jlh5UP2YpgCaOL/lRT5XGvCO9MP +rtZQ1UMgik3TKBlZ7HznEdkiAEprtW5wl+3pnJeWGnUwXZuizzN7N5FVBZrdsaik +NnmpGTbCpWdmYbas0Q8EuWGVnEfrFFDmGK0n2EFthwGWKLoApNrcWPx/kVmLTJSD +cfAM+dKClrD2hPXn34wOzcwxq4Oc7OTmTuvDHdBjkQKBgQDH1soIsMQX1jgdHxtm +YDI2sz21xmkW3L+bKA027nbYQX27AQAulh7ddd3NJV5MfyqbGvhDUEKeeDkg5xat +DnbA5m5dmwiDFNDZ2Bpj+ffqiBpW25oR4PajPnBGVJn4KvEWuUKBSpnKyKxZnM7A +jGUfHX98xY5eOdSi8UM9dHbdEwKBgQDFhG6NS6SbOMsStoAcNA+Xrqyeiaj+DONR +vJc7EFM2g05L2w0lzHUlcnwJ4sG7uWMB0y8k7dcfvxBCGJmBFBcW8qvQfo95C8tc +Phw5RHoYGH4m2OKTmIhtmcQlG7TcOWreTq7nsIFTZDpOZsA/HMVQ3jL9Ki+9aNbC +A3t8Uf8NGQKBgQC62Jz2GzB9iRHWSKt5wR+x/U0JlIXVlnigPYZ9geEkubcxDfJ5 +nGsnbXkAwpu0soHHnCPb7EMdoBLqLKcLD6cBHXK7mqUOynur815Zc/LVGoRmCdW4 +ObrhTxPy7k83tg7MzFLeSD4bWB2te+vkJGC4AwCcTKqcdz3VS/cukqJAeQKBgCaS +8YA4uKHz2n0CFUzswerOmzmvCsjqvW5WFXbcflPUGvNniU7Leklg7WaE2W8PCo3t +r3RX2r6Bcuxln3z87nF13SYvwVdTfVi7bImmnO2dwu1VSBKpJGO7NvpESfMEZ6GY +3kGzT954YYa0PHFW7hYX/v9AQOiN0/s58ODbpqLpAoGAbnvh3eeyUNMtOmCfRXbm +55is4H/PyegQWjEUKQitmeC4qB0FVjc3Vj9EK3oHDhY7Yvm6dpMDVKkSJDgtJ/6n +GBkKofq68vExLGnw2wcfhoYvQ37NhgxRC4EeAKJ3IXBc2+kB/fp/iKy2TNDwRqdO +3MEPev12LZMT/9JP9CQAAiE= +-----END PRIVATE KEY----- diff --git a/teamwink.com.pem b/teamwink.com.pem new file mode 100644 index 00000000..c4b5d9e3 --- /dev/null +++ b/teamwink.com.pem @@ -0,0 +1,25 @@ +-----BEGIN CERTIFICATE----- +MIIESTCCArGgAwIBAgIQZT7xdqSRlxq89ZYCBxU7+jANBgkqhkiG9w0BAQsFADCB +hTEeMBwGA1UEChMVbWtjZXJ0IGRldmVsb3BtZW50IENBMS0wKwYDVQQLDCRMQVBU +T1AtTk1URzNJQ1NcdXNlckBMQVBUT1AtTk1URzNJQ1MxNDAyBgNVBAMMK21rY2Vy +dCBMQVBUT1AtTk1URzNJQ1NcdXNlckBMQVBUT1AtTk1URzNJQ1MwHhcNMjMwNjA5 +MTUzNTQ1WhcNMjUwOTA5MTUzNTQ1WjBYMScwJQYDVQQKEx5ta2NlcnQgZGV2ZWxv +cG1lbnQgY2VydGlmaWNhdGUxLTArBgNVBAsMJExBUFRPUC1OTVRHM0lDU1x1c2Vy +QExBUFRPUC1OTVRHM0lDUzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +AJovqoVzq3onHRKYW8YkXofi+0Ew206r26W1ubeOEMmw3fr28SzX/nduzy2hOJhV +bDkGXzC/sG8zW3TCiz9Kx4szsYt7tdSs92dmkpfQxMN26GBR2gtA27Hbxv1bmkZ0 +zPxbaXjGPt1hKcYUEJInAAsSH+0QHP7ok81rDn8ZBtanqDn4n4b/OU168g52iMtj +kbp9mdCyyyPLcfRgC0spVn3sJL62Zc5dmC3HKEc8ijCViPZkEdj03jXe6daKbjaZ +b9Tb58PsoLq1T3Pa1H8Cmm2OXZeE2AqAfPzctDuQAggi9UdwDmnCS9fqIDsZjp44 +fJN1yeQf2SYrGQ6Ed6HCjdsCAwEAAaNhMF8wDgYDVR0PAQH/BAQDAgWgMBMGA1Ud +JQQMMAoGCCsGAQUFBwMBMB8GA1UdIwQYMBaAFA9/1gWEm3zDQBNwV0zQfANqNe1b +MBcGA1UdEQQQMA6CDHRlYW13aW5rLmNvbTANBgkqhkiG9w0BAQsFAAOCAYEAWHIc +wS76b8rHGPgCRs3koCzeMIY6z+6791w/YozRCCjXOfJjJwjL7ruLxKl6W9h002U/ +tkjpLPsSUtDrLxvYulfn2/mI3f2o0yllFha3BYrrOiZYEYRQSiEnnFUQW9gUdp+R +9wS2Ofggxr/kfhZxRXn5RlPmZ3iIm4rf/XSPHEL5cfvidWpPK0EUOZB45bGk083x +BnG2MC3PoJajSq6mxwotqNiIsvYclsQbKOmtlOMp6wl0CmoK+QiVuiyqi7E8xLzF +zKtA0Pj23tCxfz7E+ZUASSMQxfoCiZip9ADsi4cxnmT1rwY4Agvstuj928R993KD +xVHrkXjhZ3OiMcxktu6qQjVC/cm7TaO9tECU1SnSBgFF1mWiCIASrIrcZ+kVb67J +NsavwgmmAHRpYe51VtFOMabFiJcvKYCTfB6NJGosHtFArv7loNTjqUwFEWVD3UYA +cU5mIx6e/m0FKFEB2mPXCYF/qyifgi0zGv32RnwUmSL/jOFFwyuHsZrbrxQt +-----END CERTIFICATE----- diff --git a/tsconfig.json b/tsconfig.json index 5518d03d..4e0d67aa 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -7,7 +7,7 @@ "skipLibCheck": true, "baseUrl": "./", "paths": { - "@/": ["src/"] + "@/*": ["src/*"] }, /* Bundler mode */ From eb658c2b6efe66f9cfb3bdc5fe66fac8c5dc8f9d Mon Sep 17 00:00:00 2001 From: jinyoungpark231 Date: Mon, 12 Jun 2023 22:11:44 +0900 Subject: [PATCH 07/75] =?UTF-8?q?=EA=B2=B0=EC=A0=9C=EB=B6=80=EB=B6=84=20?= =?UTF-8?q?=EA=B0=84=EA=B2=A9=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.tsx | 2 +- src/Common/Form/Login/login.tsx | 2 +- src/Common/Form/Signin/join.tsx | 2 +- src/Common/Layout/Header/header.tsx | 2 +- .../Views/CartPage/CartItems/CartItems.scss | 2 +- .../Views/CartPage/CartItems/CartItems.tsx | 43 ++++++++++++------- src/Components/Views/CartPage/CartPage.scss | 13 ++++-- src/Components/Views/CartPage/CartPage.tsx | 6 +-- src/main.tsx | 9 ++-- src/routes/routes.tsx | 16 +++---- teamwink.com-key.pem | 28 ++++++++++++ teamwink.com.pem | 25 +++++++++++ tsconfig.json | 2 +- 13 files changed, 112 insertions(+), 40 deletions(-) create mode 100644 teamwink.com-key.pem create mode 100644 teamwink.com.pem diff --git a/src/App.tsx b/src/App.tsx index 1f2a3294..401638df 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,5 +1,5 @@ import './App.scss' -import RoutesPage from 'routes/routes' +import RoutesPage from './routes/routes' diff --git a/src/Common/Form/Login/login.tsx b/src/Common/Form/Login/login.tsx index 155f3fd8..3a707508 100644 --- a/src/Common/Form/Login/login.tsx +++ b/src/Common/Form/Login/login.tsx @@ -3,7 +3,7 @@ import { useNavigate, Link } from 'react-router-dom'; //import { useDispatch } from "react-redux"; import { FormEvent, useState, ChangeEvent } from 'react'; //import { loginUser } from '_reducers/user_reducer'; -import { LoginForm } from 'Apis/apis'; +import { LoginForm } from '@/Apis/register' function Login() { diff --git a/src/Common/Form/Signin/join.tsx b/src/Common/Form/Signin/join.tsx index 41b291b7..118457c0 100644 --- a/src/Common/Form/Signin/join.tsx +++ b/src/Common/Form/Signin/join.tsx @@ -2,7 +2,7 @@ import { FormEvent, useState, useCallback } from 'react'; import axios from 'axios'; import { useNavigate } from 'react-router-dom'; import { PwCheck, emailCheck } from '../Validation '; -import { JoinForm } from 'Apis/apis'; +import { JoinForm } from '@/Apis/register'; import './join.scss' diff --git a/src/Common/Layout/Header/header.tsx b/src/Common/Layout/Header/header.tsx index 03d81809..3f15128c 100644 --- a/src/Common/Layout/Header/header.tsx +++ b/src/Common/Layout/Header/header.tsx @@ -4,7 +4,7 @@ import './headers.scss' //import { RootState } from '../_reducers'; //import { useDispatch } from 'react-redux'; //import { logoutUser } from '_reducers/user_reducer'; -import { LogoutForm } from 'Apis/apis'; +import { LogoutForm } from '@/Apis/register'; function Header(){ diff --git a/src/Components/Views/CartPage/CartItems/CartItems.scss b/src/Components/Views/CartPage/CartItems/CartItems.scss index 2395c890..950abe95 100644 --- a/src/Components/Views/CartPage/CartItems/CartItems.scss +++ b/src/Components/Views/CartPage/CartItems/CartItems.scss @@ -110,7 +110,7 @@ width: 150px; height: 90px; position: absolute; - top: -10px; + top: 10px; right: 350px; //background-color: olivedrab; display: table-column; diff --git a/src/Components/Views/CartPage/CartItems/CartItems.tsx b/src/Components/Views/CartPage/CartItems/CartItems.tsx index 95f01b3b..b76bcfea 100644 --- a/src/Components/Views/CartPage/CartItems/CartItems.tsx +++ b/src/Components/Views/CartPage/CartItems/CartItems.tsx @@ -14,23 +14,22 @@ function CartItems() { name: string; text: string; price: string; - sale: string; - malize:string; + sale: string; } const [info, setInfo] = useState([]) const [checked, setChecked] = useState([true, false]); const [items, setItems] = useState([ { id: 1, name: '[국내도서]시작하세요! C# 10프로그래밍', text:"*밤 11시 잠들기전 배송", - price:"정가: 36000", sale:"판매가:32,400", malize:"마일리지: 1,800원"}, + price:"정가: 36000", sale:"판매가:32,400"}, { id: 2, name: '도서명2', text:"*밤 11시 잠들기전 배송", - price:"정가: 36000", sale:"판매가:32,400", malize:"마일리지: 1,800원" }, + price:"정가: 36000", sale:"판매가:32,400" }, { id: 3, name: '도서명3', text:"*밤 11시 잠들기전 배송", - price:"정가: 36000", sale:"판매가:32,400", malize:"마일리지: 1,800원"}, + price:"정가: 36000", sale:"판매가:32,400"}, { id: 4, name: '도서명3', text:"*밤 11시 잠들기전 배송", - price:"정가: 36000", sale:"판매가:32,400", malize:"마일리지: 1,800원"}, + price:"정가: 36000", sale:"판매가:32,400"}, { id: 5, name: '도서명3', text:"*밤 11시 잠들기전 배송", - price:"정가: 36000", sale:"판매가:32,400", malize:"마일리지: 1,800원"}, + price:"정가: 36000", sale:"판매가:32,400"}, ]); const [checkedItems, setCheckedItems] = useState([]); @@ -41,25 +40,40 @@ function CartItems() { }; const handleChange2 = (event: React.ChangeEvent) => { - const itemId = parseInt(event.target.name); + const itemId = parseInt(event.target.name); let updatedCheckedItems: number[] = []; - + if (event.target.checked) { updatedCheckedItems = [...checkedItems, itemId]; } else { updatedCheckedItems = checkedItems.filter((id) => id !== itemId); } - setCheckedItems(updatedCheckedItems); + setCheckedItems(updatedCheckedItems); + console.log(priceTotal) }; + + const [priceTotal,setPriceTotal] = useState(0) + const [saleTotal, setSaleTotal] = useState(0) - const children = (itemId: number) => ( + const children = (itemId: number, itemPrice: number, itemSale: number) => { + if(priceTotal !== 0){ + if(checkedItems.includes(itemId)){ + setPriceTotal(priceTotal + itemPrice) + setSaleTotal(saleTotal + itemSale) + }else{ + setPriceTotal(priceTotal - itemPrice) + setSaleTotal(saleTotal - itemSale) + } + } + + return ( } /> - ); + )}; const handleChange = (e: React.ChangeEvent) => { console.log() @@ -106,7 +120,7 @@ function CartItems() { {items.map((item) => (
- {children(item.id)} + {children(item.id,+item.price,+item.sale)}
cartbookimage @@ -118,8 +132,7 @@ function CartItems() {
{item.price} - {item.sale} - {item.malize} + {item.sale}
diff --git a/src/Components/Views/CartPage/CartPage.scss b/src/Components/Views/CartPage/CartPage.scss index 792ee031..bd44dc05 100644 --- a/src/Components/Views/CartPage/CartPage.scss +++ b/src/Components/Views/CartPage/CartPage.scss @@ -112,8 +112,15 @@ height: 30px; //background-color: rosybrown; display: flex; - gap: 40px; + gap: 60px; } + .Pay-Container__products{ + width: inherit; + height: 30px; + //background-color: rosybrown; + display: flex; + gap: 45px; + } } } @@ -127,12 +134,12 @@ .AllCount-Container__box{ width: 300px; - height: 50px; + height: 30px; //background-color: darkblue; display: flex; gap: 50px; margin: 0 auto; - } + } } .Buy-ButtonBox{ diff --git a/src/Components/Views/CartPage/CartPage.tsx b/src/Components/Views/CartPage/CartPage.tsx index 915c301f..62d80023 100644 --- a/src/Components/Views/CartPage/CartPage.tsx +++ b/src/Components/Views/CartPage/CartPage.tsx @@ -6,7 +6,7 @@ import RentalItems from './CartRent/CartRent'; function CartPage() { - + // const [rentalbook, setRentalBook] = useState([ // { id: 1, name: '[국내도서]시작하세요! C# 10프로그래밍', text:"*밤 11시 잠들기전 배송", // price:"정가: 36000", sale:"판매가:32,400", malize:"마일리지: 1,800원"}, @@ -51,10 +51,10 @@ function CartPage() {
총 상품 가격 - 28,000 + 28,000 원
-
+
총 주문 상품수 1종 1권(개)
diff --git a/src/main.tsx b/src/main.tsx index 39808af3..bd513c97 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -2,8 +2,8 @@ import React from 'react' import ReactDOM from 'react-dom/client' import App from './App.tsx' import './index.scss' -import { Provider } from 'react-redux'; -import store from './store/' + + //import ReduxThunk from 'redux-thunk'; // import thunk from 'redux-thunk'; // import { createStore, applyMiddleware } from 'redux'; @@ -13,10 +13,9 @@ import store from './store/' //const createStoreWithMiddleware = applyMiddleware(promiseMiddleware, ReduxThunk)(createStore); //const store = createStore(reducer, applyMiddleware(thunk)); -ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render( - +ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render( - + ) diff --git a/src/routes/routes.tsx b/src/routes/routes.tsx index 63546b65..7a76c521 100644 --- a/src/routes/routes.tsx +++ b/src/routes/routes.tsx @@ -1,12 +1,12 @@ -import Header from 'Common/Layout/Header/header' -import Footer from 'Common/Layout/Footer/footer' -import MainPage from 'Components/Views/MainPage/mainPage' -import Join from 'Common/Form/Signin/join' -import Login from 'Common/Form/Login/login' -import CartPage from 'Components/Views/CartPage/CartPage' -import MyPage from 'Components/Views/MyPage/MyPage' +import Header from '@/Common/Layout/Header/header' +import Footer from '@/Common/Layout/Footer/footer' +import MainPage from '@/Components/Views/MainPage/MainPage' +import Join from '@/Common/Form/Signin/join' +import Login from '@/Common/Form/Login/login' +import CartPage from '@/Components/Views/CartPage/CartPage' +import MyPage from '@/Components/Views/MyPage/MyPage' import PrivatePage from './privateRoute' -import DetailPage from 'Components/Views/DetailPage/DetailPage' +import DetailPage from '@/Components/Views/DetailPage/DetailPage' import { Routes, BrowserRouter, Route, Outlet } from 'react-router-dom' diff --git a/teamwink.com-key.pem b/teamwink.com-key.pem new file mode 100644 index 00000000..4ec79039 --- /dev/null +++ b/teamwink.com-key.pem @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDpftk+0psZfzwj +nAZVUK5kUxd+w0aOR5SJ4Uonaj/CJcWTcdhQhlJ5RoA59oLhmU0JGYzVkt9X4Uia +/Tlq6lj6Jg5EMY6ICbUGuWXE0Lumstb32umTwoMARE38Y/RVfTOTX6Us3Tv7Po0P +YEWqTNd4L/LOth4WCd03WcxkSRdrgm5594Pbxb3yUOODdaGjjc6yo5n2fsYAAVyE +SiIC8UFrbtTvKxEANiEY08MmVn3amWnf1QWh8m8iyOBOZBWeBzALWn1ayKdG3mEJ +JWVX6TBl8j12Pm1BkCu+CXfUAARpGwgh2oUOn7NK4Eo/EZryEX+oFHAh3pQZMYgT +sQWG9GBxAgMBAAECggEAQc/nG7Xw0XbzVHYdst5SySRCcxBHSsMSMuq1I/bmkapj +zfNArTGu/U/JxIyex0eWVwJEl84V9YciF81X6bKz8Y3YZ5AwRFe4FnUbIiZTPeEa +hjHFtEgW9HRMJt9ldtMbPmau/747sc0npTXVbPLLqKybG3hpcnzFRVyiJ4ISf9Jx +siZDMCDnMddo0uim5QWVZndcC4Tk9DN02wn+bh+2NLop10ZVt/csiYRqXSlslJGr +9Tj2JZx7dOKlgVvLPJ/ZM6sQZl+ZPlLupZNrmTySEJgM3b+2nwM+FpXcWUBvRNJc +nDO5U4t/qewVJuNCA2ZUDGFJtZQRwreTbbW5mBtaAQKBgQD+dDj95IZd/xmRM3uL +MrhgqUZFP6b5Q//2goxK09U8PMFjxz2UNeVZLEF7bLCRwJRoxjIB3n7hBlor7Cl+ +15/GOeR+fdkgsfvY2GFlr5aF5JIxC2Duofnxs+CcewU/CQl2K/cesCL1yEpjluUZ +YRdI0R7oC4w5By28fqZaNuFoWQKBgQDq6gb1abhYCkvoEPtkov75AxcBE/YPkvpJ +wXPenFe4LTsnhJztICwhm9gviJdDYnE05FnLIOD4Mfe1GrMKoP9yati5jI33CHcH +ktt8p6fE0iukVy17iWMLcuCjs/AexmEnxDayqHtdiDAifF/ToQyD99BOOn8LtDMp +o1P22Hy12QKBgGhwJZA4AtqDwOey/MtGVxz9fWUg2hTHT0DLlm+EAKqHuUyN032I +nYj7PCk/lD1OkNtsNcxEmUkdBVevx9xS/jYrPtiYKM1doCQBtAA7kImGJmbQ58kq +XF9TWCaB68ZSnDqPkw9adg7xVW8I2SGQkzEE/C17x+MESkZqqTav/daJAoGAFwtg +JWD6mYBhE+Hel2+57XmVHyDzKXH0pZmZoUPbAxFE1UqYDlbynVVpbrhKhmy4yESC +Xn/aMd7M+vIkkC1dAb9jhUg5gPtOmeqZJ3BW7+LiLxvyNUUz9yKM0OJM8ufpDfqc +lwgaGgHLHwbua5dH4AZGY/YvElnaDwKbsQJpsXkCgYEA99jt2LajJmheq5yr1IgO +QfqBJbw8k+QGZHp5Q8gEtriLK1j6fcT3n/vV537+S2giYFG/pJrDuMnZYsfYL62D +FkiqXE7XHGCm/X2e7GMzNYIV82mZ1tNY9C9Sotm1meOvCoVj9eSZ4jP15f/KOibf +h4ika73uuqsysbsbRjw/Hak= +-----END PRIVATE KEY----- diff --git a/teamwink.com.pem b/teamwink.com.pem new file mode 100644 index 00000000..aa6ee9a2 --- /dev/null +++ b/teamwink.com.pem @@ -0,0 +1,25 @@ +-----BEGIN CERTIFICATE----- +MIIESTCCArGgAwIBAgIQTIi6/yh+6jklYsy0CJLjIzANBgkqhkiG9w0BAQsFADCB +hTEeMBwGA1UEChMVbWtjZXJ0IGRldmVsb3BtZW50IENBMS0wKwYDVQQLDCRERVNL +VE9QLTRPOFM0TjNcdXNlckBERVNLVE9QLTRPOFM0TjMxNDAyBgNVBAMMK21rY2Vy +dCBERVNLVE9QLTRPOFM0TjNcdXNlckBERVNLVE9QLTRPOFM0TjMwHhcNMjMwNjA5 +MTUzNzIxWhcNMjUwOTA5MTUzNzIxWjBYMScwJQYDVQQKEx5ta2NlcnQgZGV2ZWxv +cG1lbnQgY2VydGlmaWNhdGUxLTArBgNVBAsMJERFU0tUT1AtNE84UzROM1x1c2Vy +QERFU0tUT1AtNE84UzROMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +AOl+2T7Smxl/PCOcBlVQrmRTF37DRo5HlInhSidqP8IlxZNx2FCGUnlGgDn2guGZ +TQkZjNWS31fhSJr9OWrqWPomDkQxjogJtQa5ZcTQu6ay1vfa6ZPCgwBETfxj9FV9 +M5NfpSzdO/s+jQ9gRapM13gv8s62HhYJ3TdZzGRJF2uCbnn3g9vFvfJQ44N1oaON +zrKjmfZ+xgABXIRKIgLxQWtu1O8rEQA2IRjTwyZWfdqZad/VBaHybyLI4E5kFZ4H +MAtafVrIp0beYQklZVfpMGXyPXY+bUGQK74Jd9QABGkbCCHahQ6fs0rgSj8RmvIR +f6gUcCHelBkxiBOxBYb0YHECAwEAAaNhMF8wDgYDVR0PAQH/BAQDAgWgMBMGA1Ud +JQQMMAoGCCsGAQUFBwMBMB8GA1UdIwQYMBaAFBKReIDaB0/5E7EdAXmZkd86lxK8 +MBcGA1UdEQQQMA6CDHRlYW13aW5rLmNvbTANBgkqhkiG9w0BAQsFAAOCAYEAFRyJ +GXGTWexNrY7fVB7IX9SF9fIVKisv4eHS2yyktdWrqLHA8Df0dSgmYwdDs8rBgM3Y +PTh1z+7l3eoGhQDs2vIydvkinAF4U1Keo7WzDxkgENS9gVyWolFci40f1OpZdjnf +4GF8Jelje6yxreKzvKMjZNCVNDKI4r4wk/whE4hed829zBA7iQZ2x7s8tWtYNWe1 +TFgKWv4N5SYRJL+gTK952vJfRcTdN9dXSmLMBx0XqdvssitGwR18tGLKJr7yIy4J +hVICyEy07EzS48/iOsFBuGC0ddcQuxlvnVNcUI5aVljp4joGars6sSkEDukHyN0s +F9YsAjeL6gTPegLY265pBnNkBlVqi6gk1pGN4I+ozFlRZp71LH1a8Vmto8M5Bo6v +ymVi4sevwhm19MHVZ4okgwa1FCNE6QrEkIVDhUbrlIQO7P8g3RGrXlcDcA6WGUh+ +oGhQ+371xTbnDyvQeS3iRVsmR6txlWZMRCGoVH1pqw1HZELbl3KjjQkxEOOs +-----END CERTIFICATE----- diff --git a/tsconfig.json b/tsconfig.json index 5518d03d..4e0d67aa 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -7,7 +7,7 @@ "skipLibCheck": true, "baseUrl": "./", "paths": { - "@/": ["src/"] + "@/*": ["src/*"] }, /* Bundler mode */ From 29f1d967de3692f6642c9814980460df88652b25 Mon Sep 17 00:00:00 2001 From: hahahaday12 Date: Mon, 12 Jun 2023 22:14:20 +0900 Subject: [PATCH 08/75] =?UTF-8?q?feat:=20=EC=83=81=EC=84=B8=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20-=20=EB=A9=94=EC=9D=B8=EC=97=90=EC=84=9C?= =?UTF-8?q?=20=EB=84=98=EC=96=B4=EC=98=A8=20=EC=83=81=EC=84=B8=20=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=20-=20=20=EC=83=81=EC=84=B8=20=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=A7=80=20=EC=8A=A4=ED=83=80=EC=9D=BC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Views/DetailPage/DetailPage.scss | 31 ++++- .../Views/DetailPage/DetailPage.tsx | 115 +++++++++++++----- 2 files changed, 110 insertions(+), 36 deletions(-) diff --git a/src/Components/Views/DetailPage/DetailPage.scss b/src/Components/Views/DetailPage/DetailPage.scss index 4056ab5e..a1b2463e 100644 --- a/src/Components/Views/DetailPage/DetailPage.scss +++ b/src/Components/Views/DetailPage/DetailPage.scss @@ -20,7 +20,8 @@ left: 0; right: 0; //font-family: 'Dovemayo_gothic'; - + font-family: 'SUITE-Regular'; + .ImgContainer{ height: 780px; position: relative; @@ -37,7 +38,7 @@ z-index: 100; .TitleBox{ - width: 250px; + width: auto; height: 60px; position: absolute; margin: 0 auto; @@ -46,7 +47,7 @@ //background-color: red; p{ - font-size: 40px; + font-size: 30px; } } .BookimgBox{ @@ -64,7 +65,7 @@ img{ width: 360px; height: auto; - position: absolute; + //position: absolute; margin: auto; left: 0; right: 0; @@ -184,6 +185,26 @@ } } - + .InnerContent{ + width: 900px; + background-color: red; + height: auto; + display: block; + margin: 0 auto; + font-family: 'SUITE-Regular'; + + img{ + width: 900px; + //position: absolute; + display: flex; + margin: 0 auto; + } + + p{ + font-family: 'SUITE-Regular' !important; + background-color: antiquewhite; + } + + } } \ No newline at end of file diff --git a/src/Components/Views/DetailPage/DetailPage.tsx b/src/Components/Views/DetailPage/DetailPage.tsx index 0421fd81..bbe3398a 100644 --- a/src/Components/Views/DetailPage/DetailPage.tsx +++ b/src/Components/Views/DetailPage/DetailPage.tsx @@ -2,37 +2,90 @@ import BookCustom from '../../../bookcustom/bookcustom' import axios from 'axios'; import { useEffect, useState } from 'react'; import './DetailPage.scss' +import { useParams } from 'react-router-dom'; +import { getDetail } from '@/Apis/productApi'; +function DetailPage(){ -const { VITE_CLIENT_ID } = import.meta.env; -const ajax = axios.create({ - baseURL: '/cafe24/api/v2', - headers: { - 'Content-Type': 'application/json', - 'X-Cafe24-Client-Id': VITE_CLIENT_ID, - }, -}); + interface DetailInfo { + detail_image:string, + product_name:string, + retail_price:number, + simple_description:string, + summary_description:string, + product_no:string, + price:number, + price_excluding_tax: string, + selling: string, + description:string + + + } -function DetailPage(){ + const [detail, setDetail] = useState({} as DetailInfo); + const [book, setBook] = useState([]); - const [detail, setDetail] = useState({} as Product); + const { productNo } = useParams(); async function getDetails() { try { - const { data } = await ajax.get('/products/21'); + const data = await getDetail(productNo as string); setDetail(data.product); } catch (err) { console.log(err); } } - useEffect(() => { (async () => { await getDetails(); })(); }, []); + + + + + + const BuyBook = (detailnum) => { + let Cart = localStorage.getItem('cart'); + + // if(Cart === null) { + // Cart = []; + // } else { + // Cart = JSON.parse(Cart); + // } + + // let datalist = { + // "buy": [] + // ,"rent": [] + // }1 + + + // datalist.buy[1]= productid; + + // buy - [1,2,4,56] + // rent - [1,3,6,7] + // let c = localStorage.getIte(cart); + // c.buy + // Cart.push() + // console.log(detail); + } + + + + const disableLinkClick = (event) => { + event.preventDefault(); + // You can add any additional handling here if needed + }; + + const modifiedDescription = detail.description + ? detail.description.replace(/]*>/gi, (match) => + match.replace('href', 'data-disabled-href') + ) + : ''; + + return( <> @@ -44,10 +97,10 @@ function DetailPage(){
-

제목입니다.

+ {detail.product_name}
- bookimgs +
@@ -57,26 +110,14 @@ function DetailPage(){
-
- 정가 - 22,000 -
판매가 - 22,000 -
-
- 수량 - 22,000 + {detail.price}
줄거리 -

더 이상 설명이 필요 없는 20세기 환경학 최고의 고전 [침묵의 봄]이 - 50주년 기념 개정판으로 나왔다. 이번 개정판에는 서문과 후기가 - 완전히 새롭게 단장되었으며, 2002년 출간본에는 없던(원서에도 - 없었음) 찾아보기를 새롭게 추가했다. 그리고 편집과 장정도 완전히 - 바뀌었다.

+

@@ -86,15 +127,27 @@ function DetailPage(){
- +
-
+
+
-
+
+ {/*
+ +
*/} + {/*
+
*/} + + {/*
+ +
*/} ) } From 5489070bc7fbe6e997e435e08f7ca0a9f4864b19 Mon Sep 17 00:00:00 2001 From: hahahaday12 Date: Mon, 12 Jun 2023 23:02:25 +0900 Subject: [PATCH 09/75] =?UTF-8?q?feat:=20=EB=B3=80=EA=B2=BD=EC=82=AC?= =?UTF-8?q?=ED=95=AD=20=EC=A0=80=EC=9E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/images/carousel1.png | Bin 0 -> 79517 bytes public/images/carousel2.png | Bin 0 -> 27602 bytes public/images/carousel3.png | Bin 0 -> 39946 bytes src/Apis/productApi.ts | 12 +- src/App.scss | 11 +- src/App.tsx | 14 +- src/Common/Form/Login/login.tsx | 124 ++++--- src/Common/Form/Signin/join.tsx | 347 ++++++++++-------- src/Common/Layout/Header/header.tsx | 97 +++-- .../Views/CartPage/CartItems/CartItems.tsx | 189 ++++++---- .../Views/DetailPage/DetailPage.tsx | 25 +- .../Views/MainPage/Component/Carousel.tsx | 2 +- .../Views/MainPage/Component/Genre.tsx | 9 +- .../Views/MainPage/Component/Main.tsx | 31 +- .../Views/MainPage/Component/Recommand.scss | 95 +++++ .../Views/MainPage/Component/Recommand.tsx | 34 +- src/Components/Views/MainPage/MainPage.scss | 26 +- src/Components/Views/MainPage/MainPage.tsx | 4 +- src/main.tsx | 20 +- src/routes/routes.tsx | 77 ++-- tsconfig.json | 2 +- 21 files changed, 649 insertions(+), 470 deletions(-) create mode 100644 public/images/carousel1.png create mode 100644 public/images/carousel2.png create mode 100644 public/images/carousel3.png create mode 100644 src/Components/Views/MainPage/Component/Recommand.scss diff --git a/public/images/carousel1.png b/public/images/carousel1.png new file mode 100644 index 0000000000000000000000000000000000000000..a8db2fd5a0b3658638611064ea1ccd3f9998fcaf GIT binary patch literal 79517 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

-@ literal 0 HcmV?d00001 diff --git a/public/images/carousel2.png b/public/images/carousel2.png new file mode 100644 index 0000000000000000000000000000000000000000..f0a3d8484874e572c4cc4d81b905dc562d760af9 GIT binary patch literal 27602 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 Q|4694)l&MQ@G0_t0Z`Pob^rhX literal 0 HcmV?d00001 diff --git a/public/images/carousel3.png b/public/images/carousel3.png new file mode 100644 index 0000000000000000000000000000000000000000..750a85e380d632063aff788ded30f9af950f5f4a GIT binary patch literal 39946 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%0D~=NfkNx~n7S#JdHtohAKFGqqsI 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 TKFMAEn=3D)EL|mO68L`rqVtoo literal 0 HcmV?d00001 diff --git a/src/Apis/productApi.ts b/src/Apis/productApi.ts index 9bcd673a..b795b625 100644 --- a/src/Apis/productApi.ts +++ b/src/Apis/productApi.ts @@ -1,4 +1,3 @@ -//import axios from '@/Apis/axios'; import axios from 'axios'; const { VITE_CLIENT_ID } = import.meta.env; @@ -19,7 +18,7 @@ export async function getList(category: number) { category: category, }, }); - console.log(data.products); + //console.log(data.products); return data.products; } catch (err) { console.log(err); @@ -34,3 +33,12 @@ export async function getRecommand() { console.log(err); } } + +export async function getDetail(product_no: string) { + try { + const res = await ajax.get(`/products/${product_no}`); + return res.data; + } catch (err) { + console.log(err); + } +} diff --git a/src/App.scss b/src/App.scss index 1b9d15cf..78fe4718 100644 --- a/src/App.scss +++ b/src/App.scss @@ -6,12 +6,13 @@ body { margin: 0; - // width: 100%; + // width: 100%; //height: 100vh; - background-color: #F8EDE3; + background-color: #f8ede3; //background-color: rebeccapurple; // font-family: 'Dovemayo_gothic'; -}; + font-family: 'SUITE-Regular'; +} a { text-decoration: none; @@ -26,8 +27,8 @@ a { @font-face { font-family: 'SUITE-Regular'; - src: url('https://cdn.jsdelivr.net/gh/projectnoonnu/noonfonts_2304-2@1.0/SUITE-Regular.woff2') format('woff2'); + src: url('https://cdn.jsdelivr.net/gh/projectnoonnu/noonfonts_2304-2@1.0/SUITE-Regular.woff2') + format('woff2'); font-weight: 400; font-style: normal; } - diff --git a/src/App.tsx b/src/App.tsx index 1f2a3294..9c11872e 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,14 +1,12 @@ -import './App.scss' -import RoutesPage from 'routes/routes' - - +import './App.scss'; +import RoutesPage from './routes/routes'; function App() { - return ( + return ( <> - + - ) + ); } -export default App +export default App; diff --git a/src/Common/Form/Login/login.tsx b/src/Common/Form/Login/login.tsx index 155f3fd8..a604e73a 100644 --- a/src/Common/Form/Login/login.tsx +++ b/src/Common/Form/Login/login.tsx @@ -1,20 +1,16 @@ -import './login.scss' +import './login.scss'; import { useNavigate, Link } from 'react-router-dom'; //import { useDispatch } from "react-redux"; -import { FormEvent, useState, ChangeEvent } from 'react'; +import { FormEvent, useState, ChangeEvent } from 'react'; //import { loginUser } from '_reducers/user_reducer'; -import { LoginForm } from 'Apis/apis'; +import { LoginForm } from '@/Apis/register'; - function Login() { - const navigate = useNavigate(); //const dispatch = useDispatch(); const [email, setEmail] = useState(''); const [password, setPassword] = useState(''); - - const onChangeEmail = (e: ChangeEvent) => { setEmail(e.target.value); }; @@ -24,93 +20,99 @@ function Login() { }; interface DataToSubmit { - email: string // 사용자 아이디 (필수!) - password: string // 사용자 비밀번호 (필수!) + email: string; // 사용자 아이디 (필수!) + password: string; // 사용자 비밀번호 (필수!) } - async function Signin(event: FormEvent) { event.preventDefault(); - - if (email === undefined || email === "" || email === null) { + + if (email === undefined || email === '' || email === null) { alert('이메일을 입력해주세요.'); return false; } - - if (password === undefined || password === "" || password === null) { + + if (password === undefined || password === '' || password === null) { alert('비밀번호를 입력해주세요.'); return false; } - + const dataToSubmit: DataToSubmit = { email: email, - password: password + password: password, }; try { - //const data = await dispatch(loginUser(dataToSubmit)); - const data = await LoginForm(email, password) + const data = await LoginForm(email, password); console.log(data); - if(data.accessToken){ - alert("로그인 되었습니다!"); + if (data.accessToken) { + alert('로그인 되었습니다!'); window.localStorage.setItem('token', data.accessToken); - navigate("/"); + navigate('/'); } else { - alert("로그인에 실패하였습니다. 다시 시도해주세요."); + alert('로그인에 실패하였습니다. 다시 시도해주세요.'); } } catch (error) { console.error(error); - alert("오류가 발생했습니다. 다시 시도해주세요."); + alert('오류가 발생했습니다. 다시 시도해주세요.'); } } - - return( + return ( <> -

-
-
-

로그인

-
- -
-
- +
+ +
+

로그인

-
- -
+
+
+ +
-
- +
+ +
+ +
+ +
-
- -
-

아이디가 없으신가요?

- + +
+

아이디가 없으신가요?

+

회원가입 하러 가기!

+
-
- ) + ); } -export default Login \ No newline at end of file +export default Login; diff --git a/src/Common/Form/Signin/join.tsx b/src/Common/Form/Signin/join.tsx index 41b291b7..c9b6056a 100644 --- a/src/Common/Form/Signin/join.tsx +++ b/src/Common/Form/Signin/join.tsx @@ -1,74 +1,79 @@ -import { FormEvent, useState, useCallback } from 'react'; +import { FormEvent, useState, useCallback } from 'react'; import axios from 'axios'; import { useNavigate } from 'react-router-dom'; import { PwCheck, emailCheck } from '../Validation '; -import { JoinForm } from 'Apis/apis'; -import './join.scss' - - -function Join () { +import { JoinForm } from '@/Apis/register'; +import './join.scss'; +function Join() { const navigate = useNavigate(); - - // 이름 , 비밀번호, 이메일 , 비밀번호 확인 - const [email, setUserEmail] = useState(""); - const [displayName, setdDisplayName] = useState(""); - const [password, setUserPassword] = useState(""); - const [confirmPassword, setConfirmPassword] = useState(""); - + // 이름 , 비밀번호, 이메일 , 비밀번호 확인 + const [email, setUserEmail] = useState(''); + const [displayName, setdDisplayName] = useState(''); + const [password, setUserPassword] = useState(''); + const [confirmPassword, setConfirmPassword] = useState(''); - //비밀번호 유효성 검사 - const [isName, setIsName] = useState(false) - const [isEmail, setIsEmail] = useState(false) - const [isPassword, setIsPassword] = useState(false) - const [isPasswordConfirm, setIsPasswordConfirm] = useState(false) + //비밀번호 유효성 검사 + const [isName, setIsName] = useState(false); + const [isEmail, setIsEmail] = useState(false); + const [isPassword, setIsPassword] = useState(false); + const [isPasswordConfirm, setIsPasswordConfirm] = useState(false); //오류 메세지 저장 - const [nameMessage, setNameMessage] = useState('') - const [emailMessage, setEmailMessage] = useState('') - const [passwordMessage, setPasswordMessage] = useState('') - const [passwordConfirmMessage, setPasswordConfirmMessage] = useState('') - - - - const onChangeEmail = useCallback((e: React.ChangeEvent) => { - const emails = e.target.value - setUserEmail(emails) - if (emailCheck(emails)) { - setEmailMessage('올바른 이메일 형식이에요 : )') - setIsEmail(true) - } else { - setEmailMessage('이메일 형식이 틀렸습니다') - setIsEmail(false) - } - },[]) + const [nameMessage, setNameMessage] = useState(''); + const [emailMessage, setEmailMessage] = useState(''); + const [passwordMessage, setPasswordMessage] = useState(''); + const [passwordConfirmMessage, setPasswordConfirmMessage] = useState(''); + + const onChangeEmail = useCallback( + (e: React.ChangeEvent) => { + const emails = e.target.value; + setUserEmail(emails); + if (emailCheck(emails)) { + setEmailMessage('올바른 이메일 형식이에요 : )'); + setIsEmail(true); + } else { + setEmailMessage('이메일 형식이 틀렸습니다'); + setIsEmail(false); + } + }, + [] + ); const onChangeName = useCallback((e: React.ChangeEvent) => { - setdDisplayName(e.target.value) + setdDisplayName(e.target.value); if (e.target.value.length < 2 || e.target.value.length > 21) { - setNameMessage('2글자 이상 21글자 미만으로 입력해주세요.') - setIsName(false) - } else { - setNameMessage('올바른 이름 형식입니다 :)') - setIsName(true) - } - }, []) - - const onChangePassword = useCallback((e: React.ChangeEvent) => { - const passwordCurrent = e.target.value - setUserPassword(passwordCurrent) - - if (!PwCheck(passwordCurrent)) { - setPasswordMessage('8자리 이상 입력해주세요.') - setIsPassword(false) + setNameMessage('2글자 이상 21글자 미만으로 입력해주세요.'); + setIsName(false); } else { - setPasswordMessage('안전한 비밀번호에요 : )') - setIsPassword(true) - } - }, [confirmPassword]) - - const onChangePasswordConfirm = (password:any, confirmPassword:any, setPasswordConfirmMessage:any, setIsPasswordConfirm:any) => { + setNameMessage('올바른 이름 형식입니다 :)'); + setIsName(true); + } + }, []); + + const onChangePassword = useCallback( + (e: React.ChangeEvent) => { + const passwordCurrent = e.target.value; + setUserPassword(passwordCurrent); + + if (!PwCheck(passwordCurrent)) { + setPasswordMessage('8자리 이상 입력해주세요.'); + setIsPassword(false); + } else { + setPasswordMessage('안전한 비밀번호에요 : )'); + setIsPassword(true); + } + }, + [confirmPassword] + ); + + const onChangePasswordConfirm = ( + password: any, + confirmPassword: any, + setPasswordConfirmMessage: any, + setIsPasswordConfirm: any + ) => { if (password === confirmPassword) { setPasswordConfirmMessage('비밀번호를 똑같이 입력했어요 : )'); setIsPasswordConfirm(true); @@ -78,116 +83,144 @@ function Join () { } }; - const onPasswordConfirmChange = useCallback((e: React.ChangeEvent) => { - const passwordConfirmCurrent = e.target.value; - setConfirmPassword(passwordConfirmCurrent); - onChangePasswordConfirm(password, passwordConfirmCurrent, setPasswordConfirmMessage, setIsPasswordConfirm); - }, [password]); - - - async function signUp (event: FormEvent) { - event.preventDefault() - if(email === undefined || email === "" || email === null ){ - alert("이메일 입력해주세요."); + const onPasswordConfirmChange = useCallback( + (e: React.ChangeEvent) => { + const passwordConfirmCurrent = e.target.value; + setConfirmPassword(passwordConfirmCurrent); + onChangePasswordConfirm( + password, + passwordConfirmCurrent, + setPasswordConfirmMessage, + setIsPasswordConfirm + ); + }, + [password] + ); + + async function signUp(event: FormEvent) { + event.preventDefault(); + if (email === undefined || email === '' || email === null) { + alert('이메일 입력해주세요.'); return false; } - if( isEmail === false || isPassword === false || isPasswordConfirm === false){ - alert("값이 잘못 되었습니다. 다시 입력해주세요"); + if ( + isEmail === false || + isPassword === false || + isPasswordConfirm === false + ) { + alert('값이 잘못 되었습니다. 다시 입력해주세요'); return false; - } - - const param = { - email: email, - password: password, - displayName: displayName - } + } - try{ - const res = await JoinForm(email,displayName,password); - if (res.accessToken) { - alert("가입되었습니다."); - //localStorage.setItem('token', res.accessToken); - navigate("/login"); - } else { - alert("가입에 실패했습니다. 다시 시도해주세요."); + const param = { + email: email, + password: password, + displayName: displayName, + }; + + try { + const res = await JoinForm(email, displayName, password); + if (res.accessToken) { + alert('가입되었습니다.'); + //localStorage.setItem('token', res.accessToken); + navigate('/login'); + } else { + alert('가입에 실패했습니다. 다시 시도해주세요.'); + } + } catch (error) { + alert('시스템 오류입니다. 문의해주세요.'); } - } catch (error) { - alert("시스템 오류입니다. 문의해주세요."); } -} - return( + return ( <> -
-
-
-

회원가입📖

-
- -
-
- - {email.length > 0 && {emailMessage}} +
+ +
+

회원가입📖

-
- - {displayName.length > 0 && {nameMessage}} +
+
+ + {email.length > 0 && ( + + {emailMessage} + + )} +
+ +
+ + {displayName.length > 0 && ( + + {nameMessage} + + )} +
+ +
+ + {password.length > 0 && ( + + {passwordMessage} + + )} +
+ +
+ + {confirmPassword.length > 0 && ( + + {passwordConfirmMessage} + + )} +
+ +
+ +
- -
- - {password.length > 0 && ( - {passwordMessage} - )} -
- -
- - {confirmPassword.length > 0 && ( - {passwordConfirmMessage} - )} -
- -
- -
- - -
- - -
+ +
- ) - + ); } -export default Join; \ No newline at end of file +export default Join; diff --git a/src/Common/Layout/Header/header.tsx b/src/Common/Layout/Header/header.tsx index 03d81809..b38d11e3 100644 --- a/src/Common/Layout/Header/header.tsx +++ b/src/Common/Layout/Header/header.tsx @@ -1,71 +1,70 @@ import { Link, useNavigate } from 'react-router-dom'; //import { useSelector } from 'react-redux'; -import './headers.scss' +import './headers.scss'; //import { RootState } from '../_reducers'; //import { useDispatch } from 'react-redux'; //import { logoutUser } from '_reducers/user_reducer'; -import { LogoutForm } from 'Apis/apis'; - -function Header(){ +import { LogoutForm } from '@/Apis/register'; +function Header() { // const userState = useSelector((state) => state.user); // const accessToken = userState.accessToken; // console.log("1", accessToken); // const dispatch = useDispatch(); - const navigate = useNavigate(); - + const logoutHandler = () => { LogoutForm() - .then(() => { - localStorage.removeItem('token'); - alert("로그아웃 되셨습니다") - navigate('/'); - }) - .catch((error:string) => { - console.log('Logout failed:', error); - }); + .then(() => { + localStorage.removeItem('token'); + alert('로그아웃 되셨습니다'); + navigate('/'); + }) + .catch((error: string) => { + console.log('Logout failed:', error); + }); }; const token = localStorage.getItem('token'); - return( - <> -
-
- - - logo - - -
- -
+ return ( + <> +
+
+ + logo + +
+ +
-
- 장바구니 - 마이페이지 - {token ? ( -
-

로그아웃

-
- ) : ( - <> - -

회원가입

+
+ + 장바구니 - -

로그인

+ + 마이페이지 - - )} -
-
-
-
- - ) + {token ? ( +
+

로그아웃

+
+ ) : ( + <> + +

회원가입

+ + +

로그인

+ + + )} +
+
+
+
+ + ); } -export default Header - +export default Header; diff --git a/src/Components/Views/CartPage/CartItems/CartItems.tsx b/src/Components/Views/CartPage/CartItems/CartItems.tsx index 95f01b3b..473ce715 100644 --- a/src/Components/Views/CartPage/CartItems/CartItems.tsx +++ b/src/Components/Views/CartPage/CartItems/CartItems.tsx @@ -1,13 +1,12 @@ -import React from "react" -import { useState } from "react"; +import React from 'react'; +import { useState } from 'react'; import Box from '@mui/material/Box'; import Checkbox from '@mui/material/Checkbox'; import FormControlLabel from '@mui/material/FormControlLabel'; -import YearBox from "Common/section/number"; -import './CartItems.scss' +import YearBox from 'Common/section/number'; +import './CartItems.scss'; function CartItems() { - interface Item { id: number; // image:string; @@ -15,28 +14,60 @@ function CartItems() { text: string; price: string; sale: string; - malize:string; + malize: string; } - const [info, setInfo] = useState([]) + const [info, setInfo] = useState([]); const [checked, setChecked] = useState([true, false]); const [items, setItems] = useState([ - { id: 1, name: '[국내도서]시작하세요! C# 10프로그래밍', text:"*밤 11시 잠들기전 배송", - price:"정가: 36000", sale:"판매가:32,400", malize:"마일리지: 1,800원"}, - { id: 2, name: '도서명2', text:"*밤 11시 잠들기전 배송", - price:"정가: 36000", sale:"판매가:32,400", malize:"마일리지: 1,800원" }, - { id: 3, name: '도서명3', text:"*밤 11시 잠들기전 배송", - price:"정가: 36000", sale:"판매가:32,400", malize:"마일리지: 1,800원"}, - { id: 4, name: '도서명3', text:"*밤 11시 잠들기전 배송", - price:"정가: 36000", sale:"판매가:32,400", malize:"마일리지: 1,800원"}, - { id: 5, name: '도서명3', text:"*밤 11시 잠들기전 배송", - price:"정가: 36000", sale:"판매가:32,400", malize:"마일리지: 1,800원"}, + { + id: 1, + name: '[국내도서]시작하세요! C# 10프로그래밍', + text: '*밤 11시 잠들기전 배송', + price: '정가: 36000', + sale: '판매가:32,400', + malize: '마일리지: 1,800원', + }, + { + id: 2, + name: '도서명2', + text: '*밤 11시 잠들기전 배송', + price: '정가: 36000', + sale: '판매가:32,400', + malize: '마일리지: 1,800원', + }, + { + id: 3, + name: '도서명3', + text: '*밤 11시 잠들기전 배송', + price: '정가: 36000', + sale: '판매가:32,400', + malize: '마일리지: 1,800원', + }, + { + id: 4, + name: '도서명3', + text: '*밤 11시 잠들기전 배송', + price: '정가: 36000', + sale: '판매가:32,400', + malize: '마일리지: 1,800원', + }, + { + id: 5, + name: '도서명3', + text: '*밤 11시 잠들기전 배송', + price: '정가: 36000', + sale: '판매가:32,400', + malize: '마일리지: 1,800원', + }, ]); const [checkedItems, setCheckedItems] = useState([]); const handleChange1 = (event: React.ChangeEvent) => { const checkedValue = event.target.checked; - const updatedCheckedItems = checkedValue ? items.map((item) => item.id) : []; + const updatedCheckedItems = checkedValue + ? items.map((item) => item.id) + : []; setCheckedItems(updatedCheckedItems); }; @@ -51,86 +82,98 @@ function CartItems() { } setCheckedItems(updatedCheckedItems); }; - + const children = (itemId: number) => ( - + } + control={ + + } /> ); const handleChange = (e: React.ChangeEvent) => { - console.log() + console.log(); setInfo({ - ...info, [e.target.name]: e.target.value + ...info, + [e.target.name]: e.target.value, }); }; - return( + return ( <> -
- - 0 && checkedItems.length < items.length} - onChange={handleChange1} - /> -
- } - /> +
+ + 0 && checkedItems.length < items.length + } + onChange={handleChange1} + /> +
+ } + /> - {/*
+ {/*
구매
*/} -
+
상품명 -
+
-
+

가격

-
+
-
+
보관/삭제 -
-
- -
- {items.map((item) => ( -
-
- {children(item.id)} -
-
- cartbookimage -
-
- {item.name} - {item.text} -
+
+
-
- {item.price} - {item.sale} - {item.malize} -
+
+ {items.map((item) => ( +
+
{children(item.id)}
+
+ cartbookimage +
+
+ {item.name} + {item.text} +
- +
+ {item.price} + {item.sale} + {item.malize} +
-
- +
+ +
-
- ))} -
+ ))} +
- ) + ); } -export default CartItems \ No newline at end of file +export default CartItems; diff --git a/src/Components/Views/DetailPage/DetailPage.tsx b/src/Components/Views/DetailPage/DetailPage.tsx index bbe3398a..4b129dcd 100644 --- a/src/Components/Views/DetailPage/DetailPage.tsx +++ b/src/Components/Views/DetailPage/DetailPage.tsx @@ -1,5 +1,4 @@ -import BookCustom from '../../../bookcustom/bookcustom' -import axios from 'axios'; +import BookCustom from '../../../bookcustom/bookcustom'; import { useEffect, useState } from 'react'; import './DetailPage.scss' import { useParams } from 'react-router-dom'; @@ -17,15 +16,12 @@ function DetailPage(){ price:number, price_excluding_tax: string, selling: string, - description:string - - + description:string } - - const [detail, setDetail] = useState({} as DetailInfo); const [book, setBook] = useState([]); + const { productNo } = useParams(); async function getDetails() { try { @@ -42,11 +38,6 @@ function DetailPage(){ })(); }, []); - - - - - const BuyBook = (detailnum) => { let Cart = localStorage.getItem('cart'); @@ -72,8 +63,6 @@ function DetailPage(){ // console.log(detail); } - - const disableLinkClick = (event) => { event.preventDefault(); // You can add any additional handling here if needed @@ -85,8 +74,6 @@ function DetailPage(){ ) : ''; - - return( <> @@ -129,10 +116,10 @@ function DetailPage(){
+
-
@@ -149,6 +136,6 @@ function DetailPage(){
*/} - ) + ); } -export default DetailPage \ No newline at end of file +export default DetailPage; diff --git a/src/Components/Views/MainPage/Component/Carousel.tsx b/src/Components/Views/MainPage/Component/Carousel.tsx index 1066b6ea..ac69fb3d 100644 --- a/src/Components/Views/MainPage/Component/Carousel.tsx +++ b/src/Components/Views/MainPage/Component/Carousel.tsx @@ -63,7 +63,7 @@ export default function Carousel() { > {arr.map((v, i) => (
- +
))}
diff --git a/src/Components/Views/MainPage/Component/Genre.tsx b/src/Components/Views/MainPage/Component/Genre.tsx index 46e53818..e9b08323 100644 --- a/src/Components/Views/MainPage/Component/Genre.tsx +++ b/src/Components/Views/MainPage/Component/Genre.tsx @@ -1,6 +1,7 @@ import axios from 'axios'; import { useEffect, useState } from 'react'; import { getList } from '@/Apis/productApi'; +import { Link } from 'react-router-dom'; interface Props { type: string; @@ -31,7 +32,11 @@ export default function Genre({ category }: { category: Props }) {
{list && list.map((item) => ( -
+ {item.product_name}
{item.product_name},{item.product_no} @@ -39,7 +44,7 @@ export default function Genre({ category }: { category: Props }) {
{item.retail_price}
{item.price}
{item.main ? item.main.map((v) =>
{v}
) : null} -
+ ))}
diff --git a/src/Components/Views/MainPage/Component/Main.tsx b/src/Components/Views/MainPage/Component/Main.tsx index f1a9880a..f3fb6cef 100644 --- a/src/Components/Views/MainPage/Component/Main.tsx +++ b/src/Components/Views/MainPage/Component/Main.tsx @@ -43,24 +43,19 @@ export default function Main() { return (
-
-
    - {category.map((item) => ( -
  • - {item.type} -
  • - ))} -
- -
- {/* CATEGORY */} - {category.map((item) => ( - - ))} -
+
    + {category.map((item) => ( +
  • + {item.type} +
  • + ))} +
+ +
+ {/* CATEGORY */} + {category.map((item) => ( + + ))}
); diff --git a/src/Components/Views/MainPage/Component/Recommand.scss b/src/Components/Views/MainPage/Component/Recommand.scss new file mode 100644 index 00000000..7a51f994 --- /dev/null +++ b/src/Components/Views/MainPage/Component/Recommand.scss @@ -0,0 +1,95 @@ +.recommand { + //border: 2px solid; + //border-radius: 10px; + margin: 100px auto 0; + width: 80%; + overflow: hidden; + + h1 { + border-bottom: 1px solid; + padding-bottom: 10px; + } +} +.recommand-wrapper { + //display: grid; + //grid-template-columns: 2fr 8fr; + display: flex; + flex-wrap: wrap; + justify-content: space-evenly; + gap: 20px; + padding: 20px 0; + background-color: #fff; +} +.test { + width: calc(100% / 4); + height: 150px; + overflow: hidden; + border-radius: 10px; + + h3 { + padding: 10px 5px; + text-align: center; + } + p { + padding: 5px; + } + + &:nth-child(1) { + background-color: #3e47bc; + color: #fafffb; + p { + color: #c3c2ea; + } + } + &:nth-child(2) { + background-color: #8edcb4; + color: #000000; + p { + color: #56886f; + } + } + &:nth-child(3) { + background-color: #f8e83b; + color: #000201; + p { + color: #807718; + } + } + &:nth-child(4) { + background-color: #f8ff97; + color: #000004; + p { + color: #9c9f5a; + } + } + &:nth-child(5) { + background-color: #f1eae2; + color: #000000; + p { + color: #94918c; + } + } +} +.title { + border-right: 1px solid; + padding: 10px 10px; + cursor: pointer; + &:not(:last-child) { + border-bottom: 1px solid; + } +} +.description { + position: relative; + padding: 5% 5%; + background-color: rgb(254, 246, 243); + + a { + position: absolute; + font-size: 0.8rem; + right: 10%; + bottom: 10%; + &:hover { + color: blue; + } + } +} diff --git a/src/Components/Views/MainPage/Component/Recommand.tsx b/src/Components/Views/MainPage/Component/Recommand.tsx index d537fd51..f0b19231 100644 --- a/src/Components/Views/MainPage/Component/Recommand.tsx +++ b/src/Components/Views/MainPage/Component/Recommand.tsx @@ -1,8 +1,19 @@ import { useEffect, useState } from 'react'; import { getRecommand } from '@/Apis/productApi'; +import './Recommand.scss'; +import { Link } from 'react-router-dom'; + +type RecommandProducts = RecommandProduct[]; + +interface RecommandProduct { + shop_no: number; + product_no: number; + product_name: string; + summary_description: string; +} export default function Recommand() { - const [list, setList] = useState(); + const [list, setList] = useState(); async function recommand() { try { const res = await getRecommand(); @@ -18,14 +29,23 @@ export default function Recommand() { })(); }, []); return ( -
-

Recommand!

-
+
+

추천도서

+
{list && list.map((item) => ( -
-
{item.product_name}
-
+ +

{item.product_name}

+

+ {item.summary_description.length > 85 + ? item.summary_description.slice(0, 85) + '...' + : item.summary_description} +

+ ))}
diff --git a/src/Components/Views/MainPage/MainPage.scss b/src/Components/Views/MainPage/MainPage.scss index 030a8cd6..cee92cc3 100644 --- a/src/Components/Views/MainPage/MainPage.scss +++ b/src/Components/Views/MainPage/MainPage.scss @@ -4,15 +4,25 @@ margin: 0; padding: 0; } -main { - position: relative; - display: flex; +.wrapper { + width: 1200px; + margin: 100px auto 0; } a { display: block; text-decoration: none; color: black; } +// CATEGORY +main { + position: relative; + display: flex; + width: 1200px; + margin: 100px auto; + .tag-box { + width: 300px; + } +} .category-menu { position: sticky; top: 0; @@ -34,16 +44,6 @@ a { border-radius: 30px; } } -// CATEGORY -.wrapper { - position: relative; - display: flex; - width: 1200px; - margin: 100px auto; - .tag-box { - width: 300px; - } -} .books { display: flex; diff --git a/src/Components/Views/MainPage/MainPage.tsx b/src/Components/Views/MainPage/MainPage.tsx index 024cf775..914d8b84 100644 --- a/src/Components/Views/MainPage/MainPage.tsx +++ b/src/Components/Views/MainPage/MainPage.tsx @@ -20,10 +20,10 @@ if (params.get('code')) { export default function MainPage() { return ( - <> +
- +
); } diff --git a/src/main.tsx b/src/main.tsx index 39808af3..a9043054 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -1,22 +1,16 @@ -import React from 'react' -import ReactDOM from 'react-dom/client' -import App from './App.tsx' -import './index.scss' -import { Provider } from 'react-redux'; -import store from './store/' +import React from 'react'; +import ReactDOM from 'react-dom/client'; +import App from './App'; +import './index.scss'; + //import ReduxThunk from 'redux-thunk'; // import thunk from 'redux-thunk'; // import { createStore, applyMiddleware } from 'redux'; // import reducer from '_reducers/user_reducer.tsx'; - //const createStoreWithMiddleware = applyMiddleware(promiseMiddleware, ReduxThunk)(createStore); //const store = createStore(reducer, applyMiddleware(thunk)); ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render( - - - - - -) + +); diff --git a/src/routes/routes.tsx b/src/routes/routes.tsx index 63546b65..71b91cde 100644 --- a/src/routes/routes.tsx +++ b/src/routes/routes.tsx @@ -1,50 +1,49 @@ -import Header from 'Common/Layout/Header/header' -import Footer from 'Common/Layout/Footer/footer' -import MainPage from 'Components/Views/MainPage/mainPage' -import Join from 'Common/Form/Signin/join' -import Login from 'Common/Form/Login/login' -import CartPage from 'Components/Views/CartPage/CartPage' -import MyPage from 'Components/Views/MyPage/MyPage' -import PrivatePage from './privateRoute' -import DetailPage from 'Components/Views/DetailPage/DetailPage' +import Header from '@/Common/Layout/Header/header'; +import Footer from '@/Common/Layout/Footer/footer'; +import MainPage from '@/Components/Views/MainPage/mainPage'; +import Join from '@/Common/Form/Signin/join'; +import Login from '@/Common/Form/Login/login'; +import CartPage from '@/Components/Views/CartPage/CartPage'; +import MyPage from '@/Components/Views/MyPage/MyPage'; +import PrivatePage from './privateRoute'; +import DetailPage from '@/Components/Views/DetailPage/DetailPage'; -import { Routes, BrowserRouter, Route, Outlet } from 'react-router-dom' +import { Routes, BrowserRouter, Route, Outlet } from 'react-router-dom'; - const Layout = () => { - return( +const Layout = () => { + return ( <> -
+
-
+
- ) -} + ); +}; function RoutesPage() { - - return( + return ( <> - - - }> - }/> - }/> - }/> - } /> - } status={""}/>}/> - } status={""}/>} - /> - - - + + + }> + } /> + } /> + } /> + } /> + } status={''} />} + /> + } status={''} />} + /> - {/* }/> */} - - - + {/* }/> */} + + + - ) + ); } -export default RoutesPage \ No newline at end of file +export default RoutesPage; diff --git a/tsconfig.json b/tsconfig.json index 5518d03d..4e0d67aa 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -7,7 +7,7 @@ "skipLibCheck": true, "baseUrl": "./", "paths": { - "@/": ["src/"] + "@/*": ["src/*"] }, /* Bundler mode */ From 89dbee93dc50eff90d13507984e8d6d6dceb4a76 Mon Sep 17 00:00:00 2001 From: moon daehyun Date: Tue, 13 Jun 2023 14:07:19 +0900 Subject: [PATCH 10/75] test: pull test --- src/Apis/productApi.ts | 12 +- src/App.tsx | 2 +- src/Common/Form/Login/login.tsx | 124 +++--- src/Common/Form/Signin/join.tsx | 345 +++++++++-------- src/Common/Layout/Header/header.tsx | 97 +++-- .../Views/CartPage/CartItems/CartItems.tsx | 189 ++++++---- .../Views/DetailPage/DetailPage.scss | 354 +++++++++--------- .../Views/DetailPage/DetailPage.tsx | 112 ++++-- .../Views/MainPage/Component/Carousel.tsx | 4 +- .../Views/MainPage/Component/Recommand.scss | 95 +++++ .../Views/MainPage/Component/Recommand.tsx | 36 +- src/Components/Views/MainPage/MainPage.scss | 28 +- src/Components/Views/MainPage/MainPage.tsx | 6 +- src/Components/Views/MyPage/MyPage.tsx | 12 +- src/Components/Views/MyPage/UserInfo.tsx | 83 +++- src/main.tsx | 8 +- src/routes/routes.tsx | 22 +- teamwink.com-key.pem | 28 ++ teamwink.com.pem | 26 ++ tsconfig.json | 2 +- 20 files changed, 985 insertions(+), 600 deletions(-) create mode 100644 src/Components/Views/MainPage/Component/Recommand.scss create mode 100644 teamwink.com-key.pem create mode 100644 teamwink.com.pem diff --git a/src/Apis/productApi.ts b/src/Apis/productApi.ts index 9bcd673a..49193a2c 100644 --- a/src/Apis/productApi.ts +++ b/src/Apis/productApi.ts @@ -1,4 +1,3 @@ -//import axios from '@/Apis/axios'; import axios from 'axios'; const { VITE_CLIENT_ID } = import.meta.env; @@ -19,7 +18,7 @@ export async function getList(category: number) { category: category, }, }); - console.log(data.products); + //console.log(data.products); return data.products; } catch (err) { console.log(err); @@ -34,3 +33,12 @@ export async function getRecommand() { console.log(err); } } + +export async function getDetail(product_no: string) { + try { + const res = await ajax.get(`/products/${product_no}`); + return res.data; + } catch (err) { + console.log(err); + } +} \ No newline at end of file diff --git a/src/App.tsx b/src/App.tsx index 1f2a3294..afb11f48 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,5 +1,5 @@ import './App.scss' -import RoutesPage from 'routes/routes' +import RoutesPage from '@/routes/routes' diff --git a/src/Common/Form/Login/login.tsx b/src/Common/Form/Login/login.tsx index 155f3fd8..789899e6 100644 --- a/src/Common/Form/Login/login.tsx +++ b/src/Common/Form/Login/login.tsx @@ -1,20 +1,16 @@ -import './login.scss' +import './login.scss'; import { useNavigate, Link } from 'react-router-dom'; //import { useDispatch } from "react-redux"; -import { FormEvent, useState, ChangeEvent } from 'react'; +import { FormEvent, useState, ChangeEvent } from 'react'; //import { loginUser } from '_reducers/user_reducer'; -import { LoginForm } from 'Apis/apis'; +import { LoginForm } from '@/Apis/register'; - function Login() { - const navigate = useNavigate(); //const dispatch = useDispatch(); const [email, setEmail] = useState(''); const [password, setPassword] = useState(''); - - const onChangeEmail = (e: ChangeEvent) => { setEmail(e.target.value); }; @@ -24,93 +20,99 @@ function Login() { }; interface DataToSubmit { - email: string // 사용자 아이디 (필수!) - password: string // 사용자 비밀번호 (필수!) + email: string; // 사용자 아이디 (필수!) + password: string; // 사용자 비밀번호 (필수!) } - async function Signin(event: FormEvent) { event.preventDefault(); - - if (email === undefined || email === "" || email === null) { + + if (email === undefined || email === '' || email === null) { alert('이메일을 입력해주세요.'); return false; } - - if (password === undefined || password === "" || password === null) { + + if (password === undefined || password === '' || password === null) { alert('비밀번호를 입력해주세요.'); return false; } - + const dataToSubmit: DataToSubmit = { email: email, - password: password + password: password, }; try { - //const data = await dispatch(loginUser(dataToSubmit)); - const data = await LoginForm(email, password) + const data = await LoginForm(email, password); console.log(data); - if(data.accessToken){ - alert("로그인 되었습니다!"); + if (data.accessToken) { + alert('로그인 되었습니다!'); window.localStorage.setItem('token', data.accessToken); - navigate("/"); + navigate('/'); } else { - alert("로그인에 실패하였습니다. 다시 시도해주세요."); + alert('로그인에 실패하였습니다. 다시 시도해주세요.'); } } catch (error) { console.error(error); - alert("오류가 발생했습니다. 다시 시도해주세요."); + alert('오류가 발생했습니다. 다시 시도해주세요.'); } } - - return( + return ( <> -
-
-
-

로그인

-
- -
-
- +
+ +
+

로그인

-
- -
+
+
+ +
-
- +
+ +
+ +
+ +
-
- -
-

아이디가 없으신가요?

- + +
+

아이디가 없으신가요?

+

회원가입 하러 가기!

+
-
- ) + ); } -export default Login \ No newline at end of file +export default Login; \ No newline at end of file diff --git a/src/Common/Form/Signin/join.tsx b/src/Common/Form/Signin/join.tsx index 41b291b7..9be790ff 100644 --- a/src/Common/Form/Signin/join.tsx +++ b/src/Common/Form/Signin/join.tsx @@ -1,74 +1,79 @@ -import { FormEvent, useState, useCallback } from 'react'; +import { FormEvent, useState, useCallback } from 'react'; import axios from 'axios'; import { useNavigate } from 'react-router-dom'; import { PwCheck, emailCheck } from '../Validation '; -import { JoinForm } from 'Apis/apis'; -import './join.scss' - - -function Join () { +import { JoinForm } from '@/Apis/register'; +import './join.scss'; +function Join() { const navigate = useNavigate(); - - // 이름 , 비밀번호, 이메일 , 비밀번호 확인 - const [email, setUserEmail] = useState(""); - const [displayName, setdDisplayName] = useState(""); - const [password, setUserPassword] = useState(""); - const [confirmPassword, setConfirmPassword] = useState(""); - + // 이름 , 비밀번호, 이메일 , 비밀번호 확인 + const [email, setUserEmail] = useState(''); + const [displayName, setdDisplayName] = useState(''); + const [password, setUserPassword] = useState(''); + const [confirmPassword, setConfirmPassword] = useState(''); - //비밀번호 유효성 검사 - const [isName, setIsName] = useState(false) - const [isEmail, setIsEmail] = useState(false) - const [isPassword, setIsPassword] = useState(false) - const [isPasswordConfirm, setIsPasswordConfirm] = useState(false) + //비밀번호 유효성 검사 + const [isName, setIsName] = useState(false); + const [isEmail, setIsEmail] = useState(false); + const [isPassword, setIsPassword] = useState(false); + const [isPasswordConfirm, setIsPasswordConfirm] = useState(false); //오류 메세지 저장 - const [nameMessage, setNameMessage] = useState('') - const [emailMessage, setEmailMessage] = useState('') - const [passwordMessage, setPasswordMessage] = useState('') - const [passwordConfirmMessage, setPasswordConfirmMessage] = useState('') - - - - const onChangeEmail = useCallback((e: React.ChangeEvent) => { - const emails = e.target.value - setUserEmail(emails) - if (emailCheck(emails)) { - setEmailMessage('올바른 이메일 형식이에요 : )') - setIsEmail(true) - } else { - setEmailMessage('이메일 형식이 틀렸습니다') - setIsEmail(false) - } - },[]) + const [nameMessage, setNameMessage] = useState(''); + const [emailMessage, setEmailMessage] = useState(''); + const [passwordMessage, setPasswordMessage] = useState(''); + const [passwordConfirmMessage, setPasswordConfirmMessage] = useState(''); + + const onChangeEmail = useCallback( + (e: React.ChangeEvent) => { + const emails = e.target.value; + setUserEmail(emails); + if (emailCheck(emails)) { + setEmailMessage('올바른 이메일 형식이에요 : )'); + setIsEmail(true); + } else { + setEmailMessage('이메일 형식이 틀렸습니다'); + setIsEmail(false); + } + }, + [] + ); const onChangeName = useCallback((e: React.ChangeEvent) => { - setdDisplayName(e.target.value) + setdDisplayName(e.target.value); if (e.target.value.length < 2 || e.target.value.length > 21) { - setNameMessage('2글자 이상 21글자 미만으로 입력해주세요.') - setIsName(false) - } else { - setNameMessage('올바른 이름 형식입니다 :)') - setIsName(true) - } - }, []) - - const onChangePassword = useCallback((e: React.ChangeEvent) => { - const passwordCurrent = e.target.value - setUserPassword(passwordCurrent) - - if (!PwCheck(passwordCurrent)) { - setPasswordMessage('8자리 이상 입력해주세요.') - setIsPassword(false) + setNameMessage('2글자 이상 21글자 미만으로 입력해주세요.'); + setIsName(false); } else { - setPasswordMessage('안전한 비밀번호에요 : )') - setIsPassword(true) - } - }, [confirmPassword]) - - const onChangePasswordConfirm = (password:any, confirmPassword:any, setPasswordConfirmMessage:any, setIsPasswordConfirm:any) => { + setNameMessage('올바른 이름 형식입니다 :)'); + setIsName(true); + } + }, []); + + const onChangePassword = useCallback( + (e: React.ChangeEvent) => { + const passwordCurrent = e.target.value; + setUserPassword(passwordCurrent); + + if (!PwCheck(passwordCurrent)) { + setPasswordMessage('8자리 이상 입력해주세요.'); + setIsPassword(false); + } else { + setPasswordMessage('안전한 비밀번호에요 : )'); + setIsPassword(true); + } + }, + [confirmPassword] + ); + + const onChangePasswordConfirm = ( + password: any, + confirmPassword: any, + setPasswordConfirmMessage: any, + setIsPasswordConfirm: any + ) => { if (password === confirmPassword) { setPasswordConfirmMessage('비밀번호를 똑같이 입력했어요 : )'); setIsPasswordConfirm(true); @@ -78,116 +83,144 @@ function Join () { } }; - const onPasswordConfirmChange = useCallback((e: React.ChangeEvent) => { - const passwordConfirmCurrent = e.target.value; - setConfirmPassword(passwordConfirmCurrent); - onChangePasswordConfirm(password, passwordConfirmCurrent, setPasswordConfirmMessage, setIsPasswordConfirm); - }, [password]); - - - async function signUp (event: FormEvent) { - event.preventDefault() - if(email === undefined || email === "" || email === null ){ - alert("이메일 입력해주세요."); + const onPasswordConfirmChange = useCallback( + (e: React.ChangeEvent) => { + const passwordConfirmCurrent = e.target.value; + setConfirmPassword(passwordConfirmCurrent); + onChangePasswordConfirm( + password, + passwordConfirmCurrent, + setPasswordConfirmMessage, + setIsPasswordConfirm + ); + }, + [password] + ); + + async function signUp(event: FormEvent) { + event.preventDefault(); + if (email === undefined || email === '' || email === null) { + alert('이메일 입력해주세요.'); return false; } - if( isEmail === false || isPassword === false || isPasswordConfirm === false){ - alert("값이 잘못 되었습니다. 다시 입력해주세요"); + if ( + isEmail === false || + isPassword === false || + isPasswordConfirm === false + ) { + alert('값이 잘못 되었습니다. 다시 입력해주세요'); return false; - } - - const param = { - email: email, - password: password, - displayName: displayName - } + } - try{ - const res = await JoinForm(email,displayName,password); - if (res.accessToken) { - alert("가입되었습니다."); - //localStorage.setItem('token', res.accessToken); - navigate("/login"); - } else { - alert("가입에 실패했습니다. 다시 시도해주세요."); + const param = { + email: email, + password: password, + displayName: displayName, + }; + + try { + const res = await JoinForm(email, displayName, password); + if (res.accessToken) { + alert('가입되었습니다.'); + //localStorage.setItem('token', res.accessToken); + navigate('/login'); + } else { + alert('가입에 실패했습니다. 다시 시도해주세요.'); + } + } catch (error) { + alert('시스템 오류입니다. 문의해주세요.'); } - } catch (error) { - alert("시스템 오류입니다. 문의해주세요."); } -} - return( + return ( <> -
-
-
-

회원가입📖

-
- -
-
- - {email.length > 0 && {emailMessage}} +
+ +
+

회원가입📖

-
- - {displayName.length > 0 && {nameMessage}} +
+
+ + {email.length > 0 && ( + + {emailMessage} + + )} +
+ +
+ + {displayName.length > 0 && ( + + {nameMessage} + + )} +
+ +
+ + {password.length > 0 && ( + + {passwordMessage} + + )} +
+ +
+ + {confirmPassword.length > 0 && ( + + {passwordConfirmMessage} + + )} +
+ +
+ +
- -
- - {password.length > 0 && ( - {passwordMessage} - )} -
- -
- - {confirmPassword.length > 0 && ( - {passwordConfirmMessage} - )} -
- -
- -
- - -
- - -
+ +
- ) - + ); } export default Join; \ No newline at end of file diff --git a/src/Common/Layout/Header/header.tsx b/src/Common/Layout/Header/header.tsx index 03d81809..1f88aee4 100644 --- a/src/Common/Layout/Header/header.tsx +++ b/src/Common/Layout/Header/header.tsx @@ -1,71 +1,70 @@ import { Link, useNavigate } from 'react-router-dom'; //import { useSelector } from 'react-redux'; -import './headers.scss' +import './headers.scss'; //import { RootState } from '../_reducers'; //import { useDispatch } from 'react-redux'; //import { logoutUser } from '_reducers/user_reducer'; -import { LogoutForm } from 'Apis/apis'; - -function Header(){ +import { LogoutForm } from '@/Apis/register'; +function Header() { // const userState = useSelector((state) => state.user); // const accessToken = userState.accessToken; // console.log("1", accessToken); // const dispatch = useDispatch(); - const navigate = useNavigate(); - + const logoutHandler = () => { LogoutForm() - .then(() => { - localStorage.removeItem('token'); - alert("로그아웃 되셨습니다") - navigate('/'); - }) - .catch((error:string) => { - console.log('Logout failed:', error); - }); + .then(() => { + localStorage.removeItem('token'); + alert('로그아웃 되셨습니다'); + navigate('/'); + }) + .catch((error: string) => { + console.log('Logout failed:', error); + }); }; const token = localStorage.getItem('token'); - return( - <> -
-
- - - logo - - -
- -
+ return ( + <> +
+
+ + logo + +
+ +
-
- 장바구니 - 마이페이지 - {token ? ( -
-

로그아웃

-
- ) : ( - <> - -

회원가입

+
+ + 장바구니 - -

로그인

+ + 마이페이지 - - )} -
-
-
-
- - ) + {token ? ( +
+

로그아웃

+
+ ) : ( + <> + +

회원가입

+ + +

로그인

+ + + )} +
+
+
+
+ + ); } -export default Header - +export default Header; \ No newline at end of file diff --git a/src/Components/Views/CartPage/CartItems/CartItems.tsx b/src/Components/Views/CartPage/CartItems/CartItems.tsx index 95f01b3b..06bccf0a 100644 --- a/src/Components/Views/CartPage/CartItems/CartItems.tsx +++ b/src/Components/Views/CartPage/CartItems/CartItems.tsx @@ -1,13 +1,12 @@ -import React from "react" -import { useState } from "react"; +import React from 'react'; +import { useState } from 'react'; import Box from '@mui/material/Box'; import Checkbox from '@mui/material/Checkbox'; import FormControlLabel from '@mui/material/FormControlLabel'; -import YearBox from "Common/section/number"; -import './CartItems.scss' +import YearBox from '@/Common/section/number'; +import './CartItems.scss'; function CartItems() { - interface Item { id: number; // image:string; @@ -15,28 +14,60 @@ function CartItems() { text: string; price: string; sale: string; - malize:string; + malize: string; } - const [info, setInfo] = useState([]) + const [info, setInfo] = useState([]); const [checked, setChecked] = useState([true, false]); const [items, setItems] = useState([ - { id: 1, name: '[국내도서]시작하세요! C# 10프로그래밍', text:"*밤 11시 잠들기전 배송", - price:"정가: 36000", sale:"판매가:32,400", malize:"마일리지: 1,800원"}, - { id: 2, name: '도서명2', text:"*밤 11시 잠들기전 배송", - price:"정가: 36000", sale:"판매가:32,400", malize:"마일리지: 1,800원" }, - { id: 3, name: '도서명3', text:"*밤 11시 잠들기전 배송", - price:"정가: 36000", sale:"판매가:32,400", malize:"마일리지: 1,800원"}, - { id: 4, name: '도서명3', text:"*밤 11시 잠들기전 배송", - price:"정가: 36000", sale:"판매가:32,400", malize:"마일리지: 1,800원"}, - { id: 5, name: '도서명3', text:"*밤 11시 잠들기전 배송", - price:"정가: 36000", sale:"판매가:32,400", malize:"마일리지: 1,800원"}, + { + id: 1, + name: '[국내도서]시작하세요! C# 10프로그래밍', + text: '*밤 11시 잠들기전 배송', + price: '정가: 36000', + sale: '판매가:32,400', + malize: '마일리지: 1,800원', + }, + { + id: 2, + name: '도서명2', + text: '*밤 11시 잠들기전 배송', + price: '정가: 36000', + sale: '판매가:32,400', + malize: '마일리지: 1,800원', + }, + { + id: 3, + name: '도서명3', + text: '*밤 11시 잠들기전 배송', + price: '정가: 36000', + sale: '판매가:32,400', + malize: '마일리지: 1,800원', + }, + { + id: 4, + name: '도서명3', + text: '*밤 11시 잠들기전 배송', + price: '정가: 36000', + sale: '판매가:32,400', + malize: '마일리지: 1,800원', + }, + { + id: 5, + name: '도서명3', + text: '*밤 11시 잠들기전 배송', + price: '정가: 36000', + sale: '판매가:32,400', + malize: '마일리지: 1,800원', + }, ]); const [checkedItems, setCheckedItems] = useState([]); const handleChange1 = (event: React.ChangeEvent) => { const checkedValue = event.target.checked; - const updatedCheckedItems = checkedValue ? items.map((item) => item.id) : []; + const updatedCheckedItems = checkedValue + ? items.map((item) => item.id) + : []; setCheckedItems(updatedCheckedItems); }; @@ -51,86 +82,98 @@ function CartItems() { } setCheckedItems(updatedCheckedItems); }; - + const children = (itemId: number) => ( - + } + control={ + + } /> ); const handleChange = (e: React.ChangeEvent) => { - console.log() + console.log(); setInfo({ - ...info, [e.target.name]: e.target.value + ...info, + [e.target.name]: e.target.value, }); }; - return( + return ( <> -
- - 0 && checkedItems.length < items.length} - onChange={handleChange1} - /> -
- } - /> +
+ + 0 && checkedItems.length < items.length + } + onChange={handleChange1} + /> +
+ } + /> - {/*
+ {/*
구매
*/} -
+
상품명 -
+
-
+

가격

-
+
-
+
보관/삭제 -
-
- -
- {items.map((item) => ( -
-
- {children(item.id)} -
-
- cartbookimage -
-
- {item.name} - {item.text} -
+
+
-
- {item.price} - {item.sale} - {item.malize} -
+
+ {items.map((item) => ( +
+
{children(item.id)}
+
+ cartbookimage +
+
+ {item.name} + {item.text} +
- +
+ {item.price} + {item.sale} + {item.malize} +
-
- +
+ +
-
- ))} -
+ ))} +
- ) + ); } -export default CartItems \ No newline at end of file +export default CartItems; \ No newline at end of file diff --git a/src/Components/Views/DetailPage/DetailPage.scss b/src/Components/Views/DetailPage/DetailPage.scss index 4056ab5e..43205752 100644 --- a/src/Components/Views/DetailPage/DetailPage.scss +++ b/src/Components/Views/DetailPage/DetailPage.scss @@ -1,189 +1,209 @@ @mixin PriceContainer { - width: 300px; - height: 30px; - } - - @mixin PriceText { - font-size: 20px; - height: 30px; - } - - @mixin PriceNumber{ - font-size: 20px; - margin-left: 50px; - } - - .DetailContainer { + width: 300px; + height: 30px; +} + +@mixin PriceText { + font-size: 20px; + height: 30px; +} + +@mixin PriceNumber{ + font-size: 20px; + margin-left: 50px; +} + +.DetailContainer { + position: relative; + width: 1400px; + margin: 0 auto; + left: 0; + right: 0; + //font-family: 'Dovemayo_gothic'; + font-family: 'SUITE-Regular'; + + .ImgContainer{ + height: 780px; position: relative; - width: 1400px; - margin: 0 auto; - left: 0; - right: 0; - //font-family: 'Dovemayo_gothic'; - - .ImgContainer{ - height: 780px; - position: relative; - } - - .LeftContainer { - width: 600px; - max-width: 500px; - //background-color: yellow; + } + + .LeftContainer { + width: 600px; + max-width: 500px; + //background-color: yellow; + position: absolute; + height: 650px; + top: 60px; + left: 100px; + z-index: 100; + + .TitleBox{ + width: auto; + height: 60px; position: absolute; - height: 650px; - top: 60px; - left: 100px; - z-index: 100; - - .TitleBox{ - width: 250px; - height: 60px; - position: absolute; - margin: 0 auto; - left: 0; - right: 0; - //background-color: red; - - p{ - font-size: 40px; - } + margin: 0 auto; + left: 0; + right: 0; + //background-color: red; + + p{ + font-size: 30px; } - .BookimgBox{ - width: 450px; - height: 560px; - border-radius: 10px; - background-color: rgb(253, 251, 251); - border: 2px solid rgb(116, 45, 1); - position: absolute; - top: 80px; + } + .BookimgBox{ + width: 450px; + height: 560px; + border-radius: 10px; + background-color: rgb(253, 251, 251); + border: 2px solid rgb(116, 45, 1); + position: absolute; + top: 80px; + margin: auto; + left: 0; + right: 0; + + img{ + width: 360px; + height: auto; + //position: absolute; margin: auto; left: 0; right: 0; - - img{ - width: 360px; - height: auto; - position: absolute; - margin: auto; - left: 0; - right: 0; - } } } - - .RightContainer{ - width: 500px; - max-width: 500px; - padding-bottom: 540px; - //background-color: yellow; + } + + .RightContainer{ + width: 500px; + max-width: 500px; + padding-bottom: 540px; + //background-color: yellow; + position: absolute; + top: 100px; + right: 130px; + z-index: 100; + + .RightContainer-TopText{ + width: 300px; + height: 60px; + font-size: 20px; + color: rgb(234, 72, 99); + } + + .RightContainer-Content{ + width: inherit; + height: 400px; + //background-color: blue; position: absolute; top: 100px; - right: 130px; - z-index: 100; - - .RightContainer-TopText{ - width: 300px; - height: 60px; - font-size: 20px; - color: rgb(234, 72, 99); + + + .OriginPrice{ + @include PriceContainer; + margin-top: 20px; + //background-color: aliceblue; + //position: relative; + + .PriceText{ + @include PriceText; + //background-color: yellow; + } + + .PriceNumber{ + @include PriceNumber; + //background-color: rgb(18, 220, 18); + } } - - .RightContainer-Content{ - width: inherit; - height: 400px; - //background-color: blue; - position: absolute; - top: 100px; - - - .OriginPrice{ - @include PriceContainer; - margin-top: 20px; - //background-color: aliceblue; - //position: relative; - - .PriceText{ - @include PriceText; - //background-color: yellow; - } - - .PriceNumber{ - @include PriceNumber; - //background-color: rgb(18, 220, 18); - } + + .ContentContainer{ + width: 400px; + height: 200px; + //background-color: blanchedalmond; + margin-top: 10px; + position: relative; + + .ContentBox{ + width: 200px; + height: 100px; + //background-color: olive; + font-size: 20px; } - - .ContentContainer{ + + .contentText{ width: 400px; - height: 200px; - //background-color: blanchedalmond; - margin-top: 10px; - position: relative; - - .ContentBox{ - width: 200px; - height: 100px; - //background-color: olive; - font-size: 20px; - } - - .contentText{ - width: 400px; - height: 100px; - //background-color: orangered; - position: absolute; - top: 40px; - left: 0; - right: 0; - } + height: 100px; + //background-color: orangered; + position: absolute; + top: 40px; + left: 0; + right: 0; } - - - .CardPrice{ - width: 350px; + } + + + .CardPrice{ + width: 350px; + height: 30px; + //background-color: palevioletred; + margin-top: 10px; + + .CardText{ + font-size: 20px; height: 30px; - //background-color: palevioletred; - margin-top: 10px; - - .CardText{ - font-size: 20px; - height: 30px; - //background-color: yellow; - } - - .PriceNumber{ - @include PriceNumber; - } + //background-color: yellow; } - - .ButtonContainer{ - width: 400px; - height: 50px; - //background-color: orchid; - position: relative; - margin: 0 auto; - margin-top: 20px; - - .CartAdd{ - width: 150px; - height: 50px; - background-color: palegreen; - position: absolute; - margin: auto; - } - .BookBill{ - width: 150px; - height: 50px; - background-color: rgb(228, 207, 13); - position: absolute; - right: 20px; - } + .PriceNumber{ + @include PriceNumber; + } + } + + .ButtonContainer{ + width: 400px; + height: 50px; + //background-color: orchid; + position: relative; + margin: 0 auto; + margin-top: 20px; + + .CartAdd{ + width: 150px; + height: 50px; + background-color: palegreen; + position: absolute; + margin: auto; + } + + .BookBill{ + width: 150px; + height: 50px; + background-color: rgb(228, 207, 13); + position: absolute; + right: 20px; } } } - - } - \ No newline at end of file + + .InnerContent{ + width: 900px; + background-color: red; + height: auto; + display: block; + margin: 0 auto; + font-family: 'SUITE-Regular'; + + img{ + width: 900px; + //position: absolute; + display: flex; + margin: 0 auto; + } + + p{ + font-family: 'SUITE-Regular' !important; + background-color: antiquewhite; + } + + } +} diff --git a/src/Components/Views/DetailPage/DetailPage.tsx b/src/Components/Views/DetailPage/DetailPage.tsx index 0421fd81..e9de2e6f 100644 --- a/src/Components/Views/DetailPage/DetailPage.tsx +++ b/src/Components/Views/DetailPage/DetailPage.tsx @@ -1,32 +1,38 @@ -import BookCustom from '../../../bookcustom/bookcustom' -import axios from 'axios'; +import BookCustom from '../../../bookcustom/bookcustom'; import { useEffect, useState } from 'react'; import './DetailPage.scss' +import { useParams } from 'react-router-dom'; +import { getDetail } from '@/Apis/productApi'; +function DetailPage(){ -const { VITE_CLIENT_ID } = import.meta.env; -const ajax = axios.create({ - baseURL: '/cafe24/api/v2', - headers: { - 'Content-Type': 'application/json', - 'X-Cafe24-Client-Id': VITE_CLIENT_ID, - }, -}); + interface DetailInfo { + detail_image:string, + product_name:string, + retail_price:number, + simple_description:string, + summary_description:string, + product_no:string, + price:number, + price_excluding_tax: string, + selling: string, + description:string + } + const [detail, setDetail] = useState({} as DetailInfo); + const [book, setBook] = useState([]); -function DetailPage(){ - const [detail, setDetail] = useState({} as Product); + const { productNo } = useParams(); async function getDetails() { try { - const { data } = await ajax.get('/products/21'); + const data = await getDetail(productNo as string); setDetail(data.product); } catch (err) { console.log(err); } } - useEffect(() => { (async () => { await getDetails(); @@ -34,6 +40,42 @@ function DetailPage(){ }, []); + const BuyBook = (detailnum) => { + let Cart = localStorage.getItem('cart'); + + // if(Cart === null) { + // Cart = []; + // } else { + // Cart = JSON.parse(Cart); + // } + + // let datalist = { + // "buy": [] + // ,"rent": [] + // }1 + + + // datalist.buy[1]= productid; + + // buy - [1,2,4,56] + // rent - [1,3,6,7] + // let c = localStorage.getIte(cart); + // c.buy + // Cart.push() + // console.log(detail); + } + + const disableLinkClick = (event) => { + event.preventDefault(); + // You can add any additional handling here if needed + }; + + const modifiedDescription = detail.description + ? detail.description.replace(/]*>/gi, (match) => + match.replace('href', 'data-disabled-href') + ) + : ''; + return( <> @@ -44,10 +86,10 @@ function DetailPage(){
-

제목입니다.

+ {detail.product_name}
- bookimgs +
@@ -57,26 +99,14 @@ function DetailPage(){
-
- 정가 - 22,000 -
판매가 - 22,000 -
-
- 수량 - 22,000 + {detail.price}
줄거리 -

더 이상 설명이 필요 없는 20세기 환경학 최고의 고전 [침묵의 봄]이 - 50주년 기념 개정판으로 나왔다. 이번 개정판에는 서문과 후기가 - 완전히 새롭게 단장되었으며, 2002년 출간본에는 없던(원서에도 - 없었음) 찾아보기를 새롭게 추가했다. 그리고 편집과 장정도 완전히 - 바뀌었다.

+

@@ -86,16 +116,28 @@ function DetailPage(){
- + +
- +
+
+ {/*
+ +
*/} + {/*
+
*/} + + {/*
+ +
*/} -
- ) + ); } -export default DetailPage \ No newline at end of file +export default DetailPage; \ No newline at end of file diff --git a/src/Components/Views/MainPage/Component/Carousel.tsx b/src/Components/Views/MainPage/Component/Carousel.tsx index 1066b6ea..0ffbbe59 100644 --- a/src/Components/Views/MainPage/Component/Carousel.tsx +++ b/src/Components/Views/MainPage/Component/Carousel.tsx @@ -63,7 +63,7 @@ export default function Carousel() { > {arr.map((v, i) => (
- +
))}
@@ -78,4 +78,4 @@ export default function Carousel() {
); -} +} \ No newline at end of file diff --git a/src/Components/Views/MainPage/Component/Recommand.scss b/src/Components/Views/MainPage/Component/Recommand.scss new file mode 100644 index 00000000..c1d9cd95 --- /dev/null +++ b/src/Components/Views/MainPage/Component/Recommand.scss @@ -0,0 +1,95 @@ +.recommand { + //border: 2px solid; + //border-radius: 10px; + margin: 100px auto 0; + width: 80%; + overflow: hidden; + + h1 { + border-bottom: 1px solid; + padding-bottom: 10px; + } +} +.recommand-wrapper { + //display: grid; + //grid-template-columns: 2fr 8fr; + display: flex; + flex-wrap: wrap; + justify-content: space-evenly; + gap: 20px; + padding: 20px 0; + background-color: #fff; +} +.test { + width: calc(100% / 4); + height: 150px; + overflow: hidden; + border-radius: 10px; + + h3 { + padding: 10px 5px; + text-align: center; + } + p { + padding: 5px; + } + + &:nth-child(1) { + background-color: #3e47bc; + color: #fafffb; + p { + color: #c3c2ea; + } + } + &:nth-child(2) { + background-color: #8edcb4; + color: #000000; + p { + color: #56886f; + } + } + &:nth-child(3) { + background-color: #f8e83b; + color: #000201; + p { + color: #807718; + } + } + &:nth-child(4) { + background-color: #f8ff97; + color: #000004; + p { + color: #9c9f5a; + } + } + &:nth-child(5) { + background-color: #f1eae2; + color: #000000; + p { + color: #94918c; + } + } +} +.title { + border-right: 1px solid; + padding: 10px 10px; + cursor: pointer; + &:not(:last-child) { + border-bottom: 1px solid; + } +} +.description { + position: relative; + padding: 5% 5%; + background-color: rgb(254, 246, 243); + + a { + position: absolute; + font-size: 0.8rem; + right: 10%; + bottom: 10%; + &:hover { + color: blue; + } + } +} \ No newline at end of file diff --git a/src/Components/Views/MainPage/Component/Recommand.tsx b/src/Components/Views/MainPage/Component/Recommand.tsx index d537fd51..93c33247 100644 --- a/src/Components/Views/MainPage/Component/Recommand.tsx +++ b/src/Components/Views/MainPage/Component/Recommand.tsx @@ -1,8 +1,19 @@ import { useEffect, useState } from 'react'; import { getRecommand } from '@/Apis/productApi'; +import './Recommand.scss'; +import { Link } from 'react-router-dom'; + +type RecommandProducts = RecommandProduct[]; + +interface RecommandProduct { + shop_no: number; + product_no: number; + product_name: string; + summary_description: string; +} export default function Recommand() { - const [list, setList] = useState(); + const [list, setList] = useState(); async function recommand() { try { const res = await getRecommand(); @@ -18,16 +29,25 @@ export default function Recommand() { })(); }, []); return ( -
-

Recommand!

-
+
+

추천도서

+
{list && list.map((item) => ( -
-
{item.product_name}
-
+ +

{item.product_name}

+

+ {item.summary_description.length > 85 + ? item.summary_description.slice(0, 85) + '...' + : item.summary_description} +

+ ))}
); -} +} \ No newline at end of file diff --git a/src/Components/Views/MainPage/MainPage.scss b/src/Components/Views/MainPage/MainPage.scss index 030a8cd6..f932d567 100644 --- a/src/Components/Views/MainPage/MainPage.scss +++ b/src/Components/Views/MainPage/MainPage.scss @@ -4,15 +4,25 @@ margin: 0; padding: 0; } -main { - position: relative; - display: flex; +.wrapper { + width: 1200px; + margin: 100px auto 0; } a { display: block; text-decoration: none; color: black; } +// CATEGORY +main { + position: relative; + display: flex; + width: 1200px; + margin: 100px auto; + .tag-box { + width: 300px; + } +} .category-menu { position: sticky; top: 0; @@ -34,16 +44,6 @@ a { border-radius: 30px; } } -// CATEGORY -.wrapper { - position: relative; - display: flex; - width: 1200px; - margin: 100px auto; - .tag-box { - width: 300px; - } -} .books { display: flex; @@ -76,4 +76,4 @@ a { //height: 200px; } } -} +} \ No newline at end of file diff --git a/src/Components/Views/MainPage/MainPage.tsx b/src/Components/Views/MainPage/MainPage.tsx index 024cf775..2bd7ac94 100644 --- a/src/Components/Views/MainPage/MainPage.tsx +++ b/src/Components/Views/MainPage/MainPage.tsx @@ -20,10 +20,10 @@ if (params.get('code')) { export default function MainPage() { return ( - <> +
- +
); -} +} \ No newline at end of file diff --git a/src/Components/Views/MyPage/MyPage.tsx b/src/Components/Views/MyPage/MyPage.tsx index 0fde3be1..94c221bb 100644 --- a/src/Components/Views/MyPage/MyPage.tsx +++ b/src/Components/Views/MyPage/MyPage.tsx @@ -1,8 +1,13 @@ -// import { useState, useEffect } from 'react'; +import { FormEvent, useState, useEffect } from 'react'; import { Link } from 'react-router-dom'; import './MyPage.scss' function MyPage () { + + const [email, setEmail] = useState(''); + + + return( <>
@@ -24,7 +29,7 @@ function MyPage () {
주문내역조회

- +
회원정보 수정

@@ -39,12 +44,9 @@ function MyPage () {
- -
-
구매 내역
diff --git a/src/Components/Views/MyPage/UserInfo.tsx b/src/Components/Views/MyPage/UserInfo.tsx index 479720cc..7d34449f 100644 --- a/src/Components/Views/MyPage/UserInfo.tsx +++ b/src/Components/Views/MyPage/UserInfo.tsx @@ -1,8 +1,38 @@ // import { useState, useEffect } from 'react'; import { Link } from 'react-router-dom'; -import './userInfo.scss' +import { FormEvent, useState, useRef, ChangeEvent } from 'react'; +import './UserInfo.scss' + +function UserInfo () { + + const [email, setEmail] = useState(''); + const [password, setPassword] = useState(''); + const [name, setName] = useState(''); + const [Introduce, setIntroduce] = useState(''); + const [Image, setImage] = useState("https://cdn.pixabay.com/photo/2015/10/05/22/37/blank-profile-picture-973460_1280.png") + + + const fileInput = useRef(null) + + + const onChangeEmail = (e: ChangeEvent) => { + setEmail(e.target.value); + }; + + const onChangePW = (e: ChangeEvent) => { + setPassword(e.target.value); + }; + + const onChangeName = (e: ChangeEvent) => { + setName(e.target.value); + }; + + + const onChangeIntroduce = (e: ChangeEvent) => { + setIntroduce(e.target.value); + }; + -function userInfo () { return( <>
@@ -51,31 +81,68 @@ function userInfo () {
아이디
- + {/* */} +
비밀번호
- + {/* */} +
닉네임
- + {/* */} +
한줄 소개
- + {/* */} +
프로필 이미지
- + {/* */} +
@@ -119,4 +186,4 @@ function userInfo () { ) } -export default userInfo +export default UserInfo diff --git a/src/main.tsx b/src/main.tsx index 39808af3..b36887a3 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -2,8 +2,6 @@ import React from 'react' import ReactDOM from 'react-dom/client' import App from './App.tsx' import './index.scss' -import { Provider } from 'react-redux'; -import store from './store/' //import ReduxThunk from 'redux-thunk'; // import thunk from 'redux-thunk'; // import { createStore, applyMiddleware } from 'redux'; @@ -14,9 +12,9 @@ import store from './store/' //const store = createStore(reducer, applyMiddleware(thunk)); ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render( - - + <> + - + ) diff --git a/src/routes/routes.tsx b/src/routes/routes.tsx index 63546b65..d34b8637 100644 --- a/src/routes/routes.tsx +++ b/src/routes/routes.tsx @@ -1,12 +1,13 @@ -import Header from 'Common/Layout/Header/header' -import Footer from 'Common/Layout/Footer/footer' -import MainPage from 'Components/Views/MainPage/mainPage' -import Join from 'Common/Form/Signin/join' -import Login from 'Common/Form/Login/login' -import CartPage from 'Components/Views/CartPage/CartPage' -import MyPage from 'Components/Views/MyPage/MyPage' +import Header from '@/Common/Layout/Header/header' +import Footer from '@/Common/Layout/Footer/footer' +import MainPage from '@/Components/Views/MainPage/MainPage' +import Join from '@/Common/Form/Signin/join' +import Login from '@/Common/Form/Login/login' +import CartPage from '@/Components/Views/CartPage/CartPage' +import MyPage from '@/Components/Views/MyPage/MyPage' +import UserInfo from '@/Components/Views/MyPage/UserInfo' import PrivatePage from './privateRoute' -import DetailPage from 'Components/Views/DetailPage/DetailPage' +import DetailPage from '@/Components/Views/DetailPage/DetailPage' import { Routes, BrowserRouter, Route, Outlet } from 'react-router-dom' @@ -36,8 +37,9 @@ function RoutesPage() { } status={""}/>} /> - - + } status={""}/>} + /> {/* }/> */} diff --git a/teamwink.com-key.pem b/teamwink.com-key.pem new file mode 100644 index 00000000..189ec916 --- /dev/null +++ b/teamwink.com-key.pem @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCoV6pIpmLpmICO +AYS7q8dGj3RHEJwjVVUBAyzwEZkP5zT/4DCeUka/2N4S5vMXZKep4M9NGFRXK4vY +73plHPyviEwtIEZ7bpnr/fu0/H2bK7eA/auWXeCHYLlP5zfQF7PjJHfmkj5DXgpt +moqxlPMzvh0Qeu9Rr1c4thnKwcPGNeTbfShoqbcPjzYzdIQhLOQ045s+Jwm2w0de +KtZ/DYEf90bzMKcJ9Ix7oftu3oeUAc1a8Z9WjuL/XozaHgzxkniyHEDFsQe0YzKd +okpVaHHHaHe2NV1rfBY0yf+Ga/cd0HQaB9aVcgAq1eTn58x9WqHrXiTBGXBD4H5M ++CUNQl0/AgMBAAECggEANCYkHClfDtotSNBzm+eU7ejWroUYuWFf2dZv/1aUQfbv +1ixPI1x9ikTWVqiwuZh20AtSbKGSzwYwZl2ZXuVh6cahQoFzFB2pFRAy/1gQWRdr +20u58fTW71kpTvVjttUA5uaPNiArpZbmSBnNyUFJLchBHK/Yn0dgD7NpvgPUb/wV +alEqCL9J+n7+DT5t4G2rFGP8Ine6a3YLpAuwbwOL7QrDPtR8Pl+c0VZ7rmbzmOHm +fFZTdp4yCzc3s18gANj/woii3Qd17XdNcx40/Q171SXqL6lGY7Ky9/KVj2RqUzBy +VSW7gpK9WLB7l3OC4y1c6wapAKIZIO86nsyz/8xwoQKBgQDLfk3EbDb8MkasSJ+9 +ikIyLFZhKTxZDxCM+fKfXvolNExWmc82sWolhPlN7ecm6WZr+0jDVzHMwOR+6BWh +GaDdUeNYHBSYNb/H5JjeGcCasG8+P5r+aaHTatgGts9f2aX4EXDU/GKHuRVpKVhj +55ysnxU8EUIhrqZl+arQFZP9hwKBgQDTx3oI8irSJPgiD8via7JjHy9hMOL2OEYe +0CqKXW8lIxdAbNptTwjpb4SgbdeZ925SVwy0ZDgu0KGcoNESsaxywO7SjK46a/xg +7rUjj4dYwkP1Ev53J6rqg3aUpAINHttnNSa/UWjZKsmIlO9DLRq9B3EVLrR1AQJd +wONTWN7QiQKBgQDGtvo+O+ad9IKrLug+8UqfMEjR7LCvz1Q8NsDE/LyNpDp/vwdo +w2uCZA4IGa/GgdmwzNxLVVSePCdl/kFQ5nP+bD70Bcfes24qR4M4MDGzXWPkh7xV +gNW0XPvD4rUzRpkaW/2xHx0gqI7N+MAGH2ER+O+Fjtzjg2ee4WX6eXfg9QKBgCYo +/ntYL5EYKkHw+Lr+zvD/cIkhxvO45iGtPs0Z0uotLYZlVuJ1aFSvzIUf5caPiCh8 +GQT0Pg9pdoWDkMi+jSVMUHxN7yMFzD8nJCqZNTkwIBCr8IBF/I0vTRGxj9EPa1do +g2fb4nmnNRNQSuCe4v+GtMCtXsTqfqOoGw4sqFGJAoGAM59BHIDVoGGnhitboFsz +Y//ZLLfxQAZPA+gA6na6dGWnvTJaLQilkZ/Yeboj9cwVKYE0YTgjGIKoKmBH/5qt +HdvWBS4QahBkhIQ+twcoSOaqSl/zej9RUwRNngMCu+dPOUwb0+qPSsjIjrfQJv8r +0q1RZDYsmzJf6YotL/iUFww= +-----END PRIVATE KEY----- diff --git a/teamwink.com.pem b/teamwink.com.pem new file mode 100644 index 00000000..a92381f3 --- /dev/null +++ b/teamwink.com.pem @@ -0,0 +1,26 @@ +-----BEGIN CERTIFICATE----- +MIIEejCCAuKgAwIBAgIRAJmWdLiTNMkvb6vWxM6fxFUwDQYJKoZIhvcNAQELBQAw +gaUxHjAcBgNVBAoTFW1rY2VydCBkZXZlbG9wbWVudCBDQTE9MDsGA1UECww0REVT +S1RPUC1EMlQ1QU9UXGFuc2VvQERFU0tUT1AtRDJUNUFPVCAoZGFlaHl1biBtb29u +KTFEMEIGA1UEAww7bWtjZXJ0IERFU0tUT1AtRDJUNUFPVFxhbnNlb0BERVNLVE9Q +LUQyVDVBT1QgKGRhZWh5dW4gbW9vbikwHhcNMjMwNjA5MTUzNTQwWhcNMjUwOTA5 +MTUzNTQwWjBoMScwJQYDVQQKEx5ta2NlcnQgZGV2ZWxvcG1lbnQgY2VydGlmaWNh +dGUxPTA7BgNVBAsMNERFU0tUT1AtRDJUNUFPVFxhbnNlb0BERVNLVE9QLUQyVDVB +T1QgKGRhZWh5dW4gbW9vbikwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +AQCoV6pIpmLpmICOAYS7q8dGj3RHEJwjVVUBAyzwEZkP5zT/4DCeUka/2N4S5vMX +ZKep4M9NGFRXK4vY73plHPyviEwtIEZ7bpnr/fu0/H2bK7eA/auWXeCHYLlP5zfQ +F7PjJHfmkj5DXgptmoqxlPMzvh0Qeu9Rr1c4thnKwcPGNeTbfShoqbcPjzYzdIQh +LOQ045s+Jwm2w0deKtZ/DYEf90bzMKcJ9Ix7oftu3oeUAc1a8Z9WjuL/XozaHgzx +kniyHEDFsQe0YzKdokpVaHHHaHe2NV1rfBY0yf+Ga/cd0HQaB9aVcgAq1eTn58x9 +WqHrXiTBGXBD4H5M+CUNQl0/AgMBAAGjYTBfMA4GA1UdDwEB/wQEAwIFoDATBgNV +HSUEDDAKBggrBgEFBQcDATAfBgNVHSMEGDAWgBS5FPaDBfN6p6EdBNZjLTUXdvpE +XzAXBgNVHREEEDAOggx0ZWFtd2luay5jb20wDQYJKoZIhvcNAQELBQADggGBAFA+ +JW11amf6yWZqYHmNt4CMGYrmR1w7xL3nTy9fXLMtor133eQpvc0PKOjGevk2F3K+ +i/dwVRkA6KV+8RMaPBxCzZp42PGRH+/5o9hHHPuRQJY6s2C2KRN/VR5rBvakQxk8 +lLIv0NC5O6zriEatbepcuoj0kr7FOEMaoipkbR6EI/tvZYw1v1xx+Xpng1BesbbT +Gs6pfUMFSFDrqamQXD+Xj6UWK0xdxEOMv5h1ZogMN27N5ohlE9USV2ktbgtmsLO2 +Z5yi9+1Oi1MTQ2ZY6WomXPKwNTA5AmTmTu1/ju7UmVjGnMorfjchbdq56IDvuJem +L7irFWvzca0gxTFuZsgjRoFMycuFOEa+7T6+MqWTdKH5/eKk8a0+fuLflwj3HXeG +0tm3GdMbepuXu6/wlcNqfuMsX+I7i6/qZk1gOUl8+JUaO/O7bE0d3pB+34Qse52T +oA6AOsT1q/xo0FLhvY086DfnTWG/D68RjoBPSo3q8/KoRdp94MAdP8bVWIOSoA== +-----END CERTIFICATE----- diff --git a/tsconfig.json b/tsconfig.json index 5518d03d..4e0d67aa 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -7,7 +7,7 @@ "skipLibCheck": true, "baseUrl": "./", "paths": { - "@/": ["src/"] + "@/*": ["src/*"] }, /* Bundler mode */ From 00527523e2afa52886e937884425c7a2ac3e3c05 Mon Sep 17 00:00:00 2001 From: Seo Donguk Date: Wed, 14 Jun 2023 21:53:29 +0900 Subject: [PATCH 11/75] =?UTF-8?q?style:=20=EA=B0=80=EA=B2=A9=20=ED=95=A0?= =?UTF-8?q?=EC=9D=B8=EC=9C=A8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Views/MainPage/Component/BookInfo.tsx | 54 ++++++++++++++ .../Views/MainPage/Component/Genre.scss | 70 +++++++++++++++++++ .../Views/MainPage/Component/Genre.tsx | 23 +++--- src/Components/Views/MainPage/MainPage.scss | 37 +--------- 4 files changed, 137 insertions(+), 47 deletions(-) create mode 100644 src/Components/Views/MainPage/Component/BookInfo.tsx create mode 100644 src/Components/Views/MainPage/Component/Genre.scss diff --git a/src/Components/Views/MainPage/Component/BookInfo.tsx b/src/Components/Views/MainPage/Component/BookInfo.tsx new file mode 100644 index 00000000..6c28edc6 --- /dev/null +++ b/src/Components/Views/MainPage/Component/BookInfo.tsx @@ -0,0 +1,54 @@ +import { Link } from 'react-router-dom'; +import { useState } from 'react'; + +interface Props { + productNo: number; + productImg: string; + productName: string; + retailPrice: string; + price: string; + summary: string; +} + +export default function BookInfo({ + productNo, + productImg, + productName, + retailPrice, + price, + summary, +}: Props) { + const [hover, setHover] = useState(false); + + return ( + { + setHover(true); + }} + onMouseLeave={() => { + setHover(false); + }} + > + {hover &&
{summary}
} + {retailPrice !== price ? ( +
+ {+retailPrice / (+retailPrice - +price)}% +
+ ) : null} + + {productName} +

{productName}

+ {retailPrice === price ? ( +
{price.slice(0, -3)}원
+ ) : ( +
+
{retailPrice.slice(0, -3)}원
+
{price.slice(0, -3)}원
+
+ )} + + ); +} diff --git a/src/Components/Views/MainPage/Component/Genre.scss b/src/Components/Views/MainPage/Component/Genre.scss new file mode 100644 index 00000000..a35ddcdc --- /dev/null +++ b/src/Components/Views/MainPage/Component/Genre.scss @@ -0,0 +1,70 @@ +.books { + display: flex; + overflow: hidden; + &:not(:last-child) { + margin-bottom: 50px; + } +} +.left { + background-color: rgb(219, 218, 218); + border-top-left-radius: 10px; + border-bottom-left-radius: 10px; + + .tag-box { + padding: 30px 10px; + } +} +.right { + display: flex; + flex-wrap: wrap; + border-top: 1px solid rgb(219, 218, 218); + border-bottom: 1px solid rgb(219, 218, 218); + + .book { + position: relative; + width: calc(100% / 5); + padding: 0 10px; + margin: 30px 0; + + img { + border-radius: 10px; + width: 100%; + height: 230px; + } + } + + h4 { + margin: 10px 0; + } +} +.hover-description { + position: absolute; + padding: 5%; + width: calc(100% - 20px); + height: 230px; + border-radius: 10px; + overflow: hidden; + //background-color: rgb(255, 239, 228); + backdrop-filter: blur(5px); + -webkit-backdrop-filter: blur(5px); + top: 0; + z-index: 1; + color: #fff; + text-shadow: -1px -1px 0 #000, 1px -1px 0 #000, -1px 1px 0 #000, + 1px 1px 0 #000; +} +.discount { + position: absolute; + width: fit-content; + height: 40px; + line-height: 1.8; + text-align: center; + background-color: red; + color: #fff; + right: 10%; +} +.retail-price { + text-decoration: line-through; + color: rgb(122, 122, 122); + font-size: 0.6rem; +} diff --git a/src/Components/Views/MainPage/Component/Genre.tsx b/src/Components/Views/MainPage/Component/Genre.tsx index e9b08323..5dc1ec67 100644 --- a/src/Components/Views/MainPage/Component/Genre.tsx +++ b/src/Components/Views/MainPage/Component/Genre.tsx @@ -1,7 +1,8 @@ import axios from 'axios'; import { useEffect, useState } from 'react'; import { getList } from '@/Apis/productApi'; -import { Link } from 'react-router-dom'; +import './Genre.scss'; +import BookInfo from './BookInfo'; interface Props { type: string; @@ -32,19 +33,15 @@ export default function Genre({ category }: { category: Props }) {
{list && list.map((item) => ( - - {item.product_name} -
- {item.product_name},{item.product_no} -
-
{item.retail_price}
-
{item.price}
- {item.main ? item.main.map((v) =>
{v}
) : null} - + productNo={item.product_no} + productImg={item.list_image} + productName={item.product_name} + retailPrice={item.retail_price} + price={item.price} + summary={item.summary_description} + /> ))}
diff --git a/src/Components/Views/MainPage/MainPage.scss b/src/Components/Views/MainPage/MainPage.scss index cee92cc3..03f3213d 100644 --- a/src/Components/Views/MainPage/MainPage.scss +++ b/src/Components/Views/MainPage/MainPage.scss @@ -38,42 +38,11 @@ main { justify-content: center; height: 50px; width: 100px; + border-radius: 30px; + transition: background-color 0.3s; } .active { background-color: orange; - border-radius: 30px; - } -} - -.books { - display: flex; - overflow: hidden; - &:not(:last-child) { - margin-bottom: 50px; - } -} -.left { - background-color: rgb(219, 218, 218); - border-top-left-radius: 10px; - border-bottom-left-radius: 10px; - - .tag-box { - padding: 30px 10px; - } -} -.right { - display: flex; - flex-wrap: wrap; - border-top: 1px solid rgb(219, 218, 218); - border-bottom: 1px solid rgb(219, 218, 218); - - .book { - width: calc(100% / 5); - padding: 30px 10px; - img { - border-radius: 10px; - width: 100%; - //height: 200px; - } + //border-radius: 30px; } } From 09e60e273aa42afed315743aac3c1281df0abea6 Mon Sep 17 00:00:00 2001 From: moon daehyun Date: Thu, 15 Jun 2023 00:10:30 +0900 Subject: [PATCH 12/75] =?UTF-8?q?feat:=20=EC=9C=A0=EC=A0=80=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=ED=8E=98=EC=9D=B4=EC=A7=80=20=EA=B8=B0=EB=8A=A5?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Common/Form/Login/login.tsx | 2 + src/Components/Views/CartPage/CartPage.tsx | 3 +- src/Components/Views/MyPage/MyPage.tsx | 2 +- src/Components/Views/MyPage/UserInfo.scss | 5 +- src/Components/Views/MyPage/UserInfo.tsx | 222 ++++++++++++++++----- src/Components/Views/MyPage/test.jsx | 42 ++++ src/routes/routes.tsx | 8 +- 7 files changed, 232 insertions(+), 52 deletions(-) create mode 100644 src/Components/Views/MyPage/test.jsx diff --git a/src/Common/Form/Login/login.tsx b/src/Common/Form/Login/login.tsx index a604e73a..a8bcf1d1 100644 --- a/src/Common/Form/Login/login.tsx +++ b/src/Common/Form/Login/login.tsx @@ -11,6 +11,7 @@ function Login() { const [email, setEmail] = useState(''); const [password, setPassword] = useState(''); + const onChangeEmail = (e: ChangeEvent) => { setEmail(e.target.value); }; @@ -19,6 +20,7 @@ function Login() { setPassword(e.target.value); }; + interface DataToSubmit { email: string; // 사용자 아이디 (필수!) password: string; // 사용자 비밀번호 (필수!) diff --git a/src/Components/Views/CartPage/CartPage.tsx b/src/Components/Views/CartPage/CartPage.tsx index 915c301f..1c7d05cb 100644 --- a/src/Components/Views/CartPage/CartPage.tsx +++ b/src/Components/Views/CartPage/CartPage.tsx @@ -22,7 +22,7 @@ function CartPage() { const BuyProducts = () => { alert("주문완료!") } - + return ( <>
@@ -34,7 +34,6 @@ function CartPage() {
- {/*
*/} {/* 여기에서는 대여 부분 */} diff --git a/src/Components/Views/MyPage/MyPage.tsx b/src/Components/Views/MyPage/MyPage.tsx index 0fde3be1..f891ab3f 100644 --- a/src/Components/Views/MyPage/MyPage.tsx +++ b/src/Components/Views/MyPage/MyPage.tsx @@ -24,7 +24,7 @@ function MyPage () {
주문내역조회

- +
회원정보 수정

diff --git a/src/Components/Views/MyPage/UserInfo.scss b/src/Components/Views/MyPage/UserInfo.scss index 87ecabda..d341501d 100644 --- a/src/Components/Views/MyPage/UserInfo.scss +++ b/src/Components/Views/MyPage/UserInfo.scss @@ -1,6 +1,6 @@ .myPageContainer{ background-color: white; - width: 1600px; + width: 1200px; height: 900px; position: relative; left: 200px; @@ -153,10 +153,11 @@ border-radius: .5rem; margin-left: 10rem; padding: 15px; - width: 18rem; + width: 15rem; color:white; font-weight: 700; font-size: 18px; + cursor: pointer; } diff --git a/src/Components/Views/MyPage/UserInfo.tsx b/src/Components/Views/MyPage/UserInfo.tsx index 479720cc..f04fdd9c 100644 --- a/src/Components/Views/MyPage/UserInfo.tsx +++ b/src/Components/Views/MyPage/UserInfo.tsx @@ -1,8 +1,109 @@ -// import { useState, useEffect } from 'react'; -import { Link } from 'react-router-dom'; -import './userInfo.scss' +import { FormEvent, useState, useEffect, ChangeEvent, useCallback, useRef } from 'react'; +import axios from 'axios'; +import { Link, useNavigate } from 'react-router-dom'; +import './UserInfo.scss' +import { NONAME } from 'dns'; + +function UserInfo () { + + // 이름 , 프로필사진 , 구 비밀번호 , 새 비밀번호 + const [displayName, setDisplayName] = useState(''); + const [profileImgBase64, setProfileImgBase64] = useState(''); + const [oldPassword, setOldPassword] = useState(''); + const [newPassword, setNewPassword] = useState(''); + + //비밀번호 유효성 검사 + const [isName, setIsName] = useState(false); + const [isOldPassword, setIsOldPassword] = useState(false); + const [isNewPasswordConfirm, setIsNewPasswordConfirm] = useState(false); + + //오류 메세지 저장 + const [nameMessage, setNameMessage] = useState(''); + const [passwordMessage, setPasswordMessage] = useState(''); + const [passwordConfirmMessage, setPasswordConfirmMessage] = useState(''); + + + + async function submit(e) { + e.preventDefault(); + alert('수정완료'); + + try { + const res = await axios.put('https://asia-northeast3-heropy-api.cloudfunctions.net/api/auth/user', { + displayName: displayName, // 새로운 표시 이름 + profileImgBase64: profileImgBase64, // 사용자 프로필 이미지(base64) - jpg, jpeg, webp, png, gif, svg + oldPassword: oldPassword, // 기존 비밀번호 + newPassword: newPassword // 새로운 비밀번호 + }, { + headers: { + Authorization: `Bearer ${localStorage.getItem('token')}`, + 'Content-Type': 'application/json', + apikey: 'KDT5_nREmPe9B', + username: 'KDT5_TeamWink', + } + }) + }catch(err){ + console.log(err) + } + } + + const onChangeName = useCallback((e: React.ChangeEvent) => { + setDisplayName(e.target.value); + if (e.target.value.length < 2 || e.target.value.length > 21) { + setNameMessage('2글자 이상 21글자 미만으로 입력해주세요.'); + setIsName(false); + } else { + setNameMessage('올바른 이름 형식입니다 '); + setIsName(true); + } + }, []); + + const onChangePassword = useCallback( + (e: React.ChangeEvent) => { + const passwordCurrent = e.target.value; + setOldPassword(passwordCurrent); + + if (!PwCheck(passwordCurrent)) { + setPasswordMessage('8자리 이상 입력해주세요.'); + setIsOldPassword(false); + } else { + setPasswordMessage('안전한 비밀번호에요 '); + setIsOldPassword(true); + } + }, + [oldPassword] + ); + + const onChangePasswordConfirm = ( + password: any, + confirmPassword: any, + setPasswordConfirmMessage: any, + setIsPasswordConfirm: any + ) => { + if (password === confirmPassword) { + setPasswordConfirmMessage('비밀번호를 똑같이 입력했어요.'); + setIsPasswordConfirm(true); + } else { + setPasswordConfirmMessage('비밀번호가 틀립니다. 다시 입력해주세요.'); + setIsPasswordConfirm(false); + } + }; + + const onPasswordConfirmChange = useCallback( + (e: React.ChangeEvent) => { + const passwordConfirmCurrent = e.target.value; + setNewPassword(passwordConfirmCurrent); + onChangePasswordConfirm( + oldPassword, + passwordConfirmCurrent, + setPasswordConfirmMessage, + setIsNewPasswordConfirm + ); + }, + [oldPassword] + ); + -function userInfo () { return( <>
@@ -12,11 +113,13 @@ function userInfo () {
-

닉네임

-
-
-

프로필 자기소개란입니다.

+

닉네임{displayName}

+ {/*
+
+

자기소개

+
+
*/}
@@ -38,78 +141,107 @@ function userInfo () {
-
-
회원정보 수정
-
-
-
아이디
-
- -
-
+
-
비밀번호
+
기존 비밀번호
- +

+ {oldPassword.length > 0 && ( + + {passwordMessage} + + )}
-
닉네임
+
새 비밀번호
- +

+ {newPassword.length > 0 && ( + + {passwordConfirmMessage} + + )}
-
한줄 소개
+
닉네임 변경
- +

+ {displayName.length > 0 && ( + + {nameMessage} + + )}
프로필 이미지
- + {/* */} + {/* + // */} + {setProfileImgBase64(e.target.value)}} + />
- + {/* */} +
-
- -
-
- - {/*
-
-
대여 내역
-
-
-
-
-
-
-
-
*/} - - -
@@ -119,4 +251,4 @@ function userInfo () { ) } -export default userInfo +export default UserInfo diff --git a/src/Components/Views/MyPage/test.jsx b/src/Components/Views/MyPage/test.jsx new file mode 100644 index 00000000..d3b7d09c --- /dev/null +++ b/src/Components/Views/MyPage/test.jsx @@ -0,0 +1,42 @@ +import { useState } from "react"; +import axios from "axios"; + +export default function Test() { + const [name, setName] = useState(''); + const [pwd, setPwd] = useState(''); + + async function submit(e) { + e.preventDefault(); + + try { + const res = await axios.post('url', { + displayName: name, + newPassword: pwd + }, { + headers: { + Authorization: `Bearer ${accessToken}` + } + }) + }catch(err){ + console.log(err) + } + } + + return ( +
+ {setName(e.target.value)}} + /> + {setPwd(e.target.value)}}/> + + +
+ ) +} \ No newline at end of file diff --git a/src/routes/routes.tsx b/src/routes/routes.tsx index 71b91cde..bce7078d 100644 --- a/src/routes/routes.tsx +++ b/src/routes/routes.tsx @@ -1,12 +1,13 @@ import Header from '@/Common/Layout/Header/header'; import Footer from '@/Common/Layout/Footer/footer'; -import MainPage from '@/Components/Views/MainPage/mainPage'; +import MainPage from '@/Components/Views/MainPage/MainPage'; import Join from '@/Common/Form/Signin/join'; import Login from '@/Common/Form/Login/login'; import CartPage from '@/Components/Views/CartPage/CartPage'; import MyPage from '@/Components/Views/MyPage/MyPage'; import PrivatePage from './privateRoute'; import DetailPage from '@/Components/Views/DetailPage/DetailPage'; +import UserInfo from '@/Components/Views/MyPage/UserInfo'; import { Routes, BrowserRouter, Route, Outlet } from 'react-router-dom'; @@ -38,7 +39,10 @@ function RoutesPage() { path="/mypage" element={} status={''} />} /> - + } status={''} />} + /> {/* }/> */} From 05289cc3c77d7be79572b4e1ac8368b5ccb5fba0 Mon Sep 17 00:00:00 2001 From: hahahaday12 Date: Thu, 15 Jun 2023 00:10:56 +0900 Subject: [PATCH 13/75] =?UTF-8?q?feat:=20DetailPage=20=EA=B8=B0=EB=8A=A5?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 장바구니 버튼 클릭시 localstorage 저장 - 추가 스타일 수정 --- .../Views/DetailPage/DetailPage.scss | 218 ++++++++++++------ .../Views/DetailPage/DetailPage.tsx | 130 +++++++---- 2 files changed, 239 insertions(+), 109 deletions(-) diff --git a/src/Components/Views/DetailPage/DetailPage.scss b/src/Components/Views/DetailPage/DetailPage.scss index a1b2463e..b1e33d44 100644 --- a/src/Components/Views/DetailPage/DetailPage.scss +++ b/src/Components/Views/DetailPage/DetailPage.scss @@ -12,7 +12,17 @@ font-size: 20px; margin-left: 50px; } - + + @mixin ButtonStyle{ + width: 150px; + height: 50px; + position: absolute; + color: white; + border: none; + cursor: pointer; + } + + .DetailContainer { position: relative; width: 1400px; @@ -30,7 +40,6 @@ .LeftContainer { width: 600px; max-width: 500px; - //background-color: yellow; position: absolute; height: 650px; top: 60px; @@ -38,35 +47,42 @@ z-index: 100; .TitleBox{ - width: auto; - height: 60px; position: absolute; - margin: 0 auto; - left: 0; - right: 0; - //background-color: red; - - p{ + margin-top: 10px; + padding-bottom: 5px; + border-bottom: 2px solid black; + + span:nth-child(1){ font-size: 30px; } + + span:nth-child(2) { + font-size: 15px; + margin-left: 20px; + } + + .InnerTitleBox{ + width: 500px; + + p{ + margin-top: 10px; + font-size: 15px; + } + } } .BookimgBox{ - width: 450px; - height: 560px; + padding-bottom: 500px; border-radius: 10px; - background-color: rgb(253, 251, 251); border: 2px solid rgb(116, 45, 1); - position: absolute; - top: 80px; + position: relative; + top: 150px; margin: auto; left: 0; right: 0; img{ - width: 360px; - height: auto; - //position: absolute; - margin: auto; + position: absolute; + margin: 0 auto; left: 0; right: 0; } @@ -77,7 +93,6 @@ width: 500px; max-width: 500px; padding-bottom: 540px; - //background-color: yellow; position: absolute; top: 100px; right: 130px; @@ -93,118 +108,185 @@ .RightContainer-Content{ width: inherit; height: 400px; - //background-color: blue; position: absolute; - top: 100px; + top: 60px; .OriginPrice{ @include PriceContainer; margin-top: 20px; - //background-color: aliceblue; - //position: relative; .PriceText{ @include PriceText; - //background-color: yellow; } .PriceNumber{ @include PriceNumber; - //background-color: rgb(18, 220, 18); } } .ContentContainer{ width: 400px; height: 200px; - //background-color: blanchedalmond; margin-top: 10px; position: relative; .ContentBox{ width: 200px; height: 100px; - //background-color: olive; font-size: 20px; } .contentText{ width: 400px; height: 100px; - //background-color: orangered; position: absolute; top: 40px; left: 0; right: 0; } } - - + .CardPrice{ - width: 350px; + width: 450px; height: 30px; - //background-color: palevioletred; - margin-top: 10px; - - .CardText{ - font-size: 20px; - height: 30px; - //background-color: yellow; - } - - .PriceNumber{ - @include PriceNumber; - } + margin-top: 60px; + display: flex; + gap: 40px; + font-size: 18px; } .ButtonContainer{ width: 400px; height: 50px; - //background-color: orchid; position: relative; - margin: 0 auto; margin-top: 20px; .CartAdd{ - width: 150px; - height: 50px; - background-color: palegreen; - position: absolute; - margin: auto; + @include ButtonStyle; + background-color: #df307f; } .BookBill{ - width: 150px; - height: 50px; - background-color: rgb(228, 207, 13); - position: absolute; + @include ButtonStyle; + background-color: #e24457; right: 20px; } } } } + + .BookContent { + width: 1150px; + margin: auto; + border: 1px solid black; + margin-top: 50px !important; + } + + .BookContent-text{ + width: 140px; + position: absolute; + padding-bottom: 10px; + background-color: rgb(253, 248, 248); + border-radius: 10px; + padding: 10px; + font-size: 23px; + font-weight: bold; + margin-top: 20px; + margin-left: 50px; + } + + .TopBox { + width: 100%; + top: 0; + background-color: white; + right: 0; + font-size: 20px; + z-index: 1; + position: fixed; + border-bottom: 2px solid gray; + transition: transform 0.3s ease-in-out; + transform: translateY(-50px); + } + + .TopBox.slide-down { + transform: translateY(-1px); /* Apply the slide-down transform value */ + } + + .TopContentBox{ + width: 130px; + margin: 0 auto; + background-color: darkcyan; + } - .InnerContent{ - width: 900px; - background-color: red; - height: auto; - display: block; + .InnerContent { + padding-bottom: 20px; + width: 800px; margin: 0 auto; - font-family: 'SUITE-Regular'; + font-size: 20px !important; - img{ - width: 900px; - //position: absolute; - display: flex; + img { + width: 800px; margin: 0 auto; } - p{ + a { font-family: 'SUITE-Regular' !important; - background-color: antiquewhite; + background-color: #f8ede3 !important; + border-radius: 10px; + width: 800px; + margin: 0 auto !important; + padding: 20px !important; + font-size: 20px !important; + } + + p { + background-color: #f8ede3 !important; + border-radius: 10px; + width: 800px; + margin: 0 auto !important; + padding: 20px !important; + font-size: 20px !important; + } + + span { + font-size: 18px !important; + } + } + + .Bookple-Container{ + width: 800px; + padding-bottom: 10px; + //background-color: aliceblue; + margin: auto; + position: relative; + border-bottom: 1px solid black; + border-top: 1px solid black; + + .Bookple-Container__text{ + width: 180px; + background-color: rgb(248, 244, 244); + position: absolute; + color: #0086cd; + left: -250px; + margin-top: 20px; + font-size: 20px; + padding: 10px; + font-size: 23px; + //font-weight: bold; + border-radius: 10px; + } + + .Bookple-Container__coment{ + width: 500px; + display: flex; + gap: 30px; + font-size: 20px; + font-weight: bold; + position: relative; + margin-top: 40px; + margin-left: 20px; } - } } \ No newline at end of file diff --git a/src/Components/Views/DetailPage/DetailPage.tsx b/src/Components/Views/DetailPage/DetailPage.tsx index 4b129dcd..d9d810d3 100644 --- a/src/Components/Views/DetailPage/DetailPage.tsx +++ b/src/Components/Views/DetailPage/DetailPage.tsx @@ -1,8 +1,9 @@ import BookCustom from '../../../bookcustom/bookcustom'; -import { useEffect, useState } from 'react'; -import './DetailPage.scss' -import { useParams } from 'react-router-dom'; +import { useEffect, useState, useRef } from 'react'; +import { useParams, useNavigate } from 'react-router-dom'; +import TopHeader from './components/TopHeader'; import { getDetail } from '@/Apis/productApi'; +import './DetailPage.scss' function DetailPage(){ @@ -18,9 +19,9 @@ function DetailPage(){ selling: string, description:string } - const [detail, setDetail] = useState({} as DetailInfo); - const [book, setBook] = useState([]); + const navigate = useNavigate(); + const [detail, setDetail] = useState({} as DetailInfo); const { productNo } = useParams(); async function getDetails() { @@ -32,35 +33,61 @@ function DetailPage(){ } } + const [isScrolled, setIsScrolled] = useState(false); + const [ScrollY, setScrollY] = useState(0); + + function handleScroll() { + if (ScrollY > 800) { + setScrollY(window.pageYOffset); + setIsScrolled(true); + } else { + setScrollY(window.pageYOffset); + setIsScrolled(false); + } + } + + useEffect(() => { + function scrollListener() { + window.addEventListener("scroll", handleScroll); + } // window 에서 스크롤을 감시 시작 + scrollListener(); // window 에서 스크롤을 감시 + return () => { + window.removeEventListener("scroll", handleScroll); + }; // window 에서 스크롤을 감시를 종료 + }); + + useEffect(() => { (async () => { await getDetails(); })(); }, []); - const BuyBook = (detailnum) => { + const BuyBook = (detail:any) => { let Cart = localStorage.getItem('cart'); + if(Cart === null) { + Cart = []; + } else { + Cart = JSON.parse(Cart); + } - // if(Cart === null) { - // Cart = []; + const datalist = { + "buy": [] + ,"rent": [] + }; + + // if (Cart.some((item) => item.id === detail.id)) { + // alert('이미 장바구니에 담으셨습니다.'); // } else { - // Cart = JSON.parse(Cart); + Cart.push(detail); + Cart = new Set(Cart); + Cart = [...Cart]; + localStorage.setItem('cart', JSON.stringify(Cart)); + datalist.buy = Cart; + console.log(datalist); + alert('장바구니에 담겼습니다.'); + navigate('/cart'); // } - - // let datalist = { - // "buy": [] - // ,"rent": [] - // }1 - - - // datalist.buy[1]= productid; - - // buy - [1,2,4,56] - // rent - [1,3,6,7] - // let c = localStorage.getIte(cart); - // c.buy - // Cart.push() - // console.log(detail); } const disableLinkClick = (event) => { @@ -73,6 +100,20 @@ function DetailPage(){ match.replace('href', 'data-disabled-href') ) : ''; + + const renderCardPriceItems = () => { + const cardPriceItems = { + '카드/간편결제할인': '', + '무이자 할부': '', + '소득공제300원': '', + }; + + return Object.entries(cardPriceItems).map(([key]) => ( + {`${key}`} + )); + } + + return( <> @@ -84,8 +125,13 @@ function DetailPage(){
- {detail.product_name} + {detail.product_name} + -단돈 1,000원으로 시작할수 있는 +
+

윙크북 {detail.product_name} 전자책 출간일 2023-0505

+
+
@@ -104,37 +150,39 @@ function DetailPage(){
줄거리 -

+

{detail.summary_description}

- 카드 - 무이자 할부 - 소득공제300원 + {renderCardPriceItems()}
- + -
+ +
+ 출판사 제공
책소개
+
+ {isScrolled ? : ""} +
+
+
+ 북플 BOOKPLE +
    +
  • 이책의 마니아가 남긴글
  • +
  • 친구가 남긴글
  • +
  • 내가 남긴글
  • +
+
- {/*
- -
*/} - {/*
-
*/} - - {/*
- -
*/} ); } From a3b9634c512fcdefa9ad5a14be3e5681ef641294 Mon Sep 17 00:00:00 2001 From: hahahaday12 Date: Thu, 15 Jun 2023 00:12:21 +0900 Subject: [PATCH 14/75] =?UTF-8?q?feat:=20CartItem=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - localstorge에 있는 item 데이터 가져오기. --- .../Views/CartPage/CartItems/CartItems.scss | 80 +++------ .../Views/CartPage/CartItems/CartItems.tsx | 157 +++++++++--------- 2 files changed, 100 insertions(+), 137 deletions(-) diff --git a/src/Components/Views/CartPage/CartItems/CartItems.scss b/src/Components/Views/CartPage/CartItems/CartItems.scss index 2395c890..67c92e13 100644 --- a/src/Components/Views/CartPage/CartItems/CartItems.scss +++ b/src/Components/Views/CartPage/CartItems/CartItems.scss @@ -28,12 +28,12 @@ .ProductNameBox { @include CartNameStyle; width: 60px; - left: 300px; + left: 400px; } .PriceNameBox{ @include CartNameStyle; - right: 450px; + right: 400px; } .NumberBox{ @@ -43,7 +43,7 @@ .DeleteNameBox{ @include CartNameStyle; - right: 100px; + right: 120px; } @@ -56,8 +56,8 @@ overflow-y: auto; /* 세로 스크롤 생성 */ .ItemContainer { - width: 1180px; - height: 90px; + width: 1182px; + padding-bottom: 5px; position: relative; margin-top: 20px; border-bottom: 2px solid rgb(208, 203, 185); @@ -66,34 +66,34 @@ width: 60px; height: 40px; position: absolute; - top: 12px; + top: 40px; left: 30px; } .ImageBox{ width: 100px; - height: 100px; - margin-left: 150px; + //height: 100px; + position: relative; + bottom: 10px; + margin-left: 120px; + background-color: rebeccapurple; img{ - position: absolute; + //position: absolute; width: inherit; - height: 80px; + background-color: orange; + height: auto; } } .TextInner { - width: 400px; - height: 100px; + width: 450px; + padding-bottom: 30px; position: absolute; - top: 1px; + top: 50px; left: 260px; - font-size: 20px; - + span:nth-child(1) { - width: 400px; - height: 20px; - position: absolute; font-size: 20px; } @@ -107,49 +107,21 @@ } .PriceInner{ - width: 150px; - height: 90px; + width: auto; + padding-bottom: 10px; + top: 50px; position: absolute; - top: -10px; - right: 350px; - //background-color: olivedrab; - display: table-column; + right: 370px; + background-color: olivedrab; font-size: 15px; - - span:nth-child(1){ - width: 100px; - height: 20px; - position: absolute; - } - - span:nth-child(2){ - height: 30px; - position: absolute; - margin-top: 30px; - } - - span:nth-child(3){ - height: 30px; - position: absolute; - margin-top: 60px; - } - } - - .ChooseNumber{ - width: 90px; - height: 50px; - //background-color: brown; - position: absolute; - right: 220px; - top: 15px; + } .CartButtonBox{ width: 60px; - height: 60px; position: absolute; - top: 15px; + top: 30px; right: 100px; //background-color: burlywood; @@ -157,7 +129,7 @@ display: block; width: 50px; height: 30px; - margin-top: 5px; + margin-top: 10px; } } } diff --git a/src/Components/Views/CartPage/CartItems/CartItems.tsx b/src/Components/Views/CartPage/CartItems/CartItems.tsx index 473ce715..2f760111 100644 --- a/src/Components/Views/CartPage/CartItems/CartItems.tsx +++ b/src/Components/Views/CartPage/CartItems/CartItems.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import React, { useEffect } from 'react'; import { useState } from 'react'; import Box from '@mui/material/Box'; import Checkbox from '@mui/material/Checkbox'; @@ -6,99 +6,76 @@ import FormControlLabel from '@mui/material/FormControlLabel'; import YearBox from 'Common/section/number'; import './CartItems.scss'; -function CartItems() { - interface Item { - id: number; - // image:string; - name: string; - text: string; - price: string; - sale: string; - malize: string; - } +interface BuyItem { + id: number; + product_name: string; + price: number; + detail_image: string; +} + +interface CartItemsProps { + check: number[]; + pitem: any; + setItems:any; + +} +const CartItems = ({ check, pitem, setItems }: CartItemsProps) => { const [info, setInfo] = useState([]); - const [checked, setChecked] = useState([true, false]); - const [items, setItems] = useState([ - { - id: 1, - name: '[국내도서]시작하세요! C# 10프로그래밍', - text: '*밤 11시 잠들기전 배송', - price: '정가: 36000', - sale: '판매가:32,400', - malize: '마일리지: 1,800원', - }, - { - id: 2, - name: '도서명2', - text: '*밤 11시 잠들기전 배송', - price: '정가: 36000', - sale: '판매가:32,400', - malize: '마일리지: 1,800원', - }, - { - id: 3, - name: '도서명3', - text: '*밤 11시 잠들기전 배송', - price: '정가: 36000', - sale: '판매가:32,400', - malize: '마일리지: 1,800원', - }, - { - id: 4, - name: '도서명3', - text: '*밤 11시 잠들기전 배송', - price: '정가: 36000', - sale: '판매가:32,400', - malize: '마일리지: 1,800원', - }, - { - id: 5, - name: '도서명3', - text: '*밤 11시 잠들기전 배송', - price: '정가: 36000', - sale: '판매가:32,400', - malize: '마일리지: 1,800원', - }, - ]); - const [checkedItems, setCheckedItems] = useState([]); + const [buyItem, setbuyItem] = useState([]); + const [checkedItems, setCheckedItems] = useState(check); + + + useEffect(() => { + BuyCart(); + }, []); + + const BuyCart = () => { + const BuyItems = JSON.parse(localStorage.getItem("cart")) || []; + setbuyItem(BuyItems); + console.log(BuyItems) + } const handleChange1 = (event: React.ChangeEvent) => { const checkedValue = event.target.checked; const updatedCheckedItems = checkedValue - ? items.map((item) => item.id) + ? buyItem.map((item) => item.id) : []; - setCheckedItems(updatedCheckedItems); + setCheckedItems(updatedCheckedItems); }; - const handleChange2 = (event: React.ChangeEvent) => { + const handleChange2 = (el: any) => (event: React.ChangeEvent) => { + console.log(el); const itemId = parseInt(event.target.name); let updatedCheckedItems: number[] = []; - + let updatedItems: any[] = []; if (event.target.checked) { updatedCheckedItems = [...checkedItems, itemId]; + updatedItems = [...pitem , el]; } else { updatedCheckedItems = checkedItems.filter((id) => id !== itemId); - } + updatedItems = pitem.filter((key) => key.product_no !== el.product_no); + } + setItems(updatedItems); setCheckedItems(updatedCheckedItems); + setCheck(updatedCheckedItems); }; - const children = (itemId: number) => ( + const children = (el:any ,index:number) => ( + }}> } /> @@ -113,6 +90,26 @@ function CartItems() { }); }; + const RemoveBuyItem = (index: number, key:any) => { + console.log(key); + const confirmation = window.confirm('삭제하시겠습니까?'); + if (confirmation) { + + const updatedCartData = JSON.parse(localStorage.getItem('cart')); + localStorage.setItem('cart', JSON.stringify(updatedCartData.filter((item) => item.product_no !== key))); + + const updatedBuyItem = [...buyItem]; + //선택한 index 1개를 buyItem 배열에서 제거. + updatedBuyItem.splice(index, 1); + // 제거한후의 값 setState 갑에 담아줌. + setbuyItem(updatedBuyItem); + // cart 키 값으로 로컬에서 데이터 찾아옴 + alert('삭제되었습니다.'); + } else { + alert('취소되었습니다.'); + } + }; + return ( <>
@@ -122,9 +119,9 @@ function CartItems() {
0 && checkedItems.length < items.length + checkedItems.length > 0 && checkedItems.length < buyItem.length } onChange={handleChange1} /> @@ -132,10 +129,6 @@ function CartItems() { } /> - {/*
- 구매 -
*/} -
상품명
@@ -150,25 +143,23 @@ function CartItems() {
- {items.map((item) => ( -
-
{children(item.id)}
-
- cartbookimage + {buyItem.map((el, index) => ( +
+ {/* 아이템 체크 하는 부분 */} +
{children(el, index)}
+
+ cartbookimage
- {item.name} - {item.text} + {el.product_name}
- {item.price} - {item.sale} - {item.malize} + {Number(el.price).toFixed(0)}원
- +
))} From 687f1bfcb1ca141ea385fc5dac46dd9c59cef6bd Mon Sep 17 00:00:00 2001 From: hahahaday12 Date: Thu, 15 Jun 2023 00:13:10 +0900 Subject: [PATCH 15/75] =?UTF-8?q?feat:=20CartPage=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 체크 표시 클릭시 , total 가격 표시 --- src/Components/Views/CartPage/CartPage.tsx | 74 +++++++++++++--------- 1 file changed, 44 insertions(+), 30 deletions(-) diff --git a/src/Components/Views/CartPage/CartPage.tsx b/src/Components/Views/CartPage/CartPage.tsx index 915c301f..3b312cd6 100644 --- a/src/Components/Views/CartPage/CartPage.tsx +++ b/src/Components/Views/CartPage/CartPage.tsx @@ -1,49 +1,68 @@ import './CartPage.scss' -import { FormEvent, useState } from 'react'; +import { useState, useEffect } from 'react'; import CartItems from './CartItems/CartItems'; -import { Value } from 'sass'; import RentalItems from './CartRent/CartRent'; function CartPage() { - // const [rentalbook, setRentalBook] = useState([ - // { id: 1, name: '[국내도서]시작하세요! C# 10프로그래밍', text:"*밤 11시 잠들기전 배송", - // price:"정가: 36000", sale:"판매가:32,400", malize:"마일리지: 1,800원"}, - // ]) + const BuyProducts = () => { + alert("주문완료!") + } - const Text = { - '1':'상품명', - '2':'가격', - '3':'수량', - '4':'대여날자', - } as const; + const [CartItemsValue, setCartItemsValue] = useState([]); + const [selectedItem, setSelectedItem] = useState([]); + const [Total, setTotal] = useState(0) + const [ShowTotal, setShowTotal] = useState(false) + + const [RentalItemsValue, setRentalItemsValue] = useState([]); - const BuyProducts = () => { - alert("주문완료!") + useEffect(() => { + console.log(CartItemsValue+"k"); + console.log(selectedItem) + }, [CartItemsValue]); + + useEffect(() => { + calculateTotal(); + }, [selectedItem]); + + const calculateTotal = () => { + console.log('ccccccc' + Array.isArray(selectedItem)) + let total = 0; + if (Array.isArray(selectedItem)) { + selectedItem.forEach((item) => { + console.log(item); + const itemPrice = parseFloat(item.price); + console.log(itemPrice) + if (!isNaN(itemPrice)) { + console.log(itemPrice) + total += itemPrice; + } + }); } - + setTotal(total); + console.log(total + "토"); + setShowTotal(true); + }; + + return ( <>
- - {/*
*/} - 구매
- +
- - - {/*
*/} - {/* 여기에서는 대여 부분 */} 대여
- 결제
@@ -51,12 +70,7 @@ function CartPage() {
총 상품 가격 - 28,000 -
- -
- 총 주문 상품수 - 1종 1권(개) + {ShowTotal &&

Total Amount: ${Total}

}
From d49dca84680d0d02799b644ca48ed1c3421db7a5 Mon Sep 17 00:00:00 2001 From: saeyeon Date: Thu, 15 Jun 2023 00:38:22 +0900 Subject: [PATCH 16/75] feat:cartpage add payment --- src/Components/Views/CartPage/CartPage.scss | 57 +++++---- src/Components/Views/CartPage/CartPage.tsx | 115 +++++++++--------- .../Views/CartPage/Payment/Payment.tsx | 49 ++++++++ 3 files changed, 132 insertions(+), 89 deletions(-) create mode 100644 src/Components/Views/CartPage/Payment/Payment.tsx diff --git a/src/Components/Views/CartPage/CartPage.scss b/src/Components/Views/CartPage/CartPage.scss index 792ee031..064d08b4 100644 --- a/src/Components/Views/CartPage/CartPage.scss +++ b/src/Components/Views/CartPage/CartPage.scss @@ -6,28 +6,27 @@ } @mixin TableStyle { - } // 장바구니 전체 레이아웃 .CartPage-AllLayout { //font-family: 'SUITE-Regular'; width: 1200px; - padding-bottom: 1400px; + padding-bottom: 1400px; position: relative; - margin: 0 auto; + margin: 0 auto; font-weight: 600; //background-color: aquamarine; - .ProductText{ + .ProductText { @include CartNameStyle; - top:10px; + top: 10px; left: 45px; position: absolute; //background-color: red; } - .CartContainer{ + .CartContainer { position: absolute; display: flex; justify-content: center; @@ -38,11 +37,11 @@ background-color: rgb(249, 249, 249); } - //장바구니 나타나는 부분 + //장바구니 나타나는 부분 .CartPageTable { - position: relative; + position: relative; width: 1200px; - //padding-bottom: 520px; + //padding-bottom: 520px; //background-color: #7fe41f; margin: 0 auto; left: 0; @@ -50,7 +49,7 @@ top: 50px; } - .RentText{ + .RentText { //background-color: olive; position: absolute; font-size: 20px; @@ -78,15 +77,15 @@ left: 45px; } - .BuyContainer{ + .BuyContainer { position: absolute; //justify-content: center; width: inherit; padding-bottom: 200px; - bottom:10px; - background-color: #EDDBC7; - - .NowBuy{ + bottom: 10px; + background-color: #eddbc7; + + .NowBuy { width: 500px; position: absolute; height: 100px; @@ -96,7 +95,7 @@ //background-color: wheat; border-bottom: 2px solid black; //bottom: 100px; - + .Buy-Container { width: 250px; position: absolute; @@ -106,17 +105,17 @@ left: 0; right: 0; top: 30px; - + .Pay-Container { width: inherit; height: 30px; //background-color: rosybrown; display: flex; gap: 40px; - } + } } } - + .AllCount-Container { width: 500px; position: absolute; @@ -125,17 +124,17 @@ top: 120px; left: 100px; - .AllCount-Container__box{ + .AllCount-Container__box { width: 300px; height: 50px; //background-color: darkblue; display: flex; gap: 50px; - margin: 0 auto; + margin: 0 auto; } - } + } - .Buy-ButtonBox{ + .Buy-ButtonBox { width: 300px; height: 55px; //background-color: firebrick; @@ -143,19 +142,19 @@ right: 100px; top: 50px; - button{ + button { width: inherit; height: inherit; border-radius: 5px; color: white; font-weight: bold; - background-color: #F99417; + background-color: #f99417; border: none; + cursor: pointer; + &:hover { + background-color: #ffa12e; + } } } } - - } - - diff --git a/src/Components/Views/CartPage/CartPage.tsx b/src/Components/Views/CartPage/CartPage.tsx index 915c301f..91ceb3a6 100644 --- a/src/Components/Views/CartPage/CartPage.tsx +++ b/src/Components/Views/CartPage/CartPage.tsx @@ -1,80 +1,75 @@ -import './CartPage.scss' -import { FormEvent, useState } from 'react'; -import CartItems from './CartItems/CartItems'; -import { Value } from 'sass'; -import RentalItems from './CartRent/CartRent'; - +import "./CartPage.scss"; +import { FormEvent, useState } from "react"; +import CartItems from "./CartItems/CartItems"; +import { Value } from "sass"; +import RentalItems from "./CartRent/CartRent"; +import Payment from "./Payment/Payment"; function CartPage() { + // const [rentalbook, setRentalBook] = useState([ + // { id: 1, name: '[국내도서]시작하세요! C# 10프로그래밍', text:"*밤 11시 잠들기전 배송", + // price:"정가: 36000", sale:"판매가:32,400", malize:"마일리지: 1,800원"}, + // ]) - // const [rentalbook, setRentalBook] = useState([ - // { id: 1, name: '[국내도서]시작하세요! C# 10프로그래밍', text:"*밤 11시 잠들기전 배송", - // price:"정가: 36000", sale:"판매가:32,400", malize:"마일리지: 1,800원"}, - // ]) + const Text = { + "1": "상품명", + "2": "가격", + "3": "수량", + "4": "대여날자", + } as const; - const Text = { - '1':'상품명', - '2':'가격', - '3':'수량', - '4':'대여날자', - } as const; + // const BuyProducts = () => { + // alert("주문완료!"); + // }; - const BuyProducts = () => { - alert("주문완료!") - } - return ( - <> -
+ <> +
+ {/*
*/} - {/*
*/} + 구매 +
+ +
- 구매 -
- -
- - - {/*
*/} + {/*
*/} - {/* 여기에서는 대여 부분 */} - 대여 -
- -
+ {/* 여기에서는 대여 부분 */} + 대여 +
+ +
- - 결제 -
- -
-
-
- 총 상품 가격 - 28,000 -
+ 결제 +
+
+
+
+ 총 상품 가격 + 28,000 +
-
- 총 주문 상품수 - 1종 1권(개) +
+ 총 주문 상품수 + 1종 1권(개) +
-
-
-
- 총 결제 예상 금액 - 28,000 원 +
+
+ 총 결제 예상 금액 + 28,000 원 +
-
-
- +
+ {/* */} + +
-
-
- + ); } -export default CartPage; \ No newline at end of file +export default CartPage; diff --git a/src/Components/Views/CartPage/Payment/Payment.tsx b/src/Components/Views/CartPage/Payment/Payment.tsx new file mode 100644 index 00000000..05f68bfc --- /dev/null +++ b/src/Components/Views/CartPage/Payment/Payment.tsx @@ -0,0 +1,49 @@ +import React, { useEffect } from "react"; + +const Payment = () => { + useEffect(() => { + const jquery = document.createElement("script"); + jquery.src = "https://code.jquery.com/jquery-1.12.4.min.js"; + const iamport = document.createElement("script"); + iamport.src = "https://cdn.iamport.kr/js/iamport.payment-1.1.7.js"; + document.head.appendChild(jquery); + document.head.appendChild(iamport); + return () => { + document.head.removeChild(jquery); + document.head.removeChild(iamport); + }; + }, []); + const onClickPayment = () => { + const { IMP }: any = window; + IMP.init("imp36252452"); + const data = { + pg: "html5_inicis", // PG사 html5_inicis: KG이니시스, kakaopay: 카카오페이, naverpay: 네이버페이, payco: 페이코 + pay_method: "card", // 결제수단 + merchant_uid: `mid_${new Date().getTime()}`, // 주문번호 + amount: 100, // 결제금액 + name: "아임포트 결제 데이터 분석", // 주문명 + buyer_name: "김세연", // 구매자 이름 + // buyer_tel: "01032752740", // 구매자 전화번호 + // 전화번호: 일단 빼고 나중에 추가 시도.. + buyer_email: "", // 구매자 이메일 - 작성시 구매창에서 이메일 부분에 들어가있음 + }; + IMP.request_pay(data, callback); + }; + + function callback(response: any) { + const { success, error_msg } = response; + + if (success) { + alert("결제 성공"); + } else { + alert(`결제 실패: ${error_msg}`); + } + } + return ( + <> + + + ); +}; + +export default Payment; From 70c6ad062324e2a244884843973d7155e22367a2 Mon Sep 17 00:00:00 2001 From: hahahaday12 Date: Thu, 15 Jun 2023 01:19:31 +0900 Subject: [PATCH 17/75] =?UTF-8?q?feat:=20=EB=B3=80=EA=B2=BD=EC=82=AC?= =?UTF-8?q?=ED=95=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/images/bookpick.png | Bin 0 -> 1383 bytes src/Components/Views/CartPage/CartPage.tsx | 4 +-- .../DetailPage/components/BookEvent.scss | 0 .../Views/DetailPage/components/BookEvent.tsx | 7 ++++ .../DetailPage/components/TopHeader.scss | 32 ++++++++++++++++++ .../Views/DetailPage/components/TopHeader.tsx | 23 +++++++++++++ 6 files changed, 64 insertions(+), 2 deletions(-) create mode 100644 public/images/bookpick.png create mode 100644 src/Components/Views/DetailPage/components/BookEvent.scss create mode 100644 src/Components/Views/DetailPage/components/BookEvent.tsx create mode 100644 src/Components/Views/DetailPage/components/TopHeader.scss create mode 100644 src/Components/Views/DetailPage/components/TopHeader.tsx diff --git a/public/images/bookpick.png b/public/images/bookpick.png new file mode 100644 index 0000000000000000000000000000000000000000..8b8c7abdbb5c90f83825eeff36fc370634f92254 GIT binary patch literal 1383 zcmeAS@N?(olHy`uVBq!ia0vp^B|vNn{1`ISV`@iy0WiR6&^0Gf3qFP|Y7t7srr_xVJa#J7hv-4t$(>bM9PgeM3$+ zO9M_u){D0ed4;%0^9pX>t`MQsp%5meGbQ-UT{fMjwKv>13TzE@X_~4K#TC_|qNyZ! zWyYPm@9x>$kC97C?3!`<-_LvBFW=cGfBN8??`Pkgc_QiaW5MlRCN?|P=RDuNy7$fX zhxcC1tC{fr)S+iHi|Rwo-b=>ak+>FVaW7Kip8TJUmG!G**KIxg;tH}Ikv!nt<_MY$1!nKXo!Twn-vS5{>$2TIrgmcw7s+4EUc9>=C&*Qp7`_d z>DRQ_((w4M!qWnqyrc6O9NBplYp%A;vA*_SrT3rUxyZ=`j=cZow|2&d`>NI`v+gCvnDYYY_$8r?$%8;k6rKF^Z&rr`_}`OU-V&Oz|Ru+m21QkC}U>Zzf;V z^@qLBn&T^eJ=tk;E9_(a{q2Tl#9#klp6wQ#AJ#lC*Xi8XU-`?v`fmO`b1HYS_g|&+ zhodu1uBK^a*!VhG=gamP@-Mx3W6JSg>&<6t#F@%4E z8I`VY!X9O_`%n6;1xJ0WEB2my@8R9|>q~a|vDd$!E&SeR`s2e@@yp(xmvl~V+Rv!; Xh$~XAFoYdgI5K#;`njxgN@xNAShiiD literal 0 HcmV?d00001 diff --git a/src/Components/Views/CartPage/CartPage.tsx b/src/Components/Views/CartPage/CartPage.tsx index 3b312cd6..bef6d4a8 100644 --- a/src/Components/Views/CartPage/CartPage.tsx +++ b/src/Components/Views/CartPage/CartPage.tsx @@ -47,7 +47,7 @@ function CartPage() { return ( - <> +
구매
@@ -88,7 +88,7 @@ function CartPage() {
- + ); } export default CartPage; \ No newline at end of file diff --git a/src/Components/Views/DetailPage/components/BookEvent.scss b/src/Components/Views/DetailPage/components/BookEvent.scss new file mode 100644 index 00000000..e69de29b diff --git a/src/Components/Views/DetailPage/components/BookEvent.tsx b/src/Components/Views/DetailPage/components/BookEvent.tsx new file mode 100644 index 00000000..4321fa74 --- /dev/null +++ b/src/Components/Views/DetailPage/components/BookEvent.tsx @@ -0,0 +1,7 @@ +function BookEvent() { + return( + <> + + ) +} +export default BookEvent \ No newline at end of file diff --git a/src/Components/Views/DetailPage/components/TopHeader.scss b/src/Components/Views/DetailPage/components/TopHeader.scss new file mode 100644 index 00000000..b947a19e --- /dev/null +++ b/src/Components/Views/DetailPage/components/TopHeader.scss @@ -0,0 +1,32 @@ +.TopHeader-container{ + + + .TopHeader-container__text{ + width:700px; + padding-bottom: 5px; + left: 200px; + margin-top: 10px; + position: relative; + list-style: none; + letter-spacing: 0.03em; + + li:nth-child(1) { + padding-bottom: 0px; + letter-spacing: 0.03em; + line-height: 1.5; + width: auto; + font-weight: bold; + } + + li:nth-child(2) { + width: 700px; + margin-top: 8px; + left: 100px; + + span{ + font-weight: bold; + color: #eb217c; + } + } + } +} \ No newline at end of file diff --git a/src/Components/Views/DetailPage/components/TopHeader.tsx b/src/Components/Views/DetailPage/components/TopHeader.tsx new file mode 100644 index 00000000..636eee5b --- /dev/null +++ b/src/Components/Views/DetailPage/components/TopHeader.tsx @@ -0,0 +1,23 @@ +import React from 'react'; +import './TopHeader.scss' + +type TopHeaderProps = { + productName: string; + productPrice: number; +} + +const TopHeader: React.FC = ({ productName , productPrice}) => { + return ( +
+
    +
  • [eBook] { productName }
  • +
  • + {productPrice}원 (종이책 정가 대비 30%할인) 쿠폰할인가 + 13,230원 +
  • +
+
+ ); +}; + +export default TopHeader \ No newline at end of file From 10650ef7719b5c68a2fa69e15334a72dd80db125 Mon Sep 17 00:00:00 2001 From: saeyeon Date: Thu, 15 Jun 2023 23:38:10 +0900 Subject: [PATCH 18/75] test: iamport-api test --- .../Views/DetailPage/DetailPage.tsx | 234 +++++++++--------- src/Components/Views/MainPage/MainPage.tsx | 11 + vite.config.ts | 26 +- 3 files changed, 149 insertions(+), 122 deletions(-) diff --git a/src/Components/Views/DetailPage/DetailPage.tsx b/src/Components/Views/DetailPage/DetailPage.tsx index 27659c5a..5dc97b42 100644 --- a/src/Components/Views/DetailPage/DetailPage.tsx +++ b/src/Components/Views/DetailPage/DetailPage.tsx @@ -1,29 +1,27 @@ -import BookCustom from '../../../bookcustom/bookcustom'; -import { useEffect, useState, useRef } from 'react'; -import { useParams, useNavigate } from 'react-router-dom'; -import TopHeader from './components/TopHeader'; -import { getDetail } from '@/Apis/productApi'; -import './DetailPage.scss' - -function DetailPage(){ - +import BookCustom from "../../../bookcustom/bookcustom"; +import { useEffect, useState, useRef } from "react"; +import { useParams, useNavigate } from "react-router-dom"; +import TopHeader from "./components/TopHeader"; +import { getDetail } from "@/Apis/productApi"; +import "./DetailPage.scss"; + +function DetailPage() { interface DetailInfo { - detail_image:string, - product_name:string, - retail_price:number, - simple_description:string, - summary_description:string, - product_no:string, - price:number, - price_excluding_tax: string, - selling: string, - description:string + detail_image: string; + product_name: string; + retail_price: number; + simple_description: string; + summary_description: string; + product_no: string; + price: number; + price_excluding_tax: string; + selling: string; + description: string; } const navigate = useNavigate(); const [detail, setDetail] = useState({} as DetailInfo); - const { productNo } = useParams(); async function getDetails() { try { @@ -46,7 +44,7 @@ function DetailPage(){ setIsScrolled(false); } } - + useEffect(() => { function scrollListener() { window.addEventListener("scroll", handleScroll); @@ -56,7 +54,6 @@ function DetailPage(){ window.removeEventListener("scroll", handleScroll); }; // window 에서 스크롤을 감시를 종료 }); - useEffect(() => { (async () => { @@ -64,126 +61,139 @@ function DetailPage(){ })(); }, []); - const BuyBook = (detail:any) => { - let Cart = localStorage.getItem('cart'); - if(Cart === null) { + const BuyBook = (detail: any) => { + let Cart = localStorage.getItem("cart"); + if (Cart === null) { Cart = []; } else { Cart = JSON.parse(Cart); } const datalist = { - "buy": [] - ,"rent": [] + buy: [], + rent: [], }; // if (Cart.some((item) => item.id === detail.id)) { // alert('이미 장바구니에 담으셨습니다.'); // } else { - Cart.push(detail); - Cart = new Set(Cart); - Cart = [...Cart]; - localStorage.setItem('cart', JSON.stringify(Cart)); - datalist.buy = Cart; - console.log(datalist); - alert('장바구니에 담겼습니다.'); - navigate('/cart'); + Cart.push(detail); + Cart = new Set(Cart); + Cart = [...Cart]; + localStorage.setItem("cart", JSON.stringify(Cart)); + datalist.buy = Cart; + console.log(datalist); + alert("장바구니에 담겼습니다."); + navigate("/cart"); // } - } + }; - const disableLinkClick = (event) => { - event.preventDefault(); - // You can add any additional handling here if needed - }; - - const modifiedDescription = detail.description + const disableLinkClick = (event) => { + event.preventDefault(); + // You can add any additional handling here if needed + }; + + const modifiedDescription = detail.description ? detail.description.replace(/]*>/gi, (match) => - match.replace('href', 'data-disabled-href') + match.replace("href", "data-disabled-href") ) - : ''; - - const renderCardPriceItems = () => { - const cardPriceItems = { - '카드/간편결제할인': '', - '무이자 할부': '', - '소득공제300원': '', - }; - - return Object.entries(cardPriceItems).map(([key]) => ( - {`${key}`} - )); - } + : ""; - - - return( - <> + const renderCardPriceItems = () => { + const cardPriceItems = { + "카드/간편결제할인": "", + "무이자 할부": "", + 소득공제300원: "", + }; -
-
- -
+ return Object.entries(cardPriceItems).map(([key]) => ( + {`${key}`} + )); + }; -
-
- {detail.product_name} - -단돈 1,000원으로 시작할수 있는 -
-

윙크북 {detail.product_name} 전자책 출간일 2023-0505

-
+ return ( + <> +
+
+
-
- -
-
+
+
+ {detail.product_name} + -단돈 1,000원으로 시작할수 있는 +
+

윙크북 {detail.product_name} 전자책 출간일 2023-0505

+
+
-
-
-

책모양 아크릴 거울
(대상 도서 포함 3만원 이상 구매 시)

+
+ +
-
-
- 판매가 - {detail.price} -
-
- 줄거리 - -

{detail.summary_description}

-
-
-
- {renderCardPriceItems()} +
+
+

+ 책모양 아크릴 거울
+ (대상 도서 포함 3만원 이상 구매 시) +

-
- - +
+
+ 판매가 + {detail.price} +
+
+ 줄거리 + +

{detail.summary_description}

+
+
+
{renderCardPriceItems()}
+ +
+ + +
-
- -
- 출판사 제공
책소개
-
- {isScrolled ? : ""} -
-
-
+
+ + 출판사 제공
+ 책소개 +
+
+ {isScrolled ? ( + + ) : ( + "" + )} +
-
- 북플 BOOKPLE -
    -
  • 이책의 마니아가 남긴글
  • -
  • 친구가 남긴글
  • -
  • 내가 남긴글
  • -
+
+ +
+ 북플 BOOKPLE +
    +
  • 이책의 마니아가 남긴글
  • +
  • 친구가 남긴글
  • +
  • 내가 남긴글
  • +
+
-
); } diff --git a/src/Components/Views/MainPage/MainPage.tsx b/src/Components/Views/MainPage/MainPage.tsx index b339b3f8..728bfe32 100644 --- a/src/Components/Views/MainPage/MainPage.tsx +++ b/src/Components/Views/MainPage/MainPage.tsx @@ -3,6 +3,8 @@ import Carousel from "./Component/Carousel"; import ajax from "@/Apis/adminAuth"; import Main from "./Component/Main"; import Recommand from "./Component/Recommand"; +import { useEffect } from "react"; +import axios from "axios"; const params = new URLSearchParams(location.search); console.log(params.get("code")); @@ -19,6 +21,15 @@ if (params.get("code")) { } export default function MainPage() { + useEffect(() => { + async function fetchdata() { + const { data } = await axios.get( + "/iamport/status/all?limit=20&sorting=-started&_token=ff899877383a0a8e499810bf9c1536fd2e641d65" + ); + console.log("data:", data); + } + fetchdata(); + }, []); return (
diff --git a/vite.config.ts b/vite.config.ts index 683f07d0..eb282fed 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,25 +1,31 @@ -import { defineConfig } from 'vite' -import react from '@vitejs/plugin-react-swc'; -import sassDts from 'vite-plugin-sass-dts' -import mkcert from 'vite-plugin-mkcert'; -import path from 'path'; +import { defineConfig } from "vite"; +import react from "@vitejs/plugin-react-swc"; +import sassDts from "vite-plugin-sass-dts"; +import mkcert from "vite-plugin-mkcert"; +import path from "path"; const __dirname = path.resolve(); // https://vitejs.dev/config/ export default defineConfig({ - plugins: [react(), sassDts(), mkcert()], + plugins: [react(), sassDts(), mkcert()], resolve: { - alias: [{ find: '@', replacement: `${__dirname}/src` }], + alias: [{ find: "@", replacement: `${__dirname}/src` }], }, server: { - host: 'teamwink.com', + host: "teamwink.com", proxy: { "/cafe24": { target: "https://teamwink.cafe24api.com/api/v2", changeOrigin: true, secure: false, - rewrite: (path) => path.replace(/^\/cafe24/,''), + rewrite: (path) => path.replace(/^\/cafe24/, ""), + }, + "/iamport": { + target: "https://api.iamport.kr/payments", + changeOrigin: true, + secure: false, + rewrite: (path) => path.replace(/^\/iamport/, ""), }, }, }, -}) +}); From 1bcaf59dc8070c56b96304153179f1b5c7b29852 Mon Sep 17 00:00:00 2001 From: moon daehyun Date: Thu, 15 Jun 2023 23:41:49 +0900 Subject: [PATCH 19/75] test: Push Test --- src/Components/Views/MyPage/UserInfo.tsx | 45 ++++++++++++++++++++++-- 1 file changed, 43 insertions(+), 2 deletions(-) diff --git a/src/Components/Views/MyPage/UserInfo.tsx b/src/Components/Views/MyPage/UserInfo.tsx index f04fdd9c..d8f82afb 100644 --- a/src/Components/Views/MyPage/UserInfo.tsx +++ b/src/Components/Views/MyPage/UserInfo.tsx @@ -5,6 +5,7 @@ import './UserInfo.scss' import { NONAME } from 'dns'; function UserInfo () { + const navigate = useNavigate(); // 이름 , 프로필사진 , 구 비밀번호 , 새 비밀번호 const [displayName, setDisplayName] = useState(''); @@ -26,7 +27,16 @@ function UserInfo () { async function submit(e) { e.preventDefault(); + alert('수정완료'); + if (res.accessToken) { + alert("가입되었습니다."); + //localStorage.setItem('token', res.accessToken); + navigate("/login"); + } else { + alert("가입에 실패했습니다. 다시 시도해주세요."); + } + try { const res = await axios.put('https://asia-northeast3-heropy-api.cloudfunctions.net/api/auth/user', { @@ -103,6 +113,38 @@ function UserInfo () { [oldPassword] ); + // const setProfileImgBase64 = async (e: React.ChangeEvent) => { + // e.preventDefault(); + + // if(e.target.files){ + // const uploadFile = e.target.files[0] + // const formData = new FormData() + // formData.append('files',uploadFile) + + // await axios({ + // method: 'post', + // url: '/api/files/images', + // data: formData, + // headers: { + // 'Content-Type': 'multipart/form-data', + // }, + // }); + // } + // } + + // if(e.target.files){ + // const uploadFile = e.target.files[0] + // console.log(uploadFile) + + // const setProfileImgBase64 = (e: React.ChangeEvent) => { + // e.preventDefault(); + + // if(e.target.files){ + // const uploadFile = e.target.files[0] + // const formData = new FormData() + // formData.append('files',uploadFile) + // } + // } return( <> @@ -221,6 +263,7 @@ function UserInfo () { value={profileImgBase64} onChange={(e)=>{setProfileImgBase64(e.target.value)}} /> +
@@ -240,8 +283,6 @@ function UserInfo () {
- -
From f2975077e4ba85f79fc4e1e425cfe479bff4deaa Mon Sep 17 00:00:00 2001 From: hahahaday12 Date: Thu, 15 Jun 2023 23:45:10 +0900 Subject: [PATCH 20/75] =?UTF-8?q?delete=20:=20=20=ED=95=84=EC=9A=94?= =?UTF-8?q?=EC=97=86=EB=8A=94=20=ED=8C=8C=EC=9D=BC=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/images/bookcover.jpg | Bin 60174 -> 0 bytes public/images/bookimage.png | Bin 234131 -> 0 bytes src/Common/Layout/LayoutPage.scss | 6 ------ src/Common/Layout/LayoutPage.tsx | 13 ------------- src/Common/section/number.scss | 13 ------------- src/Common/section/number.tsx | 29 ----------------------------- 6 files changed, 61 deletions(-) delete mode 100644 public/images/bookcover.jpg delete mode 100644 public/images/bookimage.png delete mode 100644 src/Common/Layout/LayoutPage.scss delete mode 100644 src/Common/Layout/LayoutPage.tsx delete mode 100644 src/Common/section/number.scss delete mode 100644 src/Common/section/number.tsx diff --git a/public/images/bookcover.jpg b/public/images/bookcover.jpg deleted file mode 100644 index 0ac3f48afc3bf894b37e118dbc2cd788bf40e1c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 60174 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�WcgQ{@iCw!b3Htc&lG=Lz9p#>^Wd^r7GWm}_% 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

0AZfqu;y}y>X6$`$4 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%0D*{zeg~&# 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 cq5*US>O>d_@*>Wy$2T+DV~oh0@(v(-lVUp;l!< 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 Dxp%c~ diff --git a/src/Common/Layout/LayoutPage.scss b/src/Common/Layout/LayoutPage.scss deleted file mode 100644 index d0dad673..00000000 --- a/src/Common/Layout/LayoutPage.scss +++ /dev/null @@ -1,6 +0,0 @@ -// .layoutContainer{ -// width: 100vw; -// height: 100vh; -// background-color: #E8D5C4; -// position: relative; -// } diff --git a/src/Common/Layout/LayoutPage.tsx b/src/Common/Layout/LayoutPage.tsx deleted file mode 100644 index da930b8c..00000000 --- a/src/Common/Layout/LayoutPage.tsx +++ /dev/null @@ -1,13 +0,0 @@ - -import './LayoutPage.scss' - -function LayoutPage(){ - return( - <> -

- - ) -} -export default LayoutPage \ No newline at end of file diff --git a/src/Common/section/number.scss b/src/Common/section/number.scss deleted file mode 100644 index 092e6cdf..00000000 --- a/src/Common/section/number.scss +++ /dev/null @@ -1,13 +0,0 @@ -.YearContainer-input__selects{ - - .Year-select{ - // @include selectStyle; - width: 80px; - height: 40px; - display: block; - font-size: 15px; - //line-height: 1.0; - padding: 12px 12px 12px 25px; - border-radius: 0.25rem; - } - }; \ No newline at end of file diff --git a/src/Common/section/number.tsx b/src/Common/section/number.tsx deleted file mode 100644 index ed114a8a..00000000 --- a/src/Common/section/number.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import './number.scss'; -import React from 'react'; -import { Year } from '../../data/data'; // Import the Year function - -function YearBox(props) { - const yearList = Year(); // Get the year data using the Year function - - const renderNum = () => yearList.map((item , index) => { - return ( - - ); - }); - - const handleChange = (e: React.ChangeEvent) => { - props.event(e); - }; - - return ( - <> -
- -
- - ); -} - -export default YearBox; \ No newline at end of file From 4a48a76f3710a3169820c6a8abcf96815264210e Mon Sep 17 00:00:00 2001 From: hahahaday12 Date: Thu, 15 Jun 2023 23:46:20 +0900 Subject: [PATCH 21/75] =?UTF-8?q?fix:=20=EB=B3=80=EA=B2=BD=EC=82=AC?= =?UTF-8?q?=ED=95=AD=20update?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/images/Group 8.png | Bin 0 -> 1451 bytes src/App.scss | 4 -- .../Views/CartPage/CartItems/CartItems.tsx | 11 +---- src/Components/Views/CartPage/CartPage.scss | 8 +-- src/Components/Views/CartPage/CartPage.tsx | 14 +++--- .../Views/CartPage/Payment/Payment.tsx | 2 +- .../Views/DetailPage/DetailPage.tsx | 6 +-- .../Views/MainPage/Component/BookInfo.scss | 23 +++++++++ .../Views/MainPage/Component/BookInfo.tsx | 25 ++++++---- .../Views/MainPage/Component/Genre.scss | 46 +++++++++++++++++- .../Views/MainPage/Component/Genre.tsx | 18 ++++++- .../Views/MainPage/Component/Recommand.scss | 2 + 12 files changed, 118 insertions(+), 41 deletions(-) create mode 100644 public/images/Group 8.png create mode 100644 src/Components/Views/MainPage/Component/BookInfo.scss diff --git a/public/images/Group 8.png b/public/images/Group 8.png new file mode 100644 index 0000000000000000000000000000000000000000..ec2452affa7466bf72f73ea7edce6e7c80d09c06 GIT binary patch literal 1451 zcma)6jayPz7{8ji{AlHLsp-NDD?hSwCT1zlW!W@KUPT>A%hpXZ+6J-_!o@A%sNE!rLSi`RoR9a>SNTW1jXb>b(IL?5H z$;rTjfe>_!YoSkA4MD3hxZuDjmeI=zGCnTRu4{hUKWcj+f*iyoFbTJepZ12GzC6J` zli(Hqv@mYg+yi;>3dy4?{Fs?X)z&tz0}4&%we96B-lq=~WjbAWX^B^MgfB_IP%({* z%+7h>CPF0&ry;4BWo&rbk^a-k~tAQD^E3L!Pmfz7m z7(2eD(dOTt7;)~4&J+->!!LyQ847GUldKPYfo5B!#5-ZI|NTZu%Knrs8EBT_c1%a^ zq}ujhbhDw8tKyENyRxTRimpBLd) zA5Kgq9S&puJ_DEbi8211_!p(KZK1QZS~p1hD55u$BgShAO$9i-5Dt`6XW!;0mTtu2 zKdO{HzdB4AjBqMRm)qB;kcdTdF)o(CubWZQ9li6_rX+R$j9~7i#G9{8=Stxw7srzJ zoMwEJW`*5)QR!k~B^|%pv=X~ZFPlwhQkD*2=wsc5!y?oMHJNfap0Oe%iR7>}zWApi z0b>ySmcqx$rwthXK#0y7W+SIaWOdL|*Rq&18B`qYl3hd1nsd*=5YmB;wWzaYtc zWKHB)xbLeLG|%eQM+c)v<%Vqi>AH0e-n(~w=MWp&j-^YpZrK8tuA2Q3~o_2Sw5BRuMvkA-ua&SzxGUp;xbR*E&X^l+xSRwe@+yzb=4e+pB_K?ie2LyplIP8 zfE(d^xZ{UTk#bJn!@pdBA!h3r6{WDG<65eb-A%|FL$H;Aq)q<_^~ zts*d-T*Htvo7z?ZlbcYvG@@^tP!BE0fT%@wjSTf}W??-J*q&t5Rr~DF@10G9oiZsj zJ^tp^EVvhCo3+wLvS@_Skz*ndKJsa+$ly<3% zd`gr3ehu=ZZ%1?T<_mC64=H&olwoqRnfd14diXZVV`niS&90H9H&$3hm1PxW3wjNp z8-i4bSwD4vasOU1H>2&|9o33&xW(?rjE*=#pGb#-kAUf{P&?NQ-@4G^lEv_iQ9E)D QM+;AJ2k^m?pkw*}0W< { } setItems(updatedItems); setCheckedItems(updatedCheckedItems); - setCheck(updatedCheckedItems); + //setCheck(updatedCheckedItems); }; const children = (el:any ,index:number) => ( @@ -82,13 +82,6 @@ const CartItems = ({ check, pitem, setItems }: CartItemsProps) => { ); - const handleChange = (e: React.ChangeEvent) => { - console.log(); - setInfo({ - ...info, - [e.target.name]: e.target.value, - }); - }; const RemoveBuyItem = (index: number, key:any) => { console.log(key); diff --git a/src/Components/Views/CartPage/CartPage.scss b/src/Components/Views/CartPage/CartPage.scss index 064d08b4..ef9ee825 100644 --- a/src/Components/Views/CartPage/CartPage.scss +++ b/src/Components/Views/CartPage/CartPage.scss @@ -137,10 +137,10 @@ .Buy-ButtonBox { width: 300px; height: 55px; - //background-color: firebrick; - position: absolute; - right: 100px; - top: 50px; + background-color: firebrick; + position: relative; + left: 650px; + top: 70px; button { width: inherit; diff --git a/src/Components/Views/CartPage/CartPage.tsx b/src/Components/Views/CartPage/CartPage.tsx index 9336526b..edd268b1 100644 --- a/src/Components/Views/CartPage/CartPage.tsx +++ b/src/Components/Views/CartPage/CartPage.tsx @@ -21,17 +21,16 @@ function CartPage() { const [RentalItemsValue, setRentalItemsValue] = useState([]); - useEffect(() => { - console.log(CartItemsValue + "k"); - console.log(selectedItem); - }, [CartItemsValue]); + // useEffect(() => { + // console.log(CartItemsValue + "k"); + // console.log(selectedItem); + // }, [CartItemsValue]); useEffect(() => { calculateTotal(); - }, [selectedItem]); + }, [selectedItem,CartItemsValue]); const calculateTotal = () => { - console.log("ccccccc" + Array.isArray(selectedItem)); let total = 0; if (Array.isArray(selectedItem)) { selectedItem.forEach((item) => { @@ -45,7 +44,6 @@ function CartPage() { }); } setTotal(total); - console.log(total + "토"); setShowTotal(true); }; @@ -72,7 +70,7 @@ function CartPage() {
총 상품 가격 - {ShowTotal &&

Total Amount: ${Total}

} + {ShowTotal &&

${Total}

}
diff --git a/src/Components/Views/CartPage/Payment/Payment.tsx b/src/Components/Views/CartPage/Payment/Payment.tsx index 05f68bfc..eba2dd4a 100644 --- a/src/Components/Views/CartPage/Payment/Payment.tsx +++ b/src/Components/Views/CartPage/Payment/Payment.tsx @@ -1,4 +1,4 @@ -import React, { useEffect } from "react"; +import { useEffect } from "react"; const Payment = () => { useEffect(() => { diff --git a/src/Components/Views/DetailPage/DetailPage.tsx b/src/Components/Views/DetailPage/DetailPage.tsx index 27659c5a..e8a1a10a 100644 --- a/src/Components/Views/DetailPage/DetailPage.tsx +++ b/src/Components/Views/DetailPage/DetailPage.tsx @@ -127,7 +127,7 @@ function DetailPage(){
{detail.product_name} - -단돈 1,000원으로 시작할수 있는 + {/* -단돈 1,000원으로 시작할수 있는 */}

윙크북 {detail.product_name} 전자책 출간일 2023-0505

@@ -175,14 +175,14 @@ function DetailPage(){ onClick={disableLinkClick}>
-
+ {/*
북플 BOOKPLE
  • 이책의 마니아가 남긴글
  • 친구가 남긴글
  • 내가 남긴글
-
+
*/}
); diff --git a/src/Components/Views/MainPage/Component/BookInfo.scss b/src/Components/Views/MainPage/Component/BookInfo.scss new file mode 100644 index 00000000..e92cf359 --- /dev/null +++ b/src/Components/Views/MainPage/Component/BookInfo.scss @@ -0,0 +1,23 @@ +.Book-container{ + //padding-bottom: 10px; + //height: 500px; + //padding-top: 10px; + margin-top: 40px; + //background-color: rgb(127, 188, 242); +} + + + +.BookInfo-Inner{ + position: relative; + //bottom: 240px; + width: auto; + bottom: 284px; + padding-bottom: 10px; + padding: 10px; + border-radius: 10px; + color: rgb(80, 75, 75); + background-color:#D7C0AE; +} + + diff --git a/src/Components/Views/MainPage/Component/BookInfo.tsx b/src/Components/Views/MainPage/Component/BookInfo.tsx index 6c28edc6..82f9fa2a 100644 --- a/src/Components/Views/MainPage/Component/BookInfo.tsx +++ b/src/Components/Views/MainPage/Component/BookInfo.tsx @@ -1,5 +1,6 @@ import { Link } from 'react-router-dom'; import { useState } from 'react'; +import './BookInfo.scss' interface Props { productNo: number; @@ -39,16 +40,22 @@ export default function BookInfo({
) : null} - {productName} -

{productName}

- {retailPrice === price ? ( -
{price.slice(0, -3)}원
- ) : ( -
-
{retailPrice.slice(0, -3)}원
-
{price.slice(0, -3)}원
+
+ {productName} + +
+

{productName}

+ + {retailPrice === price ? ( +
{price.slice(0, -3)}원
+ ) : ( +
+
{retailPrice.slice(0, -3)}원
+
{price.slice(0, -3)}원
+
+ )}
- )} +
); } diff --git a/src/Components/Views/MainPage/Component/Genre.scss b/src/Components/Views/MainPage/Component/Genre.scss index a35ddcdc..9b988ca3 100644 --- a/src/Components/Views/MainPage/Component/Genre.scss +++ b/src/Components/Views/MainPage/Component/Genre.scss @@ -6,35 +6,75 @@ } } .left { - background-color: rgb(219, 218, 218); + background-color: #DFD3C3; + width: 200px; + //background-color: rgb(219, 218, 218); border-top-left-radius: 10px; border-bottom-left-radius: 10px; .tag-box { padding: 30px 10px; + color: #555252; } } .right { + //position: absolute; + background-color: #FFF3E2; display: flex; flex-wrap: wrap; + height: 918px; + //padding-bottom: 30px; border-top: 1px solid rgb(219, 218, 218); border-bottom: 1px solid rgb(219, 218, 218); + .Top-bookContainer{ + position: absolute; + height: 50px; + width: 970px; + z-index: 200; + margin-left: 10px; + margin-top: 370px; + } + + .Bottom-bookContainer{ + position: absolute; + width: 970px; + margin-left: 10px; + margin-top: 827px; + height: 50px; + //bottom: 100px; + } + + + .book { position: relative; + //display: flex; width: calc(100% / 5); padding: 0 10px; margin: 30px 0; + //margin-top: 10px; + //background-color: aquamarine; img { + // position: relative; + // margin-top: 100px; + // border-radius: 10px; + // width: 100%; + // height: 230px; + border-radius: 10px; width: 100%; height: 230px; + position: relative; + top: 80px; } } h4 { + //margin-top: 100px; margin: 10px 0; + //background-color: aquamarine; } } .hover-description { @@ -47,7 +87,7 @@ //background-color: rgb(255, 239, 228); backdrop-filter: blur(5px); -webkit-backdrop-filter: blur(5px); - top: 0; + top: 120px; z-index: 1; color: #fff; text-shadow: -1px -1px 0 #000, 1px -1px 0 #000, -1px 1px 0 #000, @@ -62,6 +102,8 @@ background-color: red; color: #fff; right: 10%; + z-index: 200; + top: 120px; } .retail-price { text-decoration: line-through; diff --git a/src/Components/Views/MainPage/Component/Genre.tsx b/src/Components/Views/MainPage/Component/Genre.tsx index 5dc1ec67..292856b9 100644 --- a/src/Components/Views/MainPage/Component/Genre.tsx +++ b/src/Components/Views/MainPage/Component/Genre.tsx @@ -26,13 +26,16 @@ export default function Genre({ category }: { category: Props }) {

{category.type}

-
tags....
+ {/*
tags....
*/}
+ {list && list.map((item) => ( + <> + {/* */} + {/*
+ +
*/} + {/* {Array.from({ length: 1 }).map((_, index) => ( +
+ +
+ ))} */} + ))} +
); diff --git a/src/Components/Views/MainPage/Component/Recommand.scss b/src/Components/Views/MainPage/Component/Recommand.scss index 7a51f994..f722381b 100644 --- a/src/Components/Views/MainPage/Component/Recommand.scss +++ b/src/Components/Views/MainPage/Component/Recommand.scss @@ -4,10 +4,12 @@ margin: 100px auto 0; width: 80%; overflow: hidden; + //background-color: #56886f; h1 { border-bottom: 1px solid; padding-bottom: 10px; + } } .recommand-wrapper { From c5e05a78f432119770f3b2050bb96cc375fa8332 Mon Sep 17 00:00:00 2001 From: moon daehyun Date: Fri, 16 Jun 2023 00:07:24 +0900 Subject: [PATCH 22/75] test: push test --- src/Components/Views/CartPage/CartItems/CartItems.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Components/Views/CartPage/CartItems/CartItems.tsx b/src/Components/Views/CartPage/CartItems/CartItems.tsx index 2f760111..5e767fce 100644 --- a/src/Components/Views/CartPage/CartItems/CartItems.tsx +++ b/src/Components/Views/CartPage/CartItems/CartItems.tsx @@ -3,7 +3,6 @@ import { useState } from 'react'; import Box from '@mui/material/Box'; import Checkbox from '@mui/material/Checkbox'; import FormControlLabel from '@mui/material/FormControlLabel'; -import YearBox from 'Common/section/number'; import './CartItems.scss'; interface BuyItem { From cf06cb350f6bb3924d0dc517db514c9f3e9f5110 Mon Sep 17 00:00:00 2001 From: hahahaday12 Date: Fri, 16 Jun 2023 00:34:30 +0900 Subject: [PATCH 23/75] =?UTF-8?q?fix:=20=EB=88=84=EB=9D=BD=EB=90=9C=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Components/Views/DetailPage/DetailPage.tsx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Components/Views/DetailPage/DetailPage.tsx b/src/Components/Views/DetailPage/DetailPage.tsx index b2432b9d..e2a73951 100644 --- a/src/Components/Views/DetailPage/DetailPage.tsx +++ b/src/Components/Views/DetailPage/DetailPage.tsx @@ -126,6 +126,10 @@ function DetailPage() {

윙크북 {detail.product_name} 전자책 출간일 2023-0505

+ +
+ +
From a635aeb53383874de30fdef97c71537a8123b879 Mon Sep 17 00:00:00 2001 From: hahahaday12 Date: Mon, 19 Jun 2023 23:11:39 +0900 Subject: [PATCH 24/75] =?UTF-8?q?feat:=20=ED=95=84=EC=9A=94=EC=97=86?= =?UTF-8?q?=EB=8A=94=20=ED=8C=8C=EC=9D=BC=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Components/Views/DetailPage/components/BookEvent.scss | 0 src/Components/Views/DetailPage/components/BookEvent.tsx | 7 ------- 2 files changed, 7 deletions(-) delete mode 100644 src/Components/Views/DetailPage/components/BookEvent.scss delete mode 100644 src/Components/Views/DetailPage/components/BookEvent.tsx diff --git a/src/Components/Views/DetailPage/components/BookEvent.scss b/src/Components/Views/DetailPage/components/BookEvent.scss deleted file mode 100644 index e69de29b..00000000 diff --git a/src/Components/Views/DetailPage/components/BookEvent.tsx b/src/Components/Views/DetailPage/components/BookEvent.tsx deleted file mode 100644 index 4321fa74..00000000 --- a/src/Components/Views/DetailPage/components/BookEvent.tsx +++ /dev/null @@ -1,7 +0,0 @@ -function BookEvent() { - return( - <> - - ) -} -export default BookEvent \ No newline at end of file From c83048b02ba5cd4c0b4075ada762a73c2578c3eb Mon Sep 17 00:00:00 2001 From: jinyoungpark231 Date: Mon, 19 Jun 2023 23:11:48 +0900 Subject: [PATCH 25/75] =?UTF-8?q?feat:=EA=B2=80=EC=83=89=EA=B2=B0=EA=B3=BC?= =?UTF-8?q?=EC=B0=BD=20=ED=8D=BC=EB=B8=94=EB=A6=AC=EC=8B=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 +- src/App.tsx | 8 +- .../Views/CartPage/CartItems/CartItems.tsx | 43 ++--------- .../Views/SearchPage/SearchPage.scss | 75 ++++++++++++++++++ .../Views/SearchPage/SearchPage.tsx | 76 +++++++++++++++++++ 5 files changed, 162 insertions(+), 42 deletions(-) create mode 100644 src/Components/Views/SearchPage/SearchPage.scss create mode 100644 src/Components/Views/SearchPage/SearchPage.tsx diff --git a/.gitignore b/.gitignore index a547bf36..83e1c004 100644 --- a/.gitignore +++ b/.gitignore @@ -6,7 +6,7 @@ yarn-debug.log* yarn-error.log* pnpm-debug.log* lerna-debug.log* - +.env node_modules dist dist-ssr diff --git a/src/App.tsx b/src/App.tsx index f4ea5f2c..470ca64d 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,10 +1,12 @@ -import "./App.scss"; -import RoutesPage from "./routes/routes"; +import './App.scss'; +import RoutesPage from './routes/routes'; +import SearchPage from './Components/Views/SearchPage/SearchPage'; function App() { return ( <> - + {/* */} + ); } diff --git a/src/Components/Views/CartPage/CartItems/CartItems.tsx b/src/Components/Views/CartPage/CartItems/CartItems.tsx index 9fe145cd..263128ce 100644 --- a/src/Components/Views/CartPage/CartItems/CartItems.tsx +++ b/src/Components/Views/CartPage/CartItems/CartItems.tsx @@ -57,24 +57,10 @@ const CartItems = ({ check, pitem, setItems }: CartItemsProps) => { updatedItems = pitem.filter((key) => key.product_no !== el.product_no); } setItems(updatedItems); - setCheckedItems(updatedCheckedItems); + setCheckedItems(updatedCheckedItems); //setCheck(updatedCheckedItems); }; - const [priceTotal,setPriceTotal] = useState(0) - const [saleTotal, setSaleTotal] = useState(0) - - const children = (itemId: number, itemPrice: number, itemSale: number) => { - if(priceTotal !== 0){ - if(checkedItems.includes(itemId)){ - setPriceTotal(priceTotal + itemPrice) - setSaleTotal(saleTotal + itemSale) - }else{ - setPriceTotal(priceTotal - itemPrice) - setSaleTotal(saleTotal - itemSale) - } - } - const children = (el:any ,index:number) => ( { } /> - )}; + ); const RemoveBuyItem = (index: number, key:any) => { @@ -146,27 +132,8 @@ const CartItems = ({ check, pitem, setItems }: CartItemsProps) => {
보관/삭제 -
-
- -
- {items.map((item) => ( -
-
- {children(item.id,+item.price,+item.sale)} -
-
- cartbookimage -
-
- {item.name} - {item.text} -
- -
- {item.price} - {item.sale} -
+
+
{buyItem.map((el, index) => ( @@ -193,4 +160,4 @@ const CartItems = ({ check, pitem, setItems }: CartItemsProps) => { ); } -export default CartItems; +export default CartItems; \ No newline at end of file diff --git a/src/Components/Views/SearchPage/SearchPage.scss b/src/Components/Views/SearchPage/SearchPage.scss new file mode 100644 index 00000000..d2a8560a --- /dev/null +++ b/src/Components/Views/SearchPage/SearchPage.scss @@ -0,0 +1,75 @@ +.SearchPage { + width: inherit; + height: 600px; + border-bottom: 2px solid #ca9f12; +} +// 책 표지 +.SearchPage__Images { + width: 370px; + height: 500px; + position: relative; + left: 13em; + margin: 70px 0; +} + +// 상세설명 +.SearchPage__Items { + position: relative; + width: 800px; + height: 600px; + top: -575px; + left: 40em; + + //제목 + h1 { + font-size: 30px; + } + + // 줄거리 + p:nth-child(2) { + width: 700px; + font-size: 20px; + margin: 100px 0; + color: #595959; + } + + // 판매가 + p:nth-child(3) { + position: absolute; + color: red; + font-size: 30px; + bottom: 150px; + } + // 정가 + p:nth-child(4) { + position: absolute; + color: #808080; + font-size: 20px; + bottom: 100px; + } +} + +// 구매,대여 버튼 +.SearchPage__ButtonBox button { + display: flex; + position: relative; + align-items: center; + justify-content: center; + border-radius: 30px; + width: 120px; + height: 40px; + color: #fff; + border: none; + font-size: 17px; + margin: 20px; + left: 99em; + top: -47em; + cursor: pointer; +} + +button:first-child { + background-color: #4dac27; +} +button:last-child { + background-color: #5055b1; +} diff --git a/src/Components/Views/SearchPage/SearchPage.tsx b/src/Components/Views/SearchPage/SearchPage.tsx new file mode 100644 index 00000000..51b7e721 --- /dev/null +++ b/src/Components/Views/SearchPage/SearchPage.tsx @@ -0,0 +1,76 @@ +import './SearchPage.scss'; + +const dummy = [ + { + list_image: + 'https://teamwink.cafe24.com/web/product/big/202306/6543ff6b482a7dfbf4275363d79e01dc.png', + product_name: '피나 바우쉬(끝나지 않을 몸짓)', + summary_description: + "'현대 예술의 거장' 시리즈는 20세기를 전후한 문화 예술계에큰 영향력을 끼친 국내외 거장 아티스트의 평전으로 구성된다.", + retail_price: '20000', + price: '18000', + }, + { + list_image: + 'https://teamwink.cafe24.com/web/product/big/202306/23ee454750818ac377870ea574e832bd.png', + product_name: '일향 강우방의 예술 혁명일지', + summary_description: + '우리나라 미술사학계를 대표하는 원로이자 현역으로 활동하는 강우방(83)의 자전적 에세이다.', + retail_price: '20000', + price: '18000', + }, + { + list_image: + 'https://teamwink.cafe24.com/web/product/big/202306/fd86c152ea5616135b40747f895a576c.png', + product_name: '예술이 필요한 시간(전시 디자이너 에세이)', + summary_description: + '《에드워드 호퍼: 길 위에서》를 비롯해 까르띠에 현대미술재단 소장품전 《하이라이트》, 《빛: 영국 테이트미술관 특별전》 등 해외 유명 걸작전을 담당해온 전시 디자이너의 시선을 담아낸 책이다', + retail_price: '20000', + price: '18000', + }, + { + list_image: + 'https://teamwink.cafe24.com/web/product/big/202306/abc3fc36c0dad20454ad0433b4c662c5.png', + product_name: '예썰의 전당: 서양미술 편(예술에 관한 세상의 모든 썰)', + summary_description: + "KBS 화제의 교양 프로그램 '예썰의 전당'을 책으로 만난다.", + retail_price: '20000', + price: '18000', + }, + { + list_image: + 'https://teamwink.cafe24.com/web/product/big/202306/84a72535341fa2d5966129b260f97857.png', + product_name: + '생성 예술의 시대(챗GPT가 말하고 DALL E가 그리는 인공지능 시대의 예술)', + summary_description: + '인공지능을 위시한 이 시대 가장 첨예한 신기술에 항상 주목해 왔던 뇌과학자 김대식이 이번에는 생성AI를 활용한 AI 그림의 가능성에 눈을 돌렸다', + retail_price: '20000', + price: '18000', + }, +]; + +export default function SearchPage() { + return ( +
+ {dummy.map((v) => { + return ( +
+
+ 책표지 +
+
+

{v.product_name}

+

{v.summary_description}

+

{v.price}

+

{v.retail_price}

+
+
+ + +
+
+ ); + })} +
+ ); +} From c861ed687a65d47e0253610c33aca134134f4849 Mon Sep 17 00:00:00 2001 From: saeyeon Date: Mon, 19 Jun 2023 23:11:58 +0900 Subject: [PATCH 26/75] =?UTF-8?q?fix:payment=EC=A0=95=EB=B3=B4=EC=97=B0?= =?UTF-8?q?=EB=8F=99,test:paymenttoken=20testing?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Apis/PaymentToken/paymentToken.ts | 16 + .../Views/CartPage/CartItems/CartItems.tsx | 94 ++-- src/Components/Views/CartPage/CartPage.tsx | 16 +- .../Views/CartPage/Payment/Payment.tsx | 10 +- .../Views/DetailPage/DetailPage.tsx | 7 +- src/Components/Views/MainPage/MainPage.tsx | 9 - src/Components/Views/MyPage/MyPage.tsx | 90 ++-- src/Components/Views/MyPage/UserInfo.tsx | 428 ++++++++---------- 8 files changed, 336 insertions(+), 334 deletions(-) create mode 100644 src/Apis/PaymentToken/paymentToken.ts diff --git a/src/Apis/PaymentToken/paymentToken.ts b/src/Apis/PaymentToken/paymentToken.ts new file mode 100644 index 00000000..67192242 --- /dev/null +++ b/src/Apis/PaymentToken/paymentToken.ts @@ -0,0 +1,16 @@ +import axios from "axios"; + +export const ajax = axios({ + url: "/users/getToken", + // POST method + method: "post", + // "Content-Type": "application/json" + headers: { "Content-Type": "application/json" }, + data: { + // REST API키 + imp_key: "5758023681388354", + // REST API Secret + imp_secret: + "tCdwGmiflqhMA3It54n6aLBIeA7LCg0O3WYu5qI1SKpwQ85FKXtJsiHu8yUWTynhDx7fxCFY1wsA3KVc", + }, +}); diff --git a/src/Components/Views/CartPage/CartItems/CartItems.tsx b/src/Components/Views/CartPage/CartItems/CartItems.tsx index 595d1fee..162bd6b2 100644 --- a/src/Components/Views/CartPage/CartItems/CartItems.tsx +++ b/src/Components/Views/CartPage/CartItems/CartItems.tsx @@ -1,9 +1,9 @@ -import React, { useEffect } from 'react'; -import { useState } from 'react'; -import Box from '@mui/material/Box'; -import Checkbox from '@mui/material/Checkbox'; -import FormControlLabel from '@mui/material/FormControlLabel'; -import './CartItems.scss'; +import React, { useEffect } from "react"; +import { useState } from "react"; +import Box from "@mui/material/Box"; +import Checkbox from "@mui/material/Checkbox"; +import FormControlLabel from "@mui/material/FormControlLabel"; +import "./CartItems.scss"; interface BuyItem { id: number; @@ -16,8 +16,7 @@ interface BuyItem { interface CartItemsProps { check: number[]; pitem: any; - setItems:any; - + setItems: any; } const CartItems = ({ check, pitem, setItems }: CartItemsProps) => { @@ -25,7 +24,6 @@ const CartItems = ({ check, pitem, setItems }: CartItemsProps) => { const [buyItem, setbuyItem] = useState([]); const [checkedItems, setCheckedItems] = useState(check); - useEffect(() => { BuyCart(); }, []); @@ -33,42 +31,44 @@ const CartItems = ({ check, pitem, setItems }: CartItemsProps) => { const BuyCart = () => { const BuyItems = JSON.parse(localStorage.getItem("cart")) || []; setbuyItem(BuyItems); - console.log(BuyItems) - } + console.log(BuyItems); + }; const handleChange1 = (event: React.ChangeEvent) => { const checkedValue = event.target.checked; const updatedCheckedItems = checkedValue ? buyItem.map((item) => item.id) : []; - setCheckedItems(updatedCheckedItems); - }; - - const handleChange2 = (el: any) => (event: React.ChangeEvent) => { - console.log(el); - const itemId = parseInt(event.target.name); - let updatedCheckedItems: number[] = []; - let updatedItems: any[] = []; - if (event.target.checked) { - updatedCheckedItems = [...checkedItems, itemId]; - updatedItems = [...pitem , el]; - } else { - updatedCheckedItems = checkedItems.filter((id) => id !== itemId); - updatedItems = pitem.filter((key) => key.product_no !== el.product_no); - } - setItems(updatedItems); setCheckedItems(updatedCheckedItems); - //setCheck(updatedCheckedItems); }; - const children = (el:any ,index:number) => ( + const handleChange2 = + (el: any) => (event: React.ChangeEvent) => { + console.log(el); + const itemId = parseInt(event.target.name); + let updatedCheckedItems: number[] = []; + let updatedItems: any[] = []; + if (event.target.checked) { + updatedCheckedItems = [...checkedItems, itemId]; + updatedItems = [...pitem, el]; + } else { + updatedCheckedItems = checkedItems.filter((id) => id !== itemId); + updatedItems = pitem.filter((key) => key.product_no !== el.product_no); + } + setItems(updatedItems); + setCheckedItems(updatedCheckedItems); + //setCheck(updatedCheckedItems); + }; + + const children = (el: any, index: number) => ( + fontSize: "large", + }} + > { ); - - const RemoveBuyItem = (index: number, key:any) => { + const RemoveBuyItem = (index: number, key: any) => { console.log(key); - const confirmation = window.confirm('삭제하시겠습니까?'); + const confirmation = window.confirm("삭제하시겠습니까?"); if (confirmation) { + const updatedCartData = JSON.parse(localStorage.getItem("cart")); + localStorage.setItem( + "cart", + JSON.stringify( + updatedCartData.filter((item) => item.product_no !== key) + ) + ); - const updatedCartData = JSON.parse(localStorage.getItem('cart')); - localStorage.setItem('cart', JSON.stringify(updatedCartData.filter((item) => item.product_no !== key))); - const updatedBuyItem = [...buyItem]; //선택한 index 1개를 buyItem 배열에서 제거. updatedBuyItem.splice(index, 1); // 제거한후의 값 setState 갑에 담아줌. setbuyItem(updatedBuyItem); // cart 키 값으로 로컬에서 데이터 찾아옴 - alert('삭제되었습니다.'); + alert("삭제되었습니다."); } else { - alert('취소되었습니다.'); + alert("취소되었습니다."); } }; @@ -114,7 +117,8 @@ const CartItems = ({ check, pitem, setItems }: CartItemsProps) => { size="large" checked={checkedItems.length === buyItem.length} indeterminate={ - checkedItems.length > 0 && checkedItems.length < buyItem.length + checkedItems.length > 0 && + checkedItems.length < buyItem.length } onChange={handleChange1} /> @@ -152,12 +156,14 @@ const CartItems = ({ check, pitem, setItems }: CartItemsProps) => {
- +
))}
); -} +}; export default CartItems; diff --git a/src/Components/Views/CartPage/CartPage.tsx b/src/Components/Views/CartPage/CartPage.tsx index edd268b1..351a0139 100644 --- a/src/Components/Views/CartPage/CartPage.tsx +++ b/src/Components/Views/CartPage/CartPage.tsx @@ -21,16 +21,17 @@ function CartPage() { const [RentalItemsValue, setRentalItemsValue] = useState([]); - // useEffect(() => { - // console.log(CartItemsValue + "k"); - // console.log(selectedItem); - // }, [CartItemsValue]); + useEffect(() => { + console.log(CartItemsValue + "k"); + console.log(selectedItem); + }, [CartItemsValue]); useEffect(() => { calculateTotal(); - }, [selectedItem,CartItemsValue]); + }, [selectedItem]); const calculateTotal = () => { + console.log("ccccccc" + Array.isArray(selectedItem)); let total = 0; if (Array.isArray(selectedItem)) { selectedItem.forEach((item) => { @@ -44,6 +45,7 @@ function CartPage() { }); } setTotal(total); + console.log(total + "토"); setShowTotal(true); }; @@ -70,7 +72,7 @@ function CartPage() {
총 상품 가격 - {ShowTotal &&

${Total}

} + {ShowTotal &&

Total Amount: ${Total}

}
@@ -83,7 +85,7 @@ function CartPage() {
{/* */} - +
diff --git a/src/Components/Views/CartPage/Payment/Payment.tsx b/src/Components/Views/CartPage/Payment/Payment.tsx index eba2dd4a..64188b16 100644 --- a/src/Components/Views/CartPage/Payment/Payment.tsx +++ b/src/Components/Views/CartPage/Payment/Payment.tsx @@ -1,6 +1,10 @@ -import { useEffect } from "react"; +import { useEffect } from "react"; -const Payment = () => { +export interface PaymentInfo { + amount: number; +} + +const Payment = ({ amount }: PaymentInfo) => { useEffect(() => { const jquery = document.createElement("script"); jquery.src = "https://code.jquery.com/jquery-1.12.4.min.js"; @@ -20,7 +24,7 @@ const Payment = () => { pg: "html5_inicis", // PG사 html5_inicis: KG이니시스, kakaopay: 카카오페이, naverpay: 네이버페이, payco: 페이코 pay_method: "card", // 결제수단 merchant_uid: `mid_${new Date().getTime()}`, // 주문번호 - amount: 100, // 결제금액 + amount: amount, // 결제금액 name: "아임포트 결제 데이터 분석", // 주문명 buyer_name: "김세연", // 구매자 이름 // buyer_tel: "01032752740", // 구매자 전화번호 diff --git a/src/Components/Views/DetailPage/DetailPage.tsx b/src/Components/Views/DetailPage/DetailPage.tsx index e2a73951..5c9febdb 100644 --- a/src/Components/Views/DetailPage/DetailPage.tsx +++ b/src/Components/Views/DetailPage/DetailPage.tsx @@ -56,6 +56,7 @@ function DetailPage() { }); useEffect(() => { + window.scrollTo(0, 0); (async () => { await getDetails(); })(); @@ -126,10 +127,10 @@ function DetailPage() {

윙크북 {detail.product_name} 전자책 출간일 2023-0505

- +
- -
+ +
diff --git a/src/Components/Views/MainPage/MainPage.tsx b/src/Components/Views/MainPage/MainPage.tsx index 728bfe32..e47c2b67 100644 --- a/src/Components/Views/MainPage/MainPage.tsx +++ b/src/Components/Views/MainPage/MainPage.tsx @@ -21,15 +21,6 @@ if (params.get("code")) { } export default function MainPage() { - useEffect(() => { - async function fetchdata() { - const { data } = await axios.get( - "/iamport/status/all?limit=20&sorting=-started&_token=ff899877383a0a8e499810bf9c1536fd2e641d65" - ); - console.log("data:", data); - } - fetchdata(); - }, []); return (
diff --git a/src/Components/Views/MyPage/MyPage.tsx b/src/Components/Views/MyPage/MyPage.tsx index f891ab3f..3a33045b 100644 --- a/src/Components/Views/MyPage/MyPage.tsx +++ b/src/Components/Views/MyPage/MyPage.tsx @@ -1,13 +1,25 @@ -// import { useState, useEffect } from 'react'; -import { Link } from 'react-router-dom'; -import './MyPage.scss' +import { useState, useEffect } from "react"; +import { Link } from "react-router-dom"; +import "./MyPage.scss"; +import axios from "axios"; +import { ajax } from "@/Apis/PaymentToken/paymentToken"; -function MyPage () { - return( - <> -
-
- +function MyPage() { + useEffect(() => { + async function fetchdata() { + const { data } = await axios.get( + "/iamport/status/all?limit=20&sorting=-started&_token=f186fc39a390999edfd821b816dc5a90a9ce1c8d" + ); + console.log("data:", data); + } + fetchdata(); + }, []); + console.log("ajax:", ajax); + + return ( + <> +
+
@@ -22,41 +34,39 @@ function MyPage () {
-
주문내역조회
-
+
주문내역조회
+ {" "} +
-
회원정보 수정
-
+
회원정보 수정
+ {" "} +
-
배송지 관리
-
+
배송지 관리
+ {" "} +
-
결제수단 관리
-
+
결제수단 관리
+ {" "} +
-
1:1 문의
-
+
1:1 문의
+ {" "} +
- - -
+
- - -
- 구매 내역 -
- -
-
-
-
-
-
-
- +
구매 내역
+ +
+
+
+
+
+
+
@@ -71,10 +81,10 @@ function MyPage () {
-
- - ) +
+ + ); } -export default MyPage +export default MyPage; diff --git a/src/Components/Views/MyPage/UserInfo.tsx b/src/Components/Views/MyPage/UserInfo.tsx index f04fdd9c..a5eaa497 100644 --- a/src/Components/Views/MyPage/UserInfo.tsx +++ b/src/Components/Views/MyPage/UserInfo.tsx @@ -1,254 +1,226 @@ -import { FormEvent, useState, useEffect, ChangeEvent, useCallback, useRef } from 'react'; -import axios from 'axios'; -import { Link, useNavigate } from 'react-router-dom'; -import './UserInfo.scss' -import { NONAME } from 'dns'; - -function UserInfo () { +import { + FormEvent, + useState, + useEffect, + ChangeEvent, + useCallback, + useRef, +} from "react"; +import axios from "axios"; +import { Link, useNavigate } from "react-router-dom"; +import "./UserInfo.scss"; +import { NONAME } from "dns"; + +function UserInfo() { + const navigate = useNavigate(); // 이름 , 프로필사진 , 구 비밀번호 , 새 비밀번호 - const [displayName, setDisplayName] = useState(''); - const [profileImgBase64, setProfileImgBase64] = useState(''); - const [oldPassword, setOldPassword] = useState(''); - const [newPassword, setNewPassword] = useState(''); - - //비밀번호 유효성 검사 - const [isName, setIsName] = useState(false); - const [isOldPassword, setIsOldPassword] = useState(false); - const [isNewPasswordConfirm, setIsNewPasswordConfirm] = useState(false); - - //오류 메세지 저장 - const [nameMessage, setNameMessage] = useState(''); - const [passwordMessage, setPasswordMessage] = useState(''); - const [passwordConfirmMessage, setPasswordConfirmMessage] = useState(''); - - + const [displayName, setDisplayName] = useState(""); + const [profileImgBase64, setProfileImgBase64] = useState(""); + const [oldPassword, setOldPassword] = useState(""); + const [newPassword, setNewPassword] = useState(""); - async function submit(e) { + async function submit(e: any) { e.preventDefault(); - alert('수정완료'); - try { - const res = await axios.put('https://asia-northeast3-heropy-api.cloudfunctions.net/api/auth/user', { - displayName: displayName, // 새로운 표시 이름 - profileImgBase64: profileImgBase64, // 사용자 프로필 이미지(base64) - jpg, jpeg, webp, png, gif, svg - oldPassword: oldPassword, // 기존 비밀번호 - newPassword: newPassword // 새로운 비밀번호 - }, { - headers: { - Authorization: `Bearer ${localStorage.getItem('token')}`, - 'Content-Type': 'application/json', - apikey: 'KDT5_nREmPe9B', - username: 'KDT5_TeamWink', + const res = await axios.put( + "https://asia-northeast3-heropy-api.cloudfunctions.net/api/auth/user", + { + displayName: displayName, // 새로운 표시 이름 + profileImgBase64: profileImgBase64, // 사용자 프로필 이미지(base64) - jpg, jpeg, webp, png, gif, svg + oldPassword: oldPassword, // 기존 비밀번호 + newPassword: newPassword, // 새로운 비밀번호 + }, + { + headers: { + Authorization: `Bearer ${localStorage.getItem("token")}`, + "Content-Type": "application/json", + //"Content-Type": "multipart/form-data", + apikey: "KDT5_nREmPe9B", + username: "KDT5_TeamWink", + }, } - }) - }catch(err){ - console.log(err) + ); + console.log("res:", res.data); + alert("수정완료"); + } catch (err) { + console.error("error"); + alert("수정 실패"); } } - const onChangeName = useCallback((e: React.ChangeEvent) => { - setDisplayName(e.target.value); - if (e.target.value.length < 2 || e.target.value.length > 21) { - setNameMessage('2글자 이상 21글자 미만으로 입력해주세요.'); - setIsName(false); - } else { - setNameMessage('올바른 이름 형식입니다 '); - setIsName(true); - } - }, []); - - const onChangePassword = useCallback( - (e: React.ChangeEvent) => { - const passwordCurrent = e.target.value; - setOldPassword(passwordCurrent); - - if (!PwCheck(passwordCurrent)) { - setPasswordMessage('8자리 이상 입력해주세요.'); - setIsOldPassword(false); - } else { - setPasswordMessage('안전한 비밀번호에요 '); - setIsOldPassword(true); - } - }, - [oldPassword] - ); - - const onChangePasswordConfirm = ( - password: any, - confirmPassword: any, - setPasswordConfirmMessage: any, - setIsPasswordConfirm: any - ) => { - if (password === confirmPassword) { - setPasswordConfirmMessage('비밀번호를 똑같이 입력했어요.'); - setIsPasswordConfirm(true); - } else { - setPasswordConfirmMessage('비밀번호가 틀립니다. 다시 입력해주세요.'); - setIsPasswordConfirm(false); - } - }; - - const onPasswordConfirmChange = useCallback( - (e: React.ChangeEvent) => { - const passwordConfirmCurrent = e.target.value; - setNewPassword(passwordConfirmCurrent); - onChangePasswordConfirm( - oldPassword, - passwordConfirmCurrent, - setPasswordConfirmMessage, - setIsNewPasswordConfirm - ); - }, - [oldPassword] - ); - - - return( - <> -
-
- My Page -
-
-
-
-

닉네임{displayName}

-
- {/*
-
-

자기소개

-
-
*/} + // const goToMyPage = () => { + // navigate("/MyPage"); + // } + + return ( + <> +
+
+ My Page +
+ + + {/*
*/} +
+
+

{displayName}

-
- -
주문내역조회
-
- -
회원정보 수정
-
- -
배송지 관리
-
- -
결제수단 관리
-
- -
1:1 문의
-
-
+
+ +
주문내역조회
+ {" "} +
+ +
회원정보 수정
+ {" "} +
+ +
배송지 관리
+ {" "} +
+ +
결제수단 관리
+ {" "} +
+ +
1:1 문의
+ {" "} +
+
+
-
-
-
-
+
+
+
+
회원정보 수정
-
-
-
-
-
기존 비밀번호
-
-

- {oldPassword.length > 0 && ( - - {passwordMessage} - - )} -
+
+
+ +
+
기존 비밀번호
+
+ { + setOldPassword(e.target.value); + }} + />
-
-
새 비밀번호
-
-

- {newPassword.length > 0 && ( - - {passwordConfirmMessage} - - )} -
+
+
+
새 비밀번호
+
+ { + setNewPassword(e.target.value); + }} + />
-
-
닉네임 변경
-
-

- {displayName.length > 0 && ( - - {nameMessage} - - )} -
+
+
+
닉네임 변경
+
+ { + setDisplayName(e.target.value); + }} + />
-
-
프로필 이미지
-
- {/* */} - {/* +
+
+
프로필 이미지
+
+ {/* */} + {/* // */} - {setProfileImgBase64(e.target.value)}} - /> -
+ { + const files = e.target.files; + console.log("111111", e.target.files); + //console.log("files:", files); + var reader = new FileReader(); + reader.onload = function (upload) { + if (upload.target != null) { + console.log( + "asd:", + upload.target.result?.toString() + ); + setProfileImgBase64( + upload.target.result + ? upload.target.result.toString() + : "" + ); + } + }; + if (files != null) { + reader.readAsDataURL(files[0]); + } + //setProfileImgBase64(files); + + console.log("profileImgBase64:", profileImgBase64); + }} + /> + {/* +
-
-
- {/* */} - -
+
+
+
+
- -
- +
+
- - -
- -
- - - ) +
+ + ); } -export default UserInfo +export default UserInfo; From 124a878c02cd32358ce92cd2fa375a3ddd831a72 Mon Sep 17 00:00:00 2001 From: moon daehyun Date: Mon, 19 Jun 2023 23:12:10 +0900 Subject: [PATCH 27/75] test: push test --- src/Common/Form/Signin/join.tsx | 2 +- src/Components/Views/MyPage/UserInfo copy.tsx | 226 ++++++++++++++++++ 2 files changed, 227 insertions(+), 1 deletion(-) create mode 100644 src/Components/Views/MyPage/UserInfo copy.tsx diff --git a/src/Common/Form/Signin/join.tsx b/src/Common/Form/Signin/join.tsx index 923eeca0..f8b6d669 100644 --- a/src/Common/Form/Signin/join.tsx +++ b/src/Common/Form/Signin/join.tsx @@ -22,7 +22,7 @@ function Join() { //오류 메세지 저장 const [nameMessage, setNameMessage] = useState(""); - const [emailMessage, setEmailMessage] = useState(""); + const [emailMessage, setEmailMessage] = useState(""); const [passwordMessage, setPasswordMessage] = useState(""); const [passwordConfirmMessage, setPasswordConfirmMessage] = useState(""); diff --git a/src/Components/Views/MyPage/UserInfo copy.tsx b/src/Components/Views/MyPage/UserInfo copy.tsx new file mode 100644 index 00000000..84c5b6e8 --- /dev/null +++ b/src/Components/Views/MyPage/UserInfo copy.tsx @@ -0,0 +1,226 @@ +import { FormEvent, useState, useEffect, ChangeEvent, useCallback, useRef } from "react"; +import axios from "axios"; +import { Link, useNavigate } from "react-router-dom"; +import "./UserInfo.scss"; +import { ReadStream } from "fs"; + +interface User { + displayName: string // 사용자 표시 이름 + profileImg: string // 사용자 프로필 이미지 URL +} + +function UserInfo() { + + // 이름 , 프로필사진 , 구 비밀번호 , 새 비밀번호 + const [user, setUser] =useState({} as User) + const [displayName, setDisplayName] = useState({} as User); // {} as User + // const [profileImgBase64, setProfileImgBase64] = useState(""); + const [oldPassword, setOldPassword] = useState(""); + const [newPassword, setNewPassword] = useState(""); + + const [profileImg, setProfileImg] = useState(""); + + + + + + async function Image(event: Event) { + const files = (event.target as HTMLInputElement).files as FileList + for (const file of files) { + const reader = new FileReader() + reader.readAsDataURL(file) + reader.addEventListener('load', e=> { + setProfileImg((e.target as FileReader).result as string) + }) + } + + + // const d = await fetch("https://asia-northeast3-heropy-api.cloudfunctions.net/api/auth/user", { + // method:'PUT', + // headers:{ + // Authorization:`Bearer ${localStorage.getItem("token")}`, + // "Content-Type": "application/json", + // apikey: "KDT5_nREmPe9B", + // username: "KDT5_TeamWink", + // } + // }) + // const json = await res.json() + // console.log(json) + + + + return ( + <> +
+
+ My Page +
+ + + + + {/* */} + + {/*
*/} +
+
+

{displayName.displayName}

+
+
+
+
+ +
주문내역조회
+ {" "} +
+ +
회원정보 수정
+ {" "} +
+ +
배송지 관리
+ {" "} +
+ +
결제수단 관리
+ {" "} +
+ +
1:1 문의
+ {" "} +
+
+
+ +
+
+
+
+
회원정보 수정
+
+
+
+
+
기존 비밀번호
+
+ { + setOldPassword(e.target.value); + }} + /> +
+
+
+
새 비밀번호
+
+ { + setNewPassword(e.target.value); + }} + /> +
+
+
+
닉네임 변경
+
+ {/* { + setDisplayName(e.target.value); + }} + /> */} +
+
+
+
프로필 이미지
+
+ + + + + {/* { + const files = e.target.files; + // console.log("111111", e.target.files); + // console.log("files:", files); + var reader = new FileReader(); + reader.onload = function (upload) { + if (upload.target != null) { + console.log( + // "asd:", + upload.target.result?.toString() + ); + setProfileImgBase64( + upload.target.result + ? upload.target.result.toString() + : "" + ); + } + }; + if (files != null) { + reader.readAsDataURL(files[0]); + } + // setProfileImgBase64(files); + // console.log("profileImgBase64:", profileImgBase64); + }} + /> */} + +
+ + + +
+
+
+ +
+
+
+
+
+
+
+
+ + ); +} + +export default UserInfo; From 651081274c3f469bc59a30d39d5d0760d9b6ebbc Mon Sep 17 00:00:00 2001 From: hahahaday12 Date: Mon, 19 Jun 2023 23:12:14 +0900 Subject: [PATCH 28/75] =?UTF-8?q?style:=20=EC=B1=85=EA=B0=88=ED=94=BC=20?= =?UTF-8?q?=EC=9D=B4=EB=AF=B8=EC=A7=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/images/pick.png | Bin 0 -> 3165 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 public/images/pick.png diff --git a/public/images/pick.png b/public/images/pick.png new file mode 100644 index 0000000000000000000000000000000000000000..00fbbb42c98acbe9b75914d9b969a9af3c19408d GIT binary patch literal 3165 zcmeAS@N?(olHy`uVBq!ia0vp^*BKa?i#gbUEGvoL3qXpqz$3Dlfq`2Xgc%uT&5-~K zG8PB9J29*~C-V}>VM%xNb!1@J*w6hZkrk-wlc$SgNCo5DyS{xPp$u&ggO?UQIH9_O zrCgz}w@dqg>;sR-9x{@$C;3uXx7iFbuypMA^P_4lnw!`f(m1x3A%4sNAKO&vQFlt!7O;V_yAMl-``NibR>j#dYw)#3E&0mtaL1p$-E8FPhldrPJ->JMPKd%Sq5C3EXbuTYme{^v=<^A54=G}kV(8~YjbkpcGpuU-z zC*Lzh2E~MRaYsKY{P*thrl6dgL3+!}MX&$#S{tt3{^K9#w8ZP#WjhOZzDad2+n6?8 zaQf*uvByUHp9YCfpPF<~?{TzVuJyXj9cI(_^5;itese9g+&g!N&7>oYH@-dnvij&# ziMh;MdrfzH0Ijo>TK`FI!q37;&AvN}-Pc}w{kpjSbG*p(sZIZ9R9pUivtv&^Q(EP{ zr(gCzF1pDr{$-76wD10!&$Ca*-I%w3|I Date: Mon, 19 Jun 2023 23:12:49 +0900 Subject: [PATCH 29/75] test: push test --- .gitignore | 1 + src/Components/Views/MyPage/MyPage.tsx | 5 +- src/Components/Views/MyPage/UserInfo.scss | 1 - src/Components/Views/MyPage/UserInfo.tsx | 496 +++++++++++----------- src/Components/Views/MyPage/UserInfo1.tsx | 236 ++++++++++ src/routes/routes.tsx | 2 +- 6 files changed, 478 insertions(+), 263 deletions(-) create mode 100644 src/Components/Views/MyPage/UserInfo1.tsx diff --git a/.gitignore b/.gitignore index a547bf36..7ceb59f8 100644 --- a/.gitignore +++ b/.gitignore @@ -22,3 +22,4 @@ dist-ssr *.njsproj *.sln *.sw? +.env diff --git a/src/Components/Views/MyPage/MyPage.tsx b/src/Components/Views/MyPage/MyPage.tsx index f891ab3f..d48065c3 100644 --- a/src/Components/Views/MyPage/MyPage.tsx +++ b/src/Components/Views/MyPage/MyPage.tsx @@ -21,10 +21,10 @@ function MyPage () {
- +
주문내역조회

- +
회원정보 수정

@@ -44,7 +44,6 @@ function MyPage () {
-
구매 내역
diff --git a/src/Components/Views/MyPage/UserInfo.scss b/src/Components/Views/MyPage/UserInfo.scss index d341501d..78e3919e 100644 --- a/src/Components/Views/MyPage/UserInfo.scss +++ b/src/Components/Views/MyPage/UserInfo.scss @@ -27,7 +27,6 @@ border: solid 1px rgb(221,221,221); border-radius: 50%; box-shadow: 2px 5px 5px rgb(0,0,0,.3); - background-image: url(./59932b0eb046f9fa3e063b8875032edd_crop.jpeg); background-position: center; background-size: contain; background-repeat: no-repeat; diff --git a/src/Components/Views/MyPage/UserInfo.tsx b/src/Components/Views/MyPage/UserInfo.tsx index d8f82afb..d2f85b02 100644 --- a/src/Components/Views/MyPage/UserInfo.tsx +++ b/src/Components/Views/MyPage/UserInfo.tsx @@ -1,295 +1,275 @@ -import { FormEvent, useState, useEffect, ChangeEvent, useCallback, useRef } from 'react'; -import axios from 'axios'; -import { Link, useNavigate } from 'react-router-dom'; -import './UserInfo.scss' -import { NONAME } from 'dns'; +import { FormEvent, useState, useEffect, ChangeEvent, useCallback, useRef } from "react"; +import axios from "axios"; +import { Link, useNavigate } from "react-router-dom"; +import "./UserInfo.scss"; +import { ReadStream } from "fs"; -function UserInfo () { - const navigate = useNavigate(); +type ResponseValue = User[] - // 이름 , 프로필사진 , 구 비밀번호 , 새 비밀번호 - const [displayName, setDisplayName] = useState(''); - const [profileImgBase64, setProfileImgBase64] = useState(''); - const [oldPassword, setOldPassword] = useState(''); - const [newPassword, setNewPassword] = useState(''); - //비밀번호 유효성 검사 - const [isName, setIsName] = useState(false); - const [isOldPassword, setIsOldPassword] = useState(false); - const [isNewPasswordConfirm, setIsNewPasswordConfirm] = useState(false); +interface User { + displayName: string // 사용자 표시 이름 + profileImg: string // 사용자 프로필 이미지 URL +} - //오류 메세지 저장 - const [nameMessage, setNameMessage] = useState(''); - const [passwordMessage, setPasswordMessage] = useState(''); - const [passwordConfirmMessage, setPasswordConfirmMessage] = useState(''); +function UserInfo() { + const navigate = useNavigate(); + // 이름 , 프로필사진 , 구 비밀번호 , 새 비밀번호 + const [user, setUser] =useState({} as User) + const [displayName, setDisplayName] = useState({} as User); // {} as User + // const [profileImgBase64, setProfileImgBase64] = useState(""); + const [oldPassword, setOldPassword] = useState(""); + const [newPassword, setNewPassword] = useState(""); - async function submit(e) { - e.preventDefault(); + const [profileImg, setProfileImg] = useState(""); + - alert('수정완료'); - if (res.accessToken) { - alert("가입되었습니다."); - //localStorage.setItem('token', res.accessToken); - navigate("/login"); - } else { - alert("가입에 실패했습니다. 다시 시도해주세요."); - } + async function submit(e: any) { + e.preventDefault(); try { - const res = await axios.put('https://asia-northeast3-heropy-api.cloudfunctions.net/api/auth/user', { - displayName: displayName, // 새로운 표시 이름 - profileImgBase64: profileImgBase64, // 사용자 프로필 이미지(base64) - jpg, jpeg, webp, png, gif, svg - oldPassword: oldPassword, // 기존 비밀번호 - newPassword: newPassword // 새로운 비밀번호 - }, { - headers: { - Authorization: `Bearer ${localStorage.getItem('token')}`, - 'Content-Type': 'application/json', - apikey: 'KDT5_nREmPe9B', - username: 'KDT5_TeamWink', - } - }) - }catch(err){ - console.log(err) + const res = await axios.put("https://asia-northeast3-heropy-api.cloudfunctions.net/api/auth/user", + { + displayName: displayName, // 새로운 표시 이름 + profileImgBase64: profileImg, + // profileImgBase64: profileImgBase64, // 사용자 프로필 이미지(base64) - jpg, jpeg, webp, png, gif, svg + oldPassword: oldPassword, // 기존 비밀번호 + newPassword: newPassword, // 새로운 비밀번호 + }, + { + headers: { + Authorization: `Bearer ${localStorage.getItem("token")}`, + "Content-Type": "application/json", + //"Content-Type": "multipart/form-data", + apikey: "KDT5_nREmPe9B", + username: "KDT5_TeamWink", + }, + }, + ); + // console.log("res:", res.data); + alert("수정완료"); + } catch (err) { + console.error("error"); + alert("수정 실패"); } } - const onChangeName = useCallback((e: React.ChangeEvent) => { - setDisplayName(e.target.value); - if (e.target.value.length < 2 || e.target.value.length > 21) { - setNameMessage('2글자 이상 21글자 미만으로 입력해주세요.'); - setIsName(false); - } else { - setNameMessage('올바른 이름 형식입니다 '); - setIsName(true); - } - }, []); + // async function file(e: any) { + // e.preventDefault(); + // const res = await fetch("https://asia-northeast3-heropy-api.cloudfunctions.net/api/auth/user", { + // method:'PUT', + // headers:{ + // Authorization:`Bearer ${localStorage.getItem("token")}`, + // "Content-Type": "application/json", + // apikey: "KDT5_nREmPe9B", + // username: "KDT5_TeamWink", + // } + // }) + // const json = await res.json() + // console.log(json) + // } - const onChangePassword = useCallback( - (e: React.ChangeEvent) => { - const passwordCurrent = e.target.value; - setOldPassword(passwordCurrent); - if (!PwCheck(passwordCurrent)) { - setPasswordMessage('8자리 이상 입력해주세요.'); - setIsOldPassword(false); - } else { - setPasswordMessage('안전한 비밀번호에요 '); - setIsOldPassword(true); - } - }, - [oldPassword] - ); + async function Image(event: Event) { + const files = (event.target as HTMLInputElement).files as FileList + for (const file of files) { + const reader = new FileReader() + reader.readAsDataURL(file) + reader.addEventListener('load', e=> { + setProfileImg((e.target as FileReader).result as string) + }) + } - const onChangePasswordConfirm = ( - password: any, - confirmPassword: any, - setPasswordConfirmMessage: any, - setIsPasswordConfirm: any - ) => { - if (password === confirmPassword) { - setPasswordConfirmMessage('비밀번호를 똑같이 입력했어요.'); - setIsPasswordConfirm(true); - } else { - setPasswordConfirmMessage('비밀번호가 틀립니다. 다시 입력해주세요.'); - setIsPasswordConfirm(false); - } - }; - const onPasswordConfirmChange = useCallback( - (e: React.ChangeEvent) => { - const passwordConfirmCurrent = e.target.value; - setNewPassword(passwordConfirmCurrent); - onChangePasswordConfirm( - oldPassword, - passwordConfirmCurrent, - setPasswordConfirmMessage, - setIsNewPasswordConfirm - ); - }, - [oldPassword] - ); + // const d = await fetch("https://asia-northeast3-heropy-api.cloudfunctions.net/api/auth/user", { + // method:'PUT', + // headers:{ + // Authorization:`Bearer ${localStorage.getItem("token")}`, + // "Content-Type": "application/json", + // apikey: "KDT5_nREmPe9B", + // username: "KDT5_TeamWink", + // } + // }) + // const json = await res.json() + // console.log(json) + } - // const setProfileImgBase64 = async (e: React.ChangeEvent) => { - // e.preventDefault(); - - // if(e.target.files){ - // const uploadFile = e.target.files[0] - // const formData = new FormData() - // formData.append('files',uploadFile) - - // await axios({ - // method: 'post', - // url: '/api/files/images', - // data: formData, - // headers: { - // 'Content-Type': 'multipart/form-data', - // }, - // }); - // } - // } - // if(e.target.files){ - // const uploadFile = e.target.files[0] - // console.log(uploadFile) + return ( + <> +
+
+ My Page +
+ + + + + {/* */} - // const setProfileImgBase64 = (e: React.ChangeEvent) => { - // e.preventDefault(); - - // if(e.target.files){ - // const uploadFile = e.target.files[0] - // const formData = new FormData() - // formData.append('files',uploadFile) - // } - // } - - return( - <> -
-
- My Page -
-
-
-
-

닉네임{displayName}

-
- {/*
-
-

자기소개

-
-
*/} + {/*
*/} +
+
+

{displayName.displayName}

-
- -
주문내역조회
-
- -
회원정보 수정
-
- -
배송지 관리
-
- -
결제수단 관리
-
- -
1:1 문의
-
-
+
+ +
주문내역조회
+ {" "} +
+ +
회원정보 수정
+ {" "} +
+ +
배송지 관리
+ {" "} +
+ +
결제수단 관리
+ {" "} +
+ +
1:1 문의
+ {" "} +
+
+
-
-
-
-
+
+
+
+
회원정보 수정
-
-
-
-
-
기존 비밀번호
-
-

- {oldPassword.length > 0 && ( - - {passwordMessage} - - )} -
-
-
-
새 비밀번호
-
-

- {newPassword.length > 0 && ( - - {passwordConfirmMessage} - - )} -
+
+
+ +
+
기존 비밀번호
+
+ { + setOldPassword(e.target.value); + }} + />
-
-
닉네임 변경
-
-

- {displayName.length > 0 && ( - - {nameMessage} - - )} -
+
+
+
새 비밀번호
+
+ { + setNewPassword(e.target.value); + }} + />
-
-
프로필 이미지
-
- {/* */} - {/* - // */} - {setProfileImgBase64(e.target.value)}} - /> - -
+
+
+
닉네임 변경
+
+ {/* { + setDisplayName(e.target.value); + }} + /> */}
-
-
- {/* */} - -
+
+
+
프로필 이미지
+
+ + + + + {/* { + const files = e.target.files; + // console.log("111111", e.target.files); + // console.log("files:", files); + var reader = new FileReader(); + reader.onload = function (upload) { + if (upload.target != null) { + console.log( + // "asd:", + upload.target.result?.toString() + ); + setProfileImgBase64( + upload.target.result + ? upload.target.result.toString() + : "" + ); + } + }; + if (files != null) { + reader.readAsDataURL(files[0]); + } + // setProfileImgBase64(files); + // console.log("profileImgBase64:", profileImgBase64); + }} + /> */} +
- -
+ + +
+
+
+ +
+
+
-
- -
- - - ) +
+ + ); } -export default UserInfo +export default UserInfo; diff --git a/src/Components/Views/MyPage/UserInfo1.tsx b/src/Components/Views/MyPage/UserInfo1.tsx new file mode 100644 index 00000000..74b6f241 --- /dev/null +++ b/src/Components/Views/MyPage/UserInfo1.tsx @@ -0,0 +1,236 @@ +import { FormEvent, useState, useEffect, ChangeEvent, useCallback, useRef } from 'react'; +import axios from 'axios'; +import { Link, useNavigate } from 'react-router-dom'; +import './UserInfo.scss' +import { NONAME } from 'dns'; +import { refreshToken } from '@/Apis/Token/token'; + +function UserInfo () { + const navigate = useNavigate(); + + + // 이름 , 프로필사진 , 구 비밀번호 , 새 비밀번호 + const [displayName, setDisplayName] = useState(''); + const [profileImgBase64, setProfileImgBase64] = useState(''); + const [oldPassword, setOldPassword] = useState(''); + const [newPassword, setNewPassword] = useState(''); + + + async function submit(e) { + e.preventDefault(); + + // const formData = new FormData(); + // formData.append("photo", files.length && files[0].uploadedFile); + // formData.append("comment", commentValue); + // formData.append("content_id", classData.content_id); + + // await axios({ + // method: "put", + // url: process.env.REACT_APP_STREAMING_COMMENT_URL, //환경변수 + // data: formData, + // headers: { "Content-Type": "multipart/form-data", Authorization: `Bearer ${localStorage.getItem('token')}` } + // }); + // setCommentValue(""); + // setFiles([]); + // }; + + // const handleUpload = (e) => { + // e.preventDefault(); + // const file = e.target.files[0]; + // setFiles([...files, { uploadedFile: file }]); + // }; + + + try { + const res = await axios.put('https://asia-northeast3-heropy-api.cloudfunctions.net/api/auth/user', { + displayName: displayName, // 새로운 표시 이름 + // profileImgBase64: profileImgBase64, // 사용자 프로필 이미지(base64) - jpg, jpeg, webp, png, gif, svg + oldPassword: oldPassword, // 기존 비밀번호 + newPassword: newPassword, // 새로운 비밀번호 + },{ + headers: { + Authorization: `Bearer ${localStorage.getItem('token')}`, + 'Content-Type': 'application/json', + // 'Content-Type': 'multipart/form-data', + apikey: 'KDT5_nREmPe9B', + username: 'KDT5_TeamWink', + } + }) + alert('수정완료'); + // console.log("res:",res) + }catch(err){ + console.error('error'); + alert('수정 실패'); + } + } + + + const onChangeImg = async (e: React.ChangeEvent) => { + e.preventDefault(); + + if(e.target.files){ + const uploadFile = e.target.files[0] + const formData = new FormData() + formData.append('files',uploadFile) + + await axios({ + url: 'https://asia-northeast3-heropy-api.cloudfunctions.net/api/auth/user', + method: 'put', + headers: { + Authorization: `Bearer ${localStorage.getItem('token')}`, + 'Content-Type': 'multipart/form-data', + apikey: 'KDT5_nREmPe9B', + username: 'KDT5_TeamWink', + }, + data: { + profileImgBase64: profileImgBase64, // 사용자 프로필 이미지(base64) - jpg, jpeg, webp, png, gif, svg + formData, + } + }); + } + } + + + // const goToMyPage = () => { + // navigate("/MyPage"); + // } + + return( + <> +
+
+ My Page +
+ + + + {/*
*/} +
+
+

{displayName}

+
+
+
+
+ +
주문내역조회
+
+ +
회원정보 수정
+
+ +
배송지 관리
+
+ +
결제수단 관리
+
+ +
1:1 문의
+
+
+
+ +
+
+
+
+
회원정보 수정
+
+
+
+
+
기존 비밀번호
+
+ {setOldPassword(e.target.value)}} + /> +
+
+
+
새 비밀번호
+
+ {setNewPassword(e.target.value)}} + /> +
+
+
+
닉네임 변경
+
+ {setDisplayName(e.target.value)}} + /> +
+
+
+
프로필 이미지
+
+ {/* */} + {/* + // */} + {setProfileImgBase64(e.target.value)}} + /> + {/* +
+
+
+
+ +
+
+ + + +
+
+
+
+
+ + ) +} + + + + + +export default UserInfo diff --git a/src/routes/routes.tsx b/src/routes/routes.tsx index c60c6d86..44fefc9a 100644 --- a/src/routes/routes.tsx +++ b/src/routes/routes.tsx @@ -40,7 +40,7 @@ function RoutesPage() { element={} status={""} />} /> } status={""} />} /> {/* }/> */} From 5cf6ad384c6e0db805b5c90d375d97ad7a54f5d3 Mon Sep 17 00:00:00 2001 From: hahahaday12 Date: Mon, 19 Jun 2023 23:14:13 +0900 Subject: [PATCH 30/75] =?UTF-8?q?feat:=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=EC=82=AC=ED=95=AD=20update?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 메인 페이지 추천도서 기능 추가 - 스타일 추가 수정 --- src/Apis/productApi.ts | 3 +- src/Common/Layout/Footer/footer.scss | 5 +- .../Views/CartPage/CartItems/CartItems.scss | 5 +- .../Views/CartPage/CartItems/CartItems.tsx | 14 +- src/Components/Views/CartPage/CartPage.scss | 12 -- src/Components/Views/CartPage/CartPage.tsx | 23 +-- .../Views/CartPage/CartRent/CartRent.tsx | 145 +++++++++++------- .../Views/CartPage/Payment/Payment.tsx | 41 ++++- .../Views/DetailPage/DetailPage.scss | 1 - .../Views/DetailPage/DetailPage.tsx | 43 +++--- .../Views/MainPage/Component/BookInfo.scss | 53 +++++-- .../Views/MainPage/Component/BookInfo.tsx | 16 +- .../Views/MainPage/Component/Genre.scss | 28 +--- .../Views/MainPage/Component/Genre.tsx | 14 -- .../Views/MainPage/Component/Main.tsx | 9 +- .../Views/MainPage/Component/Recommand.scss | 112 ++++---------- .../Views/MainPage/Component/Recommand.tsx | 49 +++--- src/Components/Views/MainPage/MainPage.scss | 71 +++++---- src/Components/Views/MyPage/MyPage.tsx | 40 +++-- src/Components/Views/MyPage/UserInfo.scss | 3 - 20 files changed, 357 insertions(+), 330 deletions(-) diff --git a/src/Apis/productApi.ts b/src/Apis/productApi.ts index b795b625..ba177b00 100644 --- a/src/Apis/productApi.ts +++ b/src/Apis/productApi.ts @@ -11,11 +11,12 @@ const ajax = axios.create({ }, }); -export async function getList(category: number) { +export async function getList(category?: number, product_no:string) { try { const { data } = await ajax.get('/products', { params: { category: category, + product_no : product_no }, }); //console.log(data.products); diff --git a/src/Common/Layout/Footer/footer.scss b/src/Common/Layout/Footer/footer.scss index b0af685a..06d4db67 100644 --- a/src/Common/Layout/Footer/footer.scss +++ b/src/Common/Layout/Footer/footer.scss @@ -1,8 +1,7 @@ - footer { background-color: #f6f4ef; padding-bottom: 100px; - width: 100%; + position: relative; .Footer-inner { display: flex; @@ -14,6 +13,7 @@ footer { .wrap { display: flex; flex-direction: column; + position: relative; justify-content: center; align-items: center; margin-top: 20px; @@ -41,7 +41,6 @@ footer { font-size: 25px; width: 400px; height: 40px; - //background-color: red; margin: 0 auto; left: 0; right: 0; diff --git a/src/Components/Views/CartPage/CartItems/CartItems.scss b/src/Components/Views/CartPage/CartItems/CartItems.scss index 67c92e13..d8e01efa 100644 --- a/src/Components/Views/CartPage/CartItems/CartItems.scss +++ b/src/Components/Views/CartPage/CartItems/CartItems.scss @@ -46,7 +46,6 @@ right: 120px; } - .ItemsContainer { width: 1300px; top: 50px; @@ -113,9 +112,7 @@ position: absolute; right: 370px; background-color: olivedrab; - font-size: 15px; - - + font-size: 15px; } .CartButtonBox{ diff --git a/src/Components/Views/CartPage/CartItems/CartItems.tsx b/src/Components/Views/CartPage/CartItems/CartItems.tsx index 595d1fee..1eb8795c 100644 --- a/src/Components/Views/CartPage/CartItems/CartItems.tsx +++ b/src/Components/Views/CartPage/CartItems/CartItems.tsx @@ -15,13 +15,13 @@ interface BuyItem { interface CartItemsProps { check: number[]; - pitem: any; - setItems:any; + pitem: string; + setItems:string; } const CartItems = ({ check, pitem, setItems }: CartItemsProps) => { - const [info, setInfo] = useState([]); + const [buyItem, setbuyItem] = useState([]); const [checkedItems, setCheckedItems] = useState(check); @@ -136,9 +136,10 @@ const CartItems = ({ check, pitem, setItems }: CartItemsProps) => {
- {buyItem.map((el, index) => ( -
- {/* 아이템 체크 하는 부분 */} + {buyItem + .filter(el => el.gubun === 'buy') + .map((el, index) => ( +
{children(el, index)}
cartbookimage @@ -155,6 +156,7 @@ const CartItems = ({ check, pitem, setItems }: CartItemsProps) => {
+ ))}
diff --git a/src/Components/Views/CartPage/CartPage.scss b/src/Components/Views/CartPage/CartPage.scss index ef9ee825..e19d934a 100644 --- a/src/Components/Views/CartPage/CartPage.scss +++ b/src/Components/Views/CartPage/CartPage.scss @@ -5,9 +5,6 @@ top: 10px; } -@mixin TableStyle { -} - // 장바구니 전체 레이아웃 .CartPage-AllLayout { //font-family: 'SUITE-Regular'; @@ -41,8 +38,6 @@ .CartPageTable { position: relative; width: 1200px; - //padding-bottom: 520px; - //background-color: #7fe41f; margin: 0 auto; left: 0; right: 0; @@ -62,10 +57,8 @@ display: flex; justify-content: center; width: inherit; - //height: 500px; padding-bottom: 50px; top: 640px; - //background-color: rgb(207, 119, 245); } .BuyText { @@ -79,7 +72,6 @@ .BuyContainer { position: absolute; - //justify-content: center; width: inherit; padding-bottom: 200px; bottom: 10px; @@ -89,12 +81,8 @@ width: 500px; position: absolute; height: 100px; - //margin: 0 auto; left: 100px; - //right: 0; - //background-color: wheat; border-bottom: 2px solid black; - //bottom: 100px; .Buy-Container { width: 250px; diff --git a/src/Components/Views/CartPage/CartPage.tsx b/src/Components/Views/CartPage/CartPage.tsx index edd268b1..a7700d96 100644 --- a/src/Components/Views/CartPage/CartPage.tsx +++ b/src/Components/Views/CartPage/CartPage.tsx @@ -5,26 +5,15 @@ import RentalItems from "./CartRent/CartRent"; import Payment from "./Payment/Payment"; function CartPage() { - // const [rentalbook, setRentalBook] = useState([ - // { id: 1, name: '[국내도서]시작하세요! C# 10프로그래밍', text:"*밤 11시 잠들기전 배송", - // price:"정가: 36000", sale:"판매가:32,400", malize:"마일리지: 1,800원"}, - // ]) - - // const BuyProducts = () => { - // alert("주문완료!") - // } + const [CartItemsValue, setCartItemsValue] = useState([]); - const [selectedItem, setSelectedItem] = useState([]); + const [selectedItem, setSelectedItem] = useState([]); const [Total, setTotal] = useState(0); const [ShowTotal, setShowTotal] = useState(false); const [RentalItemsValue, setRentalItemsValue] = useState([]); - // useEffect(() => { - // console.log(CartItemsValue + "k"); - // console.log(selectedItem); - // }, [CartItemsValue]); useEffect(() => { calculateTotal(); @@ -61,7 +50,11 @@ function CartPage() { {/* 여기에서는 대여 부분 */} 대여
- +
결제 @@ -83,7 +76,7 @@ function CartPage() {
{/* */} - +
diff --git a/src/Components/Views/CartPage/CartRent/CartRent.tsx b/src/Components/Views/CartPage/CartRent/CartRent.tsx index 4d309b06..a0e532ee 100644 --- a/src/Components/Views/CartPage/CartRent/CartRent.tsx +++ b/src/Components/Views/CartPage/CartRent/CartRent.tsx @@ -1,5 +1,5 @@ import React from "react" -import { useState } from "react"; +import { useState, useEffect } from "react"; import Box from '@mui/material/Box'; import Checkbox from '@mui/material/Checkbox'; import FormControlLabel from '@mui/material/FormControlLabel'; @@ -7,57 +7,85 @@ import FormControlLabel from '@mui/material/FormControlLabel'; // import './CartItems.scss' import './CartRent.scss' -function RentalItems() { - interface Item { + + interface RentItem { id: number; - // image:string; - name: string; - text: string; - rentprice: string; - day:string; + product_name: string; + price: number; + detail_image: string; + product_no: number; } - - const [checked, setChecked] = useState([true, false]); - const [items, setItems] = useState([ - { id: 1, name: '[국내도서]코어 자바스크립트', text:"*+2추가 대여 이벤트 진행", - rentprice:"대여가: 18000", day:"7일"}, - { id: 2, name: '[국내도서]코어 자바스크립트', text:"*+2추가 대여 이벤트 진행", - rentprice:"대여가: 18000", day:"7일"}, - { id: 3, name: '[국내도서]코어 자바스크립트', text:"*+2추가 대여 이벤트 진행", - rentprice:"대여가: 18000", day:"7일"}, - { id: 4, name: '[국내도서]코어 자바스크립트', text:"*+2추가 대여 이벤트 진행", - rentprice:"대여가: 18000", day:"7일"}, + + interface CartItemsProps { + check: number[]; + pitem: string; + setItems:string; + + } + + const RentalItems = ({ check, pitem, setItems }: CartItemsProps) => { - ]); - const [checkedItems, setCheckedItems] = useState([]); + const [buyItem, setbuyItem] = useState([]); + const [checkedItems, setCheckedItems] = useState(check); - const handleChange1 = (event: React.ChangeEvent) => { - const checkedValue = event.target.checked; - const updatedCheckedItems = checkedValue ? items.map((item) => item.id) : []; - setCheckedItems(updatedCheckedItems); - }; + useEffect(() => { + BuyCart(); + }, []); - const handleChange2 = (event: React.ChangeEvent) => { - const itemId = parseInt(event.target.name); - let updatedCheckedItems: number[] = []; - - if (event.target.checked) { - updatedCheckedItems = [...checkedItems, itemId]; - } else { - updatedCheckedItems = checkedItems.filter((id) => id !== itemId); + const BuyCart = () => { + const BuyItems = JSON.parse(localStorage.getItem("cart")) || []; + setbuyItem(BuyItems); + console.log(BuyItems) } - setCheckedItems(updatedCheckedItems); - }; - const children = (itemId: number) => ( - - } - /> - - ); + const handleChange1 = (event: React.ChangeEvent) => { + const checkedValue = event.target.checked; + const updatedCheckedItems = checkedValue + ? buyItem.map((item) => item.id) + : []; + setCheckedItems(updatedCheckedItems); + }; + + const handleChange2 = (el: any) => (event: React.ChangeEvent) => { + console.log(el); + const itemId = parseInt(event.target.name); + let updatedCheckedItems: number[] = []; + let updatedItems: any[] = []; + if (event.target.checked) { + console.log(itemId) + updatedCheckedItems = [...checkedItems, itemId]; + updatedItems = [...pitem , el]; + } else { + updatedCheckedItems = checkedItems.filter((id) => id !== itemId); + updatedItems = pitem.filter((key) => key.product_no !== el.product_no); + } + console.log(updatedCheckedItems) + setItems(updatedItems); + setCheckedItems(updatedCheckedItems); + //setCheck(updatedCheckedItems); + }; + + const children = (el:any ,index:number) => ( + + + } + /> + + ); return( @@ -69,8 +97,8 @@ function RentalItems() {
0 && checkedItems.length < items.length} + checked={checkedItems.length === buyItem.length} + indeterminate={checkedItems.length > 0 && checkedItems.length < buyItem.length} onChange={handleChange1} />
@@ -91,32 +119,31 @@ function RentalItems() {
- {items.map((item) => ( -
-
- {children(item.id)} + {buyItem + .filter(el => el.gubun === 'rent') + .map((el,index) => ( +
+
+ {children(el, index)}
-
- cartbookimage +
+ cartbookimage
- {item.name} - {item.text} + {el.name}
- {item.rentprice} + {Number(el.price).toFixed(0)}원
-
- {/* {item.day}
*/} - 135일 + {el.rentdate}
))} -
+
) } diff --git a/src/Components/Views/CartPage/Payment/Payment.tsx b/src/Components/Views/CartPage/Payment/Payment.tsx index eba2dd4a..4c309b27 100644 --- a/src/Components/Views/CartPage/Payment/Payment.tsx +++ b/src/Components/Views/CartPage/Payment/Payment.tsx @@ -1,6 +1,14 @@ import { useEffect } from "react"; -const Payment = () => { +export interface PaymentInfo { + amount: number; + productlists : any; +} + +const Payment = ({amount, productlists}:PaymentInfo) => { + const orderNumber = `mid_${new Date().getTime()}`; + console.log(orderNumber); + useEffect(() => { const jquery = document.createElement("script"); jquery.src = "https://code.jquery.com/jquery-1.12.4.min.js"; @@ -14,19 +22,28 @@ const Payment = () => { }; }, []); const onClickPayment = () => { + console.log(productlists); + + const itemName = productlists.map(obj => obj.product_name).join(","); + + console.log(itemName); const { IMP }: any = window; IMP.init("imp36252452"); + const data = { pg: "html5_inicis", // PG사 html5_inicis: KG이니시스, kakaopay: 카카오페이, naverpay: 네이버페이, payco: 페이코 pay_method: "card", // 결제수단 - merchant_uid: `mid_${new Date().getTime()}`, // 주문번호 - amount: 100, // 결제금액 - name: "아임포트 결제 데이터 분석", // 주문명 + merchant_uid: orderNumber, // 주문번호 // 만약 여기에 에세스키 + amount: amount, // 결제금액 + name: `${itemName}`, // 주문명 buyer_name: "김세연", // 구매자 이름 // buyer_tel: "01032752740", // 구매자 전화번호 // 전화번호: 일단 빼고 나중에 추가 시도.. buyer_email: "", // 구매자 이메일 - 작성시 구매창에서 이메일 부분에 들어가있음 + //https://developers.portone.io/docs/ko/api/api-1/api-1 + //productinfos : productlists }; + IMP.request_pay(data, callback); }; @@ -35,6 +52,22 @@ const Payment = () => { if (success) { alert("결제 성공"); + //mypayment [] + //mypayment: [orderNumber1] + let mypayarray = window.localStorage.getItem("mypayment"); + let combinedArray = JSON.parse(mypayarray); + if(!combinedArray){ + //mypayment: [orderNumber1] + window.localStorage.setItem("mypayment",JSON.stringify([orderNumber])); + }else { + ////mypayment: [orderNumber1,orderNumber2] 배열을 다시 추가. + combinedArray.push(orderNumber); + window.localStorage.setItem("mypayment",JSON.stringify(combinedArray)); + } + + + //결제 성공을 하고 성공된 데이터가 로컬스토리지에서 지워져야함. produc_id + } else { alert(`결제 실패: ${error_msg}`); } diff --git a/src/Components/Views/DetailPage/DetailPage.scss b/src/Components/Views/DetailPage/DetailPage.scss index b1e33d44..955005d0 100644 --- a/src/Components/Views/DetailPage/DetailPage.scss +++ b/src/Components/Views/DetailPage/DetailPage.scss @@ -29,7 +29,6 @@ margin: 0 auto; left: 0; right: 0; - //font-family: 'Dovemayo_gothic'; font-family: 'SUITE-Regular'; .ImgContainer{ diff --git a/src/Components/Views/DetailPage/DetailPage.tsx b/src/Components/Views/DetailPage/DetailPage.tsx index e2a73951..f341ba6f 100644 --- a/src/Components/Views/DetailPage/DetailPage.tsx +++ b/src/Components/Views/DetailPage/DetailPage.tsx @@ -1,5 +1,5 @@ import BookCustom from "../../../bookcustom/bookcustom"; -import { useEffect, useState, useRef } from "react"; +import { useEffect, useState} from "react"; import { useParams, useNavigate } from "react-router-dom"; import TopHeader from "./components/TopHeader"; import { getDetail } from "@/Apis/productApi"; @@ -56,41 +56,41 @@ function DetailPage() { }); useEffect(() => { + window.scrollTo(0,0); (async () => { await getDetails(); })(); }, []); - const BuyBook = (detail: any) => { - let Cart = localStorage.getItem("cart"); + const BuyBook = (detail: any, type:string) => { + let Cart = localStorage.getItem('cart'); + if (Cart === null) { Cart = []; } else { Cart = JSON.parse(Cart); } - const datalist = { - buy: [], - rent: [], - }; + if (Cart.some((item) => item.product_no === detail.product_no)) { + alert('이미 장바구니에 담으셨습니다.'); + return false; + } - // if (Cart.some((item) => item.id === detail.id)) { - // alert('이미 장바구니에 담으셨습니다.'); - // } else { + if(type === "rent"){ + detail.rentdate = 7; + } + detail.gubun = type; Cart.push(detail); Cart = new Set(Cart); Cart = [...Cart]; localStorage.setItem("cart", JSON.stringify(Cart)); - datalist.buy = Cart; - console.log(datalist); alert("장바구니에 담겼습니다."); navigate("/cart"); - // } }; + // html 안에 a 링크 이벤트를 막기 위한 함수 const disableLinkClick = (event) => { event.preventDefault(); - // You can add any additional handling here if needed }; const modifiedDescription = detail.description @@ -121,7 +121,7 @@ function DetailPage() {
{detail.product_name} - -단돈 1,000원으로 시작할수 있는 + {/* -단돈 1,000원으로 시작할수 있는 */}

윙크북 {detail.product_name} 전자책 출간일 2023-0505

@@ -143,7 +143,7 @@ function DetailPage() {
판매가 - {detail.price} + {Number(detail.price).toFixed(0)}원
줄거리 @@ -154,11 +154,11 @@ function DetailPage() {
{renderCardPriceItems()}
- - +
@@ -172,8 +172,7 @@ function DetailPage() { {isScrolled ? ( + productPrice={detail.price}/> ) : ( "" )} @@ -182,8 +181,8 @@ function DetailPage() {
+ onClick={disableLinkClick}> +
{/*
북플 BOOKPLE diff --git a/src/Components/Views/MainPage/Component/BookInfo.scss b/src/Components/Views/MainPage/Component/BookInfo.scss index e92cf359..b0f67806 100644 --- a/src/Components/Views/MainPage/Component/BookInfo.scss +++ b/src/Components/Views/MainPage/Component/BookInfo.scss @@ -1,23 +1,58 @@ .Book-container{ - //padding-bottom: 10px; - //height: 500px; - //padding-top: 10px; margin-top: 40px; - //background-color: rgb(127, 188, 242); } .BookInfo-Inner{ position: relative; - //bottom: 240px; width: auto; - bottom: 284px; - padding-bottom: 10px; + bottom: 290px; + height: 120px; padding: 10px; border-radius: 10px; - color: rgb(80, 75, 75); - background-color:#D7C0AE; + color: black; + background-color:#f0d5b7; + box-shadow: 5px 5px 5px #b98563; + + .RoundCircle{ + width: 13px; + height: 13px; + margin: 0 auto; + left: 0; + right: 0; + position: absolute; + border-radius: 50%; + background-color: rgba(255, 254, 253, 0.719); + box-shadow: 2px 2px 5px #5a5958; + } + + .Namebox { + width:160px; + position: relative; + top: 25px; + + span { + width: 150px; + left: 0; + right: 0; + margin: 0 auto; + font-size: 15px; + font-weight: bold; + } + } + + .Main-Pricebox{ + display: flex; + width: auto; + position: relative; + top: 28px; + } + + .retail-price{ + width: 70px; + font-size: 13px; + } } diff --git a/src/Components/Views/MainPage/Component/BookInfo.tsx b/src/Components/Views/MainPage/Component/BookInfo.tsx index 82f9fa2a..a2aa445b 100644 --- a/src/Components/Views/MainPage/Component/BookInfo.tsx +++ b/src/Components/Views/MainPage/Component/BookInfo.tsx @@ -44,18 +44,22 @@ export default function BookInfo({ {productName}
-

{productName}

- +
+
+ {productName} +
{retailPrice === price ? ( -
{price.slice(0, -3)}원
+
{price.slice(0, -3)}원
) : ( -
-
{retailPrice.slice(0, -3)}원
-
{price.slice(0, -3)}원
+
+ {retailPrice.slice(0, -3)}원 + {price.slice(0, -3)}원
)} +
+ ); } diff --git a/src/Components/Views/MainPage/Component/Genre.scss b/src/Components/Views/MainPage/Component/Genre.scss index 9b988ca3..a0b53ed1 100644 --- a/src/Components/Views/MainPage/Component/Genre.scss +++ b/src/Components/Views/MainPage/Component/Genre.scss @@ -6,31 +6,30 @@ } } .left { - background-color: #DFD3C3; - width: 200px; - //background-color: rgb(219, 218, 218); + background-color: #fed19a; + width: 180px; border-top-left-radius: 10px; border-bottom-left-radius: 10px; .tag-box { padding: 30px 10px; color: #555252; + font-size: 15px; } } .right { - //position: absolute; background-color: #FFF3E2; + width: 1030px; display: flex; flex-wrap: wrap; height: 918px; - //padding-bottom: 30px; border-top: 1px solid rgb(219, 218, 218); border-bottom: 1px solid rgb(219, 218, 218); .Top-bookContainer{ position: absolute; height: 50px; - width: 970px; + width: 980px; z-index: 200; margin-left: 10px; margin-top: 370px; @@ -38,31 +37,18 @@ .Bottom-bookContainer{ position: absolute; - width: 970px; + width: 980px; margin-left: 10px; margin-top: 827px; height: 50px; - //bottom: 100px; } - - .book { position: relative; - //display: flex; - width: calc(100% / 5); padding: 0 10px; margin: 30px 0; - //margin-top: 10px; - //background-color: aquamarine; img { - // position: relative; - // margin-top: 100px; - // border-radius: 10px; - // width: 100%; - // height: 230px; - border-radius: 10px; width: 100%; height: 230px; @@ -72,9 +58,7 @@ } h4 { - //margin-top: 100px; margin: 10px 0; - //background-color: aquamarine; } } .hover-description { diff --git a/src/Components/Views/MainPage/Component/Genre.tsx b/src/Components/Views/MainPage/Component/Genre.tsx index 292856b9..c8497ecc 100644 --- a/src/Components/Views/MainPage/Component/Genre.tsx +++ b/src/Components/Views/MainPage/Component/Genre.tsx @@ -1,4 +1,3 @@ -import axios from 'axios'; import { useEffect, useState } from 'react'; import { getList } from '@/Apis/productApi'; import './Genre.scss'; @@ -26,7 +25,6 @@ export default function Genre({ category }: { category: Props }) {

{category.type}

- {/*
tags....
*/}
@@ -35,7 +33,6 @@ export default function Genre({ category }: { category: Props }) { {list && list.map((item) => ( <> - {/* */} - {/*
- -
*/} - {/* {Array.from({ length: 1 }).map((_, index) => ( -
- -
- ))} */} ))} diff --git a/src/Components/Views/MainPage/Component/Main.tsx b/src/Components/Views/MainPage/Component/Main.tsx index f3fb6cef..d76b352a 100644 --- a/src/Components/Views/MainPage/Component/Main.tsx +++ b/src/Components/Views/MainPage/Component/Main.tsx @@ -43,15 +43,18 @@ export default function Main() { return (
- +
-
+
{/* CATEGORY */} {category.map((item) => ( diff --git a/src/Components/Views/MainPage/Component/Recommand.scss b/src/Components/Views/MainPage/Component/Recommand.scss index f722381b..87243300 100644 --- a/src/Components/Views/MainPage/Component/Recommand.scss +++ b/src/Components/Views/MainPage/Component/Recommand.scss @@ -1,97 +1,37 @@ -.recommand { - //border: 2px solid; - //border-radius: 10px; +.Recommand { margin: 100px auto 0; - width: 80%; - overflow: hidden; - //background-color: #56886f; - + width: 90%; + h1 { - border-bottom: 1px solid; - padding-bottom: 10px; - + width: 150px; + padding-bottom: 10px; } } -.recommand-wrapper { - //display: grid; - //grid-template-columns: 2fr 8fr; +.Recommand-wrapper { + width: 100%; display: flex; - flex-wrap: wrap; - justify-content: space-evenly; - gap: 20px; - padding: 20px 0; - background-color: #fff; -} -.test { - width: calc(100% / 4); - height: 150px; - overflow: hidden; + position: relative; + margin-top: 30px; + padding: 30px; + padding-bottom: 85px; + background-color: #ffffff; border-radius: 10px; + border: 3px solid rgb(202, 159, 18); - h3 { - padding: 10px 5px; - text-align: center; - } - p { - padding: 5px; - } - - &:nth-child(1) { - background-color: #3e47bc; - color: #fafffb; - p { - color: #c3c2ea; - } - } - &:nth-child(2) { - background-color: #8edcb4; - color: #000000; - p { - color: #56886f; - } - } - &:nth-child(3) { - background-color: #f8e83b; - color: #000201; - p { - color: #807718; - } - } - &:nth-child(4) { - background-color: #f8ff97; - color: #000004; - p { - color: #9c9f5a; - } - } - &:nth-child(5) { - background-color: #f1eae2; - color: #000000; - p { - color: #94918c; - } - } -} -.title { - border-right: 1px solid; - padding: 10px 10px; - cursor: pointer; - &:not(:last-child) { - border-bottom: 1px solid; + span { + position: absolute; + width: 200px; + padding-bottom: 10px; + margin-top: 10px; } } -.description { +.test { + margin-right: 20px; + width: 220px; + display: inline-block; position: relative; - padding: 5% 5%; - background-color: rgb(254, 246, 243); - - a { - position: absolute; - font-size: 0.8rem; - right: 10%; - bottom: 10%; - &:hover { - color: blue; - } - } + left: 50px; } + + + diff --git a/src/Components/Views/MainPage/Component/Recommand.tsx b/src/Components/Views/MainPage/Component/Recommand.tsx index f0b19231..99f5c723 100644 --- a/src/Components/Views/MainPage/Component/Recommand.tsx +++ b/src/Components/Views/MainPage/Component/Recommand.tsx @@ -1,5 +1,5 @@ import { useEffect, useState } from 'react'; -import { getRecommand } from '@/Apis/productApi'; +import { getRecommand, getList } from '@/Apis/productApi'; import './Recommand.scss'; import { Link } from 'react-router-dom'; @@ -10,43 +10,54 @@ interface RecommandProduct { product_no: number; product_name: string; summary_description: string; + list_image: string; + model_name:string; } export default function Recommand() { + const [list, setList] = useState(); + async function recommand() { try { const res = await getRecommand(); console.log(res.products); setList(res.products); + const productList = res.products.map(obj => obj.product_no).join(",") + return productList; } catch (err) { console.log(err); } } + + async function getItem() { + const productList = await recommand(); + console.log(productList) + const data = await getList(null,productList); + setList(data); + } + useEffect(() => { (async () => { - await recommand(); + await getItem(); })(); }, []); + return ( -
+

추천도서

-
- {list && - list.map((item) => ( - -

{item.product_name}

-

- {item.summary_description.length > 85 - ? item.summary_description.slice(0, 85) + '...' - : item.summary_description} -

- - ))} +
+ {list && list.map((item) => ( + + +

{item.product_name}

+ {item.model_name} + + ))}
); diff --git a/src/Components/Views/MainPage/MainPage.scss b/src/Components/Views/MainPage/MainPage.scss index 03f3213d..d59f3e82 100644 --- a/src/Components/Views/MainPage/MainPage.scss +++ b/src/Components/Views/MainPage/MainPage.scss @@ -1,12 +1,8 @@ -* { - box-sizing: border-box; - list-style: none; - margin: 0; - padding: 0; -} .wrapper { - width: 1200px; + width: 1500px; margin: 100px auto 0; + //background-color: yellow; + position: relative; } a { display: block; @@ -19,30 +15,43 @@ main { display: flex; width: 1200px; margin: 100px auto; - .tag-box { - width: 300px; + + .Category-menu { + position: sticky; + top: 0px; + margin-left: -80px; + height: 410px; + + img { + position: sticky; + width: 120px; + height: inherit; + } + + .Category-menu__text{ + width: 125px; + position: absolute; + bottom: 50px; + height: 360px; + padding: 10px; + + li { + display: flex; + align-items: center; + justify-content: center; + height: 50px; + margin-top: 10px; + border-radius: 30px; + font-weight: bold; + font-size: 20px; + transition: background-color 0.3s; + } + .active { + background-color: #fde1c7; + } + } } -} -.category-menu { - position: sticky; - top: 0; - margin-left: -110px; - border-radius: 10px; - padding: 10px; - height: max-content; - border: 1px solid; - li { - display: flex; - align-items: center; - justify-content: center; - height: 50px; - width: 100px; - border-radius: 30px; - transition: background-color 0.3s; - } - .active { - background-color: orange; - //border-radius: 30px; - } + } + diff --git a/src/Components/Views/MyPage/MyPage.tsx b/src/Components/Views/MyPage/MyPage.tsx index f891ab3f..25fa9f17 100644 --- a/src/Components/Views/MyPage/MyPage.tsx +++ b/src/Components/Views/MyPage/MyPage.tsx @@ -1,8 +1,37 @@ -// import { useState, useEffect } from 'react'; +import { useState, useEffect } from 'react'; +import axios from 'axios'; import { Link } from 'react-router-dom'; import './MyPage.scss' function MyPage () { + + /* 구현해야할일 + 1. 아임포트 결제 내역을 조회해오기 위해서는 acesstoken 이 필요함. + 2. 이 acesstoken 을 발급받기 위해서는 POST /users/getToken 을 사용해 헤더에 API 키, API secret 보낸후 + 발급받음. + 3. 발급받은 acesstoken 은 30분마다 새롭게 발급받아야함. + 4. 그럼 헤더에 보내는 관리자 api키 , API secret 은 고정으로 있기때문에 만약 30분이 지나 기존 + acesstoken 맞지 않을때 , 기존 acesstoken 값을 삭제함과 동시에 새로 발급 받을수 있도록 조건식을 써야함. + 5. 그렇게 30분마다 기존 토큰값을 삭세한후 새로운 토큰 값을 사용해 결제 내역을 받아옴 + () + */ + + useEffect(() => { + async function fetchdata() { + const { data } = await axios.get( + "/iamport/status/all?limit=20&sorting=-started&_token=a293f3ff21b8cfdc954b49b6957eef717c6e580a" + ); + console.log("data:", data); + } + fetchdata(); + }, []); + + + + + + + return( <>
@@ -27,15 +56,6 @@ function MyPage () {
회원정보 수정

- -
배송지 관리
-
- -
결제수단 관리
-
- -
1:1 문의
-
diff --git a/src/Components/Views/MyPage/UserInfo.scss b/src/Components/Views/MyPage/UserInfo.scss index d341501d..58c842e8 100644 --- a/src/Components/Views/MyPage/UserInfo.scss +++ b/src/Components/Views/MyPage/UserInfo.scss @@ -8,14 +8,11 @@ .subContainer{ width: 25%; - // background-color: red; - .profile{ border: solid 1px rgb(221, 221, 221); position: relative; top:21.5px; height: 250px; - // background-color: bisque; .profilePhoto{ position: relative; From 64d9b2c1384841fd5cfeb8357a08b2f729cd078a Mon Sep 17 00:00:00 2001 From: jinyoungpark231 Date: Tue, 20 Jun 2023 23:41:03 +0900 Subject: [PATCH 31/75] =?UTF-8?q?refactor:css=EC=A0=84=EC=B2=B4=EC=A0=81?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Views/SearchPage/SearchPage.scss | 97 ++++++++++--------- .../Views/SearchPage/SearchPage.tsx | 8 +- 2 files changed, 57 insertions(+), 48 deletions(-) diff --git a/src/Components/Views/SearchPage/SearchPage.scss b/src/Components/Views/SearchPage/SearchPage.scss index d2a8560a..8802f0d0 100644 --- a/src/Components/Views/SearchPage/SearchPage.scss +++ b/src/Components/Views/SearchPage/SearchPage.scss @@ -1,75 +1,82 @@ +.wrapper { + width: 1200px; + margin: auto; +} .SearchPage { - width: inherit; - height: 600px; + display: flex; + padding: 40px 0; border-bottom: 2px solid #ca9f12; } + // 책 표지 .SearchPage__Images { - width: 370px; - height: 500px; - position: relative; - left: 13em; - margin: 70px 0; + display: flex; + justify-content: center; + width: 270px; + + img { + height: 200px; + aspect-ratio: auto; + } } // 상세설명 .SearchPage__Items { - position: relative; - width: 800px; - height: 600px; - top: -575px; - left: 40em; - - //제목 + display: flex; + flex-direction: column; + flex-grow: 1; + width: 500px; + gap: 30px; h1 { - font-size: 30px; + font-size: 34px; + margin-top: 10px; + width: 70%; } // 줄거리 p:nth-child(2) { - width: 700px; - font-size: 20px; - margin: 100px 0; + font-size: 19px; + width: 70%; color: #595959; } - +} +.SearchPage__Price { // 판매가 - p:nth-child(3) { - position: absolute; + p:nth-child(1) { color: red; - font-size: 30px; - bottom: 150px; + font-size: 24px; + margin-bottom: 10px; } // 정가 - p:nth-child(4) { - position: absolute; + p:nth-child(2) { color: #808080; - font-size: 20px; - bottom: 100px; + font-size: 16px; } } -// 구매,대여 버튼 -.SearchPage__ButtonBox button { - display: flex; +// 구매,대여 공통 +.SearchPage__ButtonBox { position: relative; - align-items: center; - justify-content: center; - border-radius: 30px; - width: 120px; - height: 40px; - color: #fff; - border: none; - font-size: 17px; - margin: 20px; - left: 99em; - top: -47em; - cursor: pointer; -} + display: flex; + flex-direction: column; + justify-content: flex-end; + button { + border-radius: 5px; + margin: 8px; + width: 120px; + height: 40px; + color: #fff; + border: none; + font-size: 17px; + cursor: pointer; + } +} +// 구매버튼 button:first-child { - background-color: #4dac27; + background-color: #df307f; } +// 대여버튼 button:last-child { - background-color: #5055b1; + background-color: #e24457; } diff --git a/src/Components/Views/SearchPage/SearchPage.tsx b/src/Components/Views/SearchPage/SearchPage.tsx index 51b7e721..66f16f3e 100644 --- a/src/Components/Views/SearchPage/SearchPage.tsx +++ b/src/Components/Views/SearchPage/SearchPage.tsx @@ -51,7 +51,7 @@ const dummy = [ export default function SearchPage() { return ( -
+
{dummy.map((v) => { return (
@@ -61,8 +61,10 @@ export default function SearchPage() {

{v.product_name}

{v.summary_description}

-

{v.price}

-

{v.retail_price}

+
+

{v.price}

+

{v.retail_price}

+
From 9dd5bd33b85c19daa2055001fa2bb5c25bc900cf Mon Sep 17 00:00:00 2001 From: jinyoungpark231 Date: Thu, 22 Jun 2023 17:16:23 +0900 Subject: [PATCH 32/75] =?UTF-8?q?feat:=20api=ED=86=B5=EC=8B=A0=EC=99=84?= =?UTF-8?q?=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Views/SearchPage/SearchPage.scss | 40 ++-- .../Views/SearchPage/SearchPage.tsx | 180 +++++++++++------- 2 files changed, 137 insertions(+), 83 deletions(-) diff --git a/src/Components/Views/SearchPage/SearchPage.scss b/src/Components/Views/SearchPage/SearchPage.scss index 8802f0d0..ca04cd03 100644 --- a/src/Components/Views/SearchPage/SearchPage.scss +++ b/src/Components/Views/SearchPage/SearchPage.scss @@ -27,30 +27,38 @@ flex-grow: 1; width: 500px; gap: 30px; + // 책 제목 h1 { font-size: 34px; margin-top: 10px; width: 70%; } - - // 줄거리 - p:nth-child(2) { - font-size: 19px; - width: 70%; - color: #595959; + .SearchPage__Item { + // 줄거리 + p:nth-child(1) { + font-size: 19px; + width: 70%; + color: #595959; + } + // 태그 + p:nth-child(2) { + font-size: 15px; + margin-top: 10px; + width: 70%; + } } } .SearchPage__Price { // 판매가 p:nth-child(1) { color: red; - font-size: 24px; + font-size: 22px; margin-bottom: 10px; } // 정가 p:nth-child(2) { color: #808080; - font-size: 16px; + font-size: 15px; } } @@ -71,12 +79,12 @@ font-size: 17px; cursor: pointer; } -} -// 구매버튼 -button:first-child { - background-color: #df307f; -} -// 대여버튼 -button:last-child { - background-color: #e24457; + // 구매버튼 + button:first-child { + background-color: #df307f; + } + // 대여버튼 + button:last-child { + background-color: #e24457; + } } diff --git a/src/Components/Views/SearchPage/SearchPage.tsx b/src/Components/Views/SearchPage/SearchPage.tsx index 66f16f3e..01967998 100644 --- a/src/Components/Views/SearchPage/SearchPage.tsx +++ b/src/Components/Views/SearchPage/SearchPage.tsx @@ -1,78 +1,124 @@ +import { useState } from 'react'; import './SearchPage.scss'; - -const dummy = [ - { - list_image: - 'https://teamwink.cafe24.com/web/product/big/202306/6543ff6b482a7dfbf4275363d79e01dc.png', - product_name: '피나 바우쉬(끝나지 않을 몸짓)', - summary_description: - "'현대 예술의 거장' 시리즈는 20세기를 전후한 문화 예술계에큰 영향력을 끼친 국내외 거장 아티스트의 평전으로 구성된다.", - retail_price: '20000', - price: '18000', - }, - { - list_image: - 'https://teamwink.cafe24.com/web/product/big/202306/23ee454750818ac377870ea574e832bd.png', - product_name: '일향 강우방의 예술 혁명일지', - summary_description: - '우리나라 미술사학계를 대표하는 원로이자 현역으로 활동하는 강우방(83)의 자전적 에세이다.', - retail_price: '20000', - price: '18000', - }, - { - list_image: - 'https://teamwink.cafe24.com/web/product/big/202306/fd86c152ea5616135b40747f895a576c.png', - product_name: '예술이 필요한 시간(전시 디자이너 에세이)', - summary_description: - '《에드워드 호퍼: 길 위에서》를 비롯해 까르띠에 현대미술재단 소장품전 《하이라이트》, 《빛: 영국 테이트미술관 특별전》 등 해외 유명 걸작전을 담당해온 전시 디자이너의 시선을 담아낸 책이다', - retail_price: '20000', - price: '18000', - }, - { - list_image: - 'https://teamwink.cafe24.com/web/product/big/202306/abc3fc36c0dad20454ad0433b4c662c5.png', - product_name: '예썰의 전당: 서양미술 편(예술에 관한 세상의 모든 썰)', - summary_description: - "KBS 화제의 교양 프로그램 '예썰의 전당'을 책으로 만난다.", - retail_price: '20000', - price: '18000', +import axios from 'axios'; +// const dummy = [ +// { +// list_image: +// 'https://teamwink.cafe24.com/web/product/big/202306/6543ff6b482a7dfbf4275363d79e01dc.png', +// product_name: '피나 바우쉬(끝나지 않을 몸짓)', +// summary_description: +// "'현대 예술의 거장' 시리즈는 20세기를 전후한 문화 예술계에큰 영향력을 끼친 국내외 거장 아티스트의 평전으로 구성된다.", +// retail_price: '20000', +// price: '18000', +// }, +// { +// list_image: +// 'https://teamwink.cafe24.com/web/product/big/202306/23ee454750818ac377870ea574e832bd.png', +// product_name: '일향 강우방의 예술 혁명일지', +// summary_description: +// '우리나라 미술사학계를 대표하는 원로이자 현역으로 활동하는 강우방(83)의 자전적 에세이다.', +// retail_price: '20000', +// price: '18000', +// }, +// { +// list_image: +// 'https://teamwink.cafe24.com/web/product/big/202306/fd86c152ea5616135b40747f895a576c.png', +// product_name: '예술이 필요한 시간(전시 디자이너 에세이)', +// summary_description: +// '《에드워드 호퍼: 길 위에서》를 비롯해 까르띠에 현대미술재단 소장품전 《하이라이트》, 《빛: 영국 테이트미술관 특별전》 등 해외 유명 걸작전을 담당해온 전시 디자이너의 시선을 담아낸 책이다', +// retail_price: '20000', +// price: '18000', +// }, +// { +// list_image: +// 'https://teamwink.cafe24.com/web/product/big/202306/abc3fc36c0dad20454ad0433b4c662c5.png', +// product_name: '예썰의 전당: 서양미술 편(예술에 관한 세상의 모든 썰)', +// summary_description: +// "KBS 화제의 교양 프로그램 '예썰의 전당'을 책으로 만난다.", +// retail_price: '20000', +// price: '18000', +// }, +// { +// list_image: +// 'https://teamwink.cafe24.com/web/product/big/202306/84a72535341fa2d5966129b260f97857.png', +// product_name: +// '생성 예술의 시대(챗GPT가 말하고 DALL E가 그리는 인공지능 시대의 예술)', +// summary_description: +// '인공지능을 위시한 이 시대 가장 첨예한 신기술에 항상 주목해 왔던 뇌과학자 김대식이 이번에는 생성AI를 활용한 AI 그림의 가능성에 눈을 돌렸다', +// retail_price: '20000', +// price: '18000', +// }, +// ]; +const { VITE_CLIENT_ID } = import.meta.env; +const ajax = axios.create({ + baseURL: '/cafe24', + headers: { + 'Content-Type': 'application/json', + 'X-Cafe24-Api-Version': '2023-03-01', + 'X-Cafe24-Client-Id': VITE_CLIENT_ID, }, - { - list_image: - 'https://teamwink.cafe24.com/web/product/big/202306/84a72535341fa2d5966129b260f97857.png', - product_name: - '생성 예술의 시대(챗GPT가 말하고 DALL E가 그리는 인공지능 시대의 예술)', - summary_description: - '인공지능을 위시한 이 시대 가장 첨예한 신기술에 항상 주목해 왔던 뇌과학자 김대식이 이번에는 생성AI를 활용한 AI 그림의 가능성에 눈을 돌렸다', - retail_price: '20000', - price: '18000', - }, -]; +}); +async function SearchAPI(product_name: string) { + try { + const res = await ajax.get('/products', { + params: { + product_name: product_name, + }, + }); + return res.data.products; + } catch (err) { + console.log(err); + } +} export default function SearchPage() { + const [input, setInput] = useState(''); + const [search, setSearch] = useState([] as Products); + + const searchInputChange = (e) => { + setInput(e.target.value); + }; + + const searchUpload = async () => { + const result = await SearchAPI(input); + setSearch(result); + console.log(result); + }; + return (
- {dummy.map((v) => { - return ( -
-
- 책표지 -
-
-

{v.product_name}

-

{v.summary_description}

-
-

{v.price}

-

{v.retail_price}

+ + + {search && + search.map((v) => { + return ( +
+
+ 책표지 +
+
+

{v.product_name}

+
+

{v.summary_description}

+

{v.product_tag}

+
+
+

{v.price.slice(0, -3)}원

+

{v.retail_price.slice(0, -3)}원

+
+
+
+ +
-
- - -
-
- ); - })} + ); + })}
); } From 9c43d6f967e7031701e6cff03477d523496430e7 Mon Sep 17 00:00:00 2001 From: Seo Donguk Date: Thu, 22 Jun 2023 20:58:36 +0900 Subject: [PATCH 33/75] =?UTF-8?q?refactor:=20api=20=ED=83=80=EC=9E=85=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Apis/productApi.ts | 12 +++++-- .../Views/MainPage/Component/Genre.tsx | 12 ++++--- .../Views/MainPage/Component/Recommand.tsx | 34 +++++++++---------- 3 files changed, 33 insertions(+), 25 deletions(-) diff --git a/src/Apis/productApi.ts b/src/Apis/productApi.ts index ba177b00..68685482 100644 --- a/src/Apis/productApi.ts +++ b/src/Apis/productApi.ts @@ -11,12 +11,18 @@ const ajax = axios.create({ }, }); -export async function getList(category?: number, product_no:string) { +interface GetList { + category?: number; + product_no?: string; +} +export async function getList(info: GetList) { try { const { data } = await ajax.get('/products', { params: { - category: category, - product_no : product_no + display: 'T', + selling: 'T', + category: info.category, + product_no: info.product_no, }, }); //console.log(data.products); diff --git a/src/Components/Views/MainPage/Component/Genre.tsx b/src/Components/Views/MainPage/Component/Genre.tsx index c8497ecc..b18686bd 100644 --- a/src/Components/Views/MainPage/Component/Genre.tsx +++ b/src/Components/Views/MainPage/Component/Genre.tsx @@ -11,7 +11,8 @@ interface Props { export default function Genre({ category }: { category: Props }) { const [list, setList] = useState([] as Products); async function sortByCategory() { - const data = await getList(category.number); + const data = await getList({ category: category.number }); + //console.log(category.number); setList(data); } useEffect(() => { @@ -29,10 +30,9 @@ export default function Genre({ category }: { category: Props }) {
- + {list && list.map((item) => ( - <> - ))} - +
); diff --git a/src/Components/Views/MainPage/Component/Recommand.tsx b/src/Components/Views/MainPage/Component/Recommand.tsx index 99f5c723..178320e5 100644 --- a/src/Components/Views/MainPage/Component/Recommand.tsx +++ b/src/Components/Views/MainPage/Component/Recommand.tsx @@ -11,11 +11,10 @@ interface RecommandProduct { product_name: string; summary_description: string; list_image: string; - model_name:string; + model_name: string; } export default function Recommand() { - const [list, setList] = useState(); async function recommand() { @@ -23,7 +22,7 @@ export default function Recommand() { const res = await getRecommand(); console.log(res.products); setList(res.products); - const productList = res.products.map(obj => obj.product_no).join(",") + const productList = res.products.map((obj) => obj.product_no).join(','); return productList; } catch (err) { console.log(err); @@ -32,14 +31,14 @@ export default function Recommand() { async function getItem() { const productList = await recommand(); - console.log(productList) - const data = await getList(null,productList); + console.log(productList); + const data = await getList({ product_no: productList }); setList(data); } useEffect(() => { (async () => { - await getItem(); + await getItem(); })(); }, []); @@ -47,17 +46,18 @@ export default function Recommand() {

추천도서

- {list && list.map((item) => ( - - -

{item.product_name}

- {item.model_name} - - ))} + {list && + list.map((item) => ( + + +

{item.product_name}

+ {item.model_name} + + ))}
); From 0401d3d486a50f15a664af9feecdb38f92af239f Mon Sep 17 00:00:00 2001 From: hahahaday12 Date: Thu, 22 Jun 2023 21:03:37 +0900 Subject: [PATCH 34/75] =?UTF-8?q?feat:=20=EC=88=98=EC=A0=95=EC=82=AC?= =?UTF-8?q?=ED=95=AD=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 장바구니 기능, 스타일 수정 - 마이페이지 api 연결 능 추가 --- .../Views/CartPage/CartItems/CartItems.tsx | 77 +--- src/Components/Views/CartPage/CartPage.scss | 2 + src/Components/Views/CartPage/CartPage.tsx | 118 +++++- .../Views/CartPage/CartRent/CartRent.scss | 92 ++--- .../Views/CartPage/CartRent/CartRent.tsx | 102 ++--- .../Views/CartPage/Payment/Payment.tsx | 13 +- .../Views/DetailPage/DetailPage.tsx | 9 - src/Components/Views/MainPage/MainPage.tsx | 3 +- src/Components/Views/MyPage/MyPage.scss | 349 +++++++++++++----- src/Components/Views/MyPage/MyPage.tsx | 163 ++++++-- src/Components/Views/MyPage/UserInfo.scss | 2 +- src/Components/Views/MyPage/UserInfo.tsx | 2 +- vite.config.ts | 2 +- 13 files changed, 632 insertions(+), 302 deletions(-) diff --git a/src/Components/Views/CartPage/CartItems/CartItems.tsx b/src/Components/Views/CartPage/CartItems/CartItems.tsx index c64213d9..bec5a8d1 100644 --- a/src/Components/Views/CartPage/CartItems/CartItems.tsx +++ b/src/Components/Views/CartPage/CartItems/CartItems.tsx @@ -3,6 +3,7 @@ import { useState } from "react"; import Box from "@mui/material/Box"; import Checkbox from "@mui/material/Checkbox"; import FormControlLabel from "@mui/material/FormControlLabel"; +//import RemoveItemButton from "../Components/DeletButton"; import "./CartItems.scss"; interface BuyItem { @@ -13,50 +14,37 @@ interface BuyItem { product_no: number; } +interface CartItem { + product_no: number; + // Add other properties here +} + interface CartItemsProps { check: number[]; pitem: string; - setItems: string; + setItems: React.Dispatch>; + delete: (index: number, key: any) => void; + datalist : any + setdata : React.Dispatch>; + checkOne : any; + checkTwo : any; } -const CartItems = ({ check, pitem, setItems }: CartItemsProps) => { +const CartItems = ({ check, pitem, setItems, delete: RemoveBuyItem, datalist, setdata, checkOne, checkTwo }: CartItemsProps) => { const [buyItem, setbuyItem] = useState([]); const [checkedItems, setCheckedItems] = useState(check); useEffect(() => { - BuyCart(); - }, []); - - const BuyCart = () => { - const BuyItems = JSON.parse(localStorage.getItem("cart")) || []; - setbuyItem(BuyItems); - console.log(BuyItems); - }; + setbuyItem(datalist) + }, [datalist]); const handleChange1 = (event: React.ChangeEvent) => { - const checkedValue = event.target.checked; - const updatedCheckedItems = checkedValue - ? buyItem.map((item) => item.id) - : []; - setCheckedItems(updatedCheckedItems); + setCheckedItems(checkOne(event, buyItem,'buy')); }; const handleChange2 = (el: any) => (event: React.ChangeEvent) => { - console.log(el); - const itemId = parseInt(event.target.name); - let updatedCheckedItems: number[] = []; - let updatedItems: any[] = []; - if (event.target.checked) { - updatedCheckedItems = [...checkedItems, itemId]; - updatedItems = [...pitem, el]; - } else { - updatedCheckedItems = checkedItems.filter((id) => id !== itemId); - updatedItems = pitem.filter((key) => key.product_no !== el.product_no); - } - setItems(updatedItems); - setCheckedItems(updatedCheckedItems); - //setCheck(updatedCheckedItems); + setCheckedItems(checkTwo(event, checkedItems,el)) }; const children = (el: any, index: number) => ( @@ -81,30 +69,6 @@ const CartItems = ({ check, pitem, setItems }: CartItemsProps) => { ); - const RemoveBuyItem = (index: number, key: any) => { - console.log(key); - const confirmation = window.confirm("삭제하시겠습니까?"); - if (confirmation) { - const updatedCartData = JSON.parse(localStorage.getItem("cart")); - localStorage.setItem( - "cart", - JSON.stringify( - updatedCartData.filter((item) => item.product_no !== key) - ) - ); - - const updatedBuyItem = [...buyItem]; - //선택한 index 1개를 buyItem 배열에서 제거. - updatedBuyItem.splice(index, 1); - // 제거한후의 값 setState 갑에 담아줌. - setbuyItem(updatedBuyItem); - // cart 키 값으로 로컬에서 데이터 찾아옴 - alert("삭제되었습니다."); - } else { - alert("취소되었습니다."); - } - }; - return ( <>
@@ -134,7 +98,7 @@ const CartItems = ({ check, pitem, setItems }: CartItemsProps) => {
- 보관/삭제 + 삭제
@@ -156,9 +120,8 @@ const CartItems = ({ check, pitem, setItems }: CartItemsProps) => {
- + +
))} diff --git a/src/Components/Views/CartPage/CartPage.scss b/src/Components/Views/CartPage/CartPage.scss index e19d934a..00627a54 100644 --- a/src/Components/Views/CartPage/CartPage.scss +++ b/src/Components/Views/CartPage/CartPage.scss @@ -59,6 +59,8 @@ width: inherit; padding-bottom: 50px; top: 640px; + height: 500px; + border-radius: 10px; } .BuyText { diff --git a/src/Components/Views/CartPage/CartPage.tsx b/src/Components/Views/CartPage/CartPage.tsx index d16e6db9..ed1f34b0 100644 --- a/src/Components/Views/CartPage/CartPage.tsx +++ b/src/Components/Views/CartPage/CartPage.tsx @@ -3,20 +3,87 @@ import { useState, useEffect } from "react"; import CartItems from "./CartItems/CartItems"; import RentalItems from "./CartRent/CartRent"; import Payment from "./Payment/Payment"; +//import useCheckedItems from "../Custom/useChecked"; + + +interface BuyItem { + id: number; + product_name: string; + price: number; + detail_image: string; + product_no: number; +} function CartPage() { const [CartItemsValue, setCartItemsValue] = useState([]); const [selectedItem, setSelectedItem] = useState([]); + const [selectedItemRent, setSelectedItemRent] = useState([]); const [Total, setTotal] = useState(0); const [ShowTotal, setShowTotal] = useState(false); + const [buyItem, setbuyItem] = useState([]); - const [RentalItemsValue, setRentalItemsValue] = useState([]); - + useEffect(() => { + const BuyItems = JSON.parse(localStorage.getItem("cart")) || []; + setbuyItem(BuyItems); + }, []); + useEffect(() => { calculateTotal(); }, [selectedItem]); + // const checkOne = (event: React.ChangeEvent,buyItem:any) => { + // const checkedValue = event.target.checked; + // const updatedCheckedItems = checkedValue + // ? buyItem.map((item,index) => index) + // : []; + // //setCheckedItems(updatedCheckedItems); + // setSelectedItem(buyItem); + // return updatedCheckedItems; + // }; + + // const checkOne = (event: React.ChangeEvent, buyItem: any[], gubun:string) => { + // const checkedValue = event.target.checked; + // const updatedCheckedItems = checkedValue ? buyItem.map((item, index) => index) : []; + // // Update selectedItem based on checkedValue + // const updatedSelectedItems = checkedValue ? buyItem : []; + // setSelectedItem(updatedSelectedItems); + // return updatedCheckedItems; + // }; + const checkOne = (event: React.ChangeEvent, buyItem: any[], gubun: string) => { + const checkedValue = event.target.checked; + // Filter buyItem based on the condition (item.gubun === gubun) + const filteredItems = buyItem.filter((item) => item.gubun === gubun); + // Update selected items based on checkedValue + const updatedSelectedItems = checkedValue ? [...filteredItems] : []; + // Update selectedItem state + if(gubun === "rent"){ + setSelectedItemRent(updatedSelectedItems); + }else{ + setSelectedItem(updatedSelectedItems); + } + // Return an array of indices for the updated selected items + const updatedCheckedItems = updatedSelectedItems.map((item, index) => index); + return updatedCheckedItems; + }; + + + const checkTwo = (event: React.ChangeEvent, checkedItems:any, el:any) => { + const itemId = parseInt(event.target.name); + let updatedCheckedItems: number[] = []; + let updatedItems: any[] = []; + if (event.target.checked) { + updatedCheckedItems = [...checkedItems, itemId]; + updatedItems = [...selectedItem, el]; + } else { + updatedCheckedItems = checkedItems.filter((id) => id !== itemId); + updatedItems = selectedItem.filter((key) => key.product_no !== el.product_no); + } + setSelectedItem(updatedItems); + return updatedCheckedItems; + }; + const calculateTotal = () => { + console.log(selectedItem) console.log("ccccccc" + Array.isArray(selectedItem)); let total = 0; if (Array.isArray(selectedItem)) { @@ -35,6 +102,37 @@ function CartPage() { setShowTotal(true); }; + + const RemoveBuyItem = (index: number, key: any, buyItem:any) => { + console.log(key); + const confirmation = window.confirm("삭제하시겠습니까?"); + if (confirmation) { + const updatedCartData = JSON.parse(localStorage.getItem("cart")); + localStorage.setItem( + "cart", + JSON.stringify( + updatedCartData.filter((item) => item.product_no !== key) + ) + ); + + console.log(updatedCartData); + const updatedBuyItem = [...updatedCartData]; + //선택한 index 1개를 buyItem 배열에서 제거. + updatedBuyItem.splice(index, 1); + // 제거한후의 값 setState 갑에 담아줌. + setbuyItem(updatedBuyItem); + // cart 키 값으로 로컬에서 데이터 찾아옴 + console.log(buyItem); + + alert("삭제되었습니다."); + } else { + alert("취소되었습니다."); + } + }; + + + + return ( <>
@@ -44,15 +142,25 @@ function CartPage() { check={CartItemsValue} pitem={selectedItem} setItems={setSelectedItem} + delete={RemoveBuyItem} + datalist={buyItem} + setdata={setbuyItem} + checkOne={checkOne} + checkTwo={checkTwo} />
- {/* 여기에서는 대여 부분 */} 대여
diff --git a/src/Components/Views/CartPage/CartRent/CartRent.scss b/src/Components/Views/CartPage/CartRent/CartRent.scss index 4b2840e1..58c582cd 100644 --- a/src/Components/Views/CartPage/CartRent/CartRent.scss +++ b/src/Components/Views/CartPage/CartRent/CartRent.scss @@ -12,7 +12,8 @@ // background-color: #bff12b; background-color: #f6e4cc; position: absolute; - + border-radius: 10px 10px 0px 0px; + .Rent-LableBox{ width: 40px; height: 40px; @@ -25,52 +26,62 @@ .Rental-Namebox{ @include CartNameStyle; - left: 300px; + left: 140px; } .Renatal-Price{ @include CartNameStyle; - right: 420px; + left: 420px; } .RentDay{ @include CartNameStyle; - right: 100px; - } + right: 440px; + } + + .DeleteDay{ + @include CartNameStyle; + right: 150px; + } + } .Rental-ItemsContainer { width: 1300px; top: 50px; position: relative; + border-radius: 0px 0px 10px 10px; //background-color: #d16f14; + background-color: white; max-height: 450px; /* 스크롤 영역의 최대 높이 설정 */ overflow-y: auto; /* 세로 스크롤 생성 */ .Rental-ItemContainer { - width: 1180px; - height: 90px; + width: 1182px; + padding-bottom: 5px; + //height: 90px; position: relative; margin-top: 20px; - border-bottom: 2px solid rgb(202, 159, 18); - + border-bottom: 2px solid rgb(208, 203, 185); .Rental-CheckContainer{ width: 60px; height: 40px; position: absolute; - top: 12px; + top: 45px; left: 30px; } .ImageBox{ width: 100px; - height: 100px; - margin-left: 150px; + position: relative; + bottom: 10px; + margin-left: 120px; + background-color: rebeccapurple; img{ - position: absolute; width: inherit; - height: 80px; + background-color: orange; + height: auto; } } @@ -81,52 +92,41 @@ top: 1px; left: 260px; font-size: 20px; - - span:nth-child(1) { - position: absolute; - font-size: 20px; - } - - span:nth-child(2) { - position: absolute; - margin-top: 35px; - font-size: 15px; - } } .Rental-PriceInner{ - width: 120px; + width: 100px; height: 30px; position: absolute; - top: 20px; - right: 370px; - ///background-color: olivedrab; - display: table-column; + top: 50px; + left: 420px; font-size: 18px; - - span { - position: absolute; - //background-color: red; - } } .Rental-RentDay{ - width: 70px; - height: 30px; + width: 50px; position: absolute; - top: 20px; - right: 80px; - background-color: olivedrab; - display: table-column; + top: 50px; + right: 420px; font-size: 18px; span{ + width: auto; + } + } + + .RentButtonBox{ + width: 60px; + position: absolute; + top: 40px; + right: 110px; + //background-color: burlywood; + + button{ + display: block; width: 50px; - position: absolute; - margin: 0 auto; - left: 0; - right: 0; - background-color: #bff12b; + height: 30px; + margin-top: 10px; } } } diff --git a/src/Components/Views/CartPage/CartRent/CartRent.tsx b/src/Components/Views/CartPage/CartRent/CartRent.tsx index a0e532ee..68c3f707 100644 --- a/src/Components/Views/CartPage/CartRent/CartRent.tsx +++ b/src/Components/Views/CartPage/CartRent/CartRent.tsx @@ -3,69 +3,65 @@ import { useState, useEffect } from "react"; import Box from '@mui/material/Box'; import Checkbox from '@mui/material/Checkbox'; import FormControlLabel from '@mui/material/FormControlLabel'; -//import YearBox from "Common/section/number"; -// import './CartItems.scss' import './CartRent.scss' +interface RentItem { + id: number; + product_name: string; + price: number; + detail_image: string; + product_no: number; + gubun: string; + name: string; + rentdate: string; +} - interface RentItem { - id: number; - product_name: string; - price: number; - detail_image: string; - product_no: number; - } +interface CartItem { + product_no: number; +} interface CartItemsProps { check: number[]; pitem: string; - setItems:string; - + setItems: React.Dispatch>; + delete: (index: number, key: any) => void; + datalist : any + setdata : React.Dispatch>; + checkOne : any; + checkTwo : any; } - const RentalItems = ({ check, pitem, setItems }: CartItemsProps) => { + const RentalItems = ({ check,delete: RemoveBuyItem, datalist, checkOne, checkTwo }: CartItemsProps) => { - const [buyItem, setbuyItem] = useState([]); - const [checkedItems, setCheckedItems] = useState(check); + const [buyItem, setbuyItem] = useState([]); + const [checkedItems, setCheckedItems] = useState(check); - useEffect(() => { - BuyCart(); - }, []); + useEffect(() => { + setbuyItem(datalist) + }, [datalist]); - const BuyCart = () => { - const BuyItems = JSON.parse(localStorage.getItem("cart")) || []; - setbuyItem(BuyItems); - console.log(BuyItems) - } + + // useEffect(() => { + // BuyCart(); + // }, []); + + // const BuyCart = () => { + // const BuyItems = JSON.parse(localStorage.getItem("cart")) || []; + // setbuyItem(BuyItems); + // console.log(BuyItems) + // } + const handleChange1 = (event: React.ChangeEvent) => { - const checkedValue = event.target.checked; - const updatedCheckedItems = checkedValue - ? buyItem.map((item) => item.id) - : []; - setCheckedItems(updatedCheckedItems); + setCheckedItems(checkOne(event, buyItem,'rent')); }; - const handleChange2 = (el: any) => (event: React.ChangeEvent) => { - console.log(el); - const itemId = parseInt(event.target.name); - let updatedCheckedItems: number[] = []; - let updatedItems: any[] = []; - if (event.target.checked) { - console.log(itemId) - updatedCheckedItems = [...checkedItems, itemId]; - updatedItems = [...pitem , el]; - } else { - updatedCheckedItems = checkedItems.filter((id) => id !== itemId); - updatedItems = pitem.filter((key) => key.product_no !== el.product_no); - } - console.log(updatedCheckedItems) - setItems(updatedItems); - setCheckedItems(updatedCheckedItems); - //setCheck(updatedCheckedItems); + const handleChange2 = + (el: any) => (event: React.ChangeEvent) => { + setCheckedItems(checkTwo(event, checkedItems,el)) }; - + const children = (el:any ,index:number) => ( +
} /> ); - return( <>
@@ -116,6 +113,10 @@ import './CartRent.scss'
대여날짜
+ +
+ 삭제 +
@@ -137,10 +138,13 @@ import './CartRent.scss' {Number(el.price).toFixed(0)}원
- {el.rentdate} + {el.rentdate}일
- - +
+ +
))}
diff --git a/src/Components/Views/CartPage/Payment/Payment.tsx b/src/Components/Views/CartPage/Payment/Payment.tsx index 9b05e133..5b6cf381 100644 --- a/src/Components/Views/CartPage/Payment/Payment.tsx +++ b/src/Components/Views/CartPage/Payment/Payment.tsx @@ -26,6 +26,14 @@ const Payment = ({ amount, productlists }: PaymentInfo) => { const itemName = productlists.map((obj) => obj.product_name).join(","); + const custom_data = [{productlists}]; + // custom_data = { + // 0: [product_no:1,gubun:'buy']; + // 1: [product_no:3,gubun:'buy']; + // 2: [product_no:4,gubun:'rent']; + // } + + console.log(itemName); const { IMP }: any = window; IMP.init("imp36252452"); @@ -36,12 +44,13 @@ const Payment = ({ amount, productlists }: PaymentInfo) => { merchant_uid: orderNumber, // 주문번호 // 만약 여기에 에세스키 amount: amount, // 결제금액 name: `${itemName}`, // 주문명 - buyer_name: "김세연", // 구매자 이름 + buyer_name: "", // 구매자 이름 // buyer_tel: "01032752740", // 구매자 전화번호 // 전화번호: 일단 빼고 나중에 추가 시도.. buyer_email: "", // 구매자 이메일 - 작성시 구매창에서 이메일 부분에 들어가있음 //https://developers.portone.io/docs/ko/api/api-1/api-1 //productinfos : productlists + custom_data:productlists }; IMP.request_pay(data, callback); @@ -65,6 +74,8 @@ const Payment = ({ amount, productlists }: PaymentInfo) => { window.localStorage.setItem("mypayment", JSON.stringify(combinedArray)); } + + //결제 성공을 하고 성공된 데이터가 로컬스토리지에서 지워져야함. produc_id } else { alert(`결제 실패: ${error_msg}`); diff --git a/src/Components/Views/DetailPage/DetailPage.tsx b/src/Components/Views/DetailPage/DetailPage.tsx index e0728b55..a50e7cab 100644 --- a/src/Components/Views/DetailPage/DetailPage.tsx +++ b/src/Components/Views/DetailPage/DetailPage.tsx @@ -195,15 +195,6 @@ function DetailPage() { dangerouslySetInnerHTML={{ __html: modifiedDescription }} onClick={disableLinkClick} >
- - {/*
- 북플 BOOKPLE -
    -
  • 이책의 마니아가 남긴글
  • -
  • 친구가 남긴글
  • -
  • 내가 남긴글
  • -
-
*/}
); diff --git a/src/Components/Views/MainPage/MainPage.tsx b/src/Components/Views/MainPage/MainPage.tsx index e47c2b67..c79de7f1 100644 --- a/src/Components/Views/MainPage/MainPage.tsx +++ b/src/Components/Views/MainPage/MainPage.tsx @@ -3,8 +3,7 @@ import Carousel from "./Component/Carousel"; import ajax from "@/Apis/adminAuth"; import Main from "./Component/Main"; import Recommand from "./Component/Recommand"; -import { useEffect } from "react"; -import axios from "axios"; + const params = new URLSearchParams(location.search); console.log(params.get("code")); diff --git a/src/Components/Views/MyPage/MyPage.scss b/src/Components/Views/MyPage/MyPage.scss index c1d69768..ca3ca454 100644 --- a/src/Components/Views/MyPage/MyPage.scss +++ b/src/Components/Views/MyPage/MyPage.scss @@ -1,39 +1,25 @@ -// .MyPageContainer{ -// width: 1200px; -// padding-bottom: 820px; -// //height: auto; -// background-color: rgb(157, 247, 244); -// position: relative; -// margin: 0 auto; -// } - - .MyPage-AllLayout { width: 1200px; - padding-bottom: 950px; + padding-bottom: 1500px; position: relative; margin: 0 auto; - background-color: rgb(157, 247, 244); .myPageContainer{ - //background-color: rgb(204, 89, 89); - width: 1100px; + width: 1200px; position: absolute; display: flex; margin: 0 auto; left: 0; right: 0; - top:30px; + top:100px; + .subContainer{ width: 250px; - padding-bottom: 300px; - // background-color: aliceblue; background-color: #F2E7D5; border-radius: 10px 0px 0px 10px; .profile{ - //border: solid 1px rgb(228, 169, 114); position: relative; top:21.5px; height: 250px; @@ -49,12 +35,7 @@ border: solid 1px rgb(243, 214, 172); border-radius: 50%; box-shadow: 2px 5px 5px rgb(0,0,0,.3); - background-image: url(./59932b0eb046f9fa3e063b8875032edd_crop.jpeg); background-position: center; - background-size: contain; - background-repeat: no-repeat; - overflow: hidden; - object-fit: cover; } .profileContainer{ @@ -79,16 +60,13 @@ flex-direction: column; position: relative; height: 350px; + width: 200px; top:30px; - //background-color: #ca8b25; - //border: solid 1px rgb(185, 58, 58); .categoryTap { font-weight: bold; padding: 15px; color: black; - //background-color: #f8e4d1; - //padding: 1.2rem 0 0 0; border-bottom: solid 2px rgb(239, 211, 174); text-align: center; } @@ -96,98 +74,277 @@ } .detailsContainer{ - width: 75%; - flex-direction: column; + width: 1500px; border-radius: 0px 10px 10px 0px; - background-color: rgb(255, 255, 255); + padding-bottom: 178px; + background-color: rgb(227 213 197); + + .orderText{ + position: relative; + left:10px; + top: 30px; + width: 100px; + font-size: 20px; + margin-left: 2rem; + background-color: #F2E7D5; + } .orderContainer{ position: relative; - padding-bottom: 50px; - background-color: rgb(148, 255, 124); + padding-bottom: 400px; + //background-color: rgb(148, 255, 124); top: 50px; - .orderText{ - position: relative; - left:3rem; - width: 120px; - font-size: 20px; - margin-left: 2rem; - background-color: #F2E7D5; + .TopCategory{ + width: 980px; + border-radius: 10px 10px 0px 0px; + position:relative; + display: flex; + height: 40px; + left: 10px; + background-color: #e8e0d6; + gap: 120px; + + .TopCategory-inner{ + width: 70px; + //background-color: aqua; + height: 20px; + position: relative; + margin-left: 25px; + margin-top: 10px; + } } - - + .orderBox{ - position: relative; - background-color: cadetblue; - border: dotted 1px black; - width:700px; - display: flex; + position: absolute; + padding-bottom: 10px; + width: 980px; margin: 0 auto; - top: 20px; - max-width: 650px; /* 스크롤 영역의 최대 높이 설정 */ - overflow-x: auto; - - .orderList{ - background-image: url(./8954699375_2.jpg); - background-position: center; - background-size: contain; - width: 300px; - height: 300px; - margin-left: 10px; - gap: 10px; + left: 0; + right: 0; + height: 400px; + //margin-top: 10px; + max-height: 450px; /* 스크롤 영역의 최대 높이 설정 */ + overflow-y: auto; + background-color: rgb(202, 172, 172); + border-radius: 0px 0px 10px 10px; + + + .orderList { display: flex; - background-repeat: no-repeat; - background-color: rebeccapurple; + width: 960px; + margin: 0 auto; + margin-top: 20px; + padding-bottom: 10px; + //background-color: red; padding: 10px; + border-bottom: 2px solid rgb(208, 203, 185); + + .Buy-ButtonBox{ + width: 30px; + height: 20px; + //background-color: aqua; + position: relative; + top:50px; + right: -500px; + + button{ + width:inherit; + position: absolute; + } + } + + .orderList-priceBox{ + width: auto; + position: relative; + //background-color: rgb(239, 179, 191); + left: 350px; + top:50px; + height: 20px; + } } - - } + + .orderList-ImageBox{ + width: 100px; + height: 140px; + position: relative; + left: 180px; + //background-color: aqua; + + img{ + position: absolute; + width: 100px; + height: auto; + } + + .orderList-ImageBox__text{ + width: auto; + //background-color: crimson; + position: relative; + } + } + + + + span:nth-child(1) { + position: relative; + left: 10px; + top: 50px; + height: 20px; + //background-color: rgb(135, 100, 34); + } + + span:nth-child(2) { + position: relative; + top: 50px; + left: 110px; + height: 20px; + //background-color: rgb(31, 216, 114); + } + + span:nth-child(3) { + position: relative; + top: 50px; + left: 110px; + height: 20px; + background-color: rgb(16, 123, 211); + } + } } + .RentContainer-text{ + position: relative; + left:10px; + top: 100px; + width: 100px; + //font-size: 20px; + margin-left: 2rem; + background-color: #F2E7D5; + } - .rentContainer{ + .RentContainer{ position: relative; - //height: 40%; + padding-bottom: 400px; + //background-color: rgb(148, 255, 124); top: 120px; - padding-bottom: 100px; - //background-color: rgb(192, 38, 244); - .rent{ - position: relative; - // background-color: rgb(224, 57, 57); - top:3rem; - - .rentText{ - font-size: 20px; - font-weight:700; - color:black; - padding: 0 0 0 6rem; - } - - .rentBox{ + .RentTop-Category{ + width: 980px; + border-radius: 10px 10px 0px 0px; + position:relative; + display: flex; + height: 40px; + left: 10px; + background-color: #e8e0d6; + gap: 120px; + + .RentCategory-inner{ + width: 70px; + //background-color: aqua; + height: 20px; position: relative; - margin: 2rem 6rem 0 6rem; - // background-color: cadetblue; - border:dotted 1px black; - width:auto; - height: 12rem; + margin-left: 25px; + margin-top: 10px; + } + } + + .RentBox{ + position: absolute; + padding-bottom: 10px; + width: 980px; + margin: 0 auto; + left: 0; + right: 0; + height: 400px; + //margin-top: 10px; + max-height: 450px; /* 스크롤 영역의 최대 높이 설정 */ + overflow-y: auto; + background-color: rgb(202, 172, 172); + border-radius: 0px 0px 10px 10px; + + .RentList{ display: flex; - flex-wrap: nowrap; - - - .rentList{ - background-image: url(./8954699375_2.jpg); - background-position: center; - background-size: contain; - background-repeat: no-repeat; - overflow: hidden; - padding: 3rem; - // width: 100%; - margin:0 auto; + width: 960px; + margin: 0 auto; + margin-top: 20px; + padding-bottom: 20px; + //background-color: red; padding: 10px; + border-bottom: 2px solid rgb(208, 203, 185); + + .RentList-ImageBox{ + width: 100px; + height: 140px; + position: relative; + left: 180px; + //background-color: rgb(87, 188, 9); + + img{ + position: absolute; + width: 100px; + height: auto; + } + + .RentList-ImageBox__text{ + position: relative; + left:120px; + top: 60px; + width: 150px; + //font-size: 20px; + //background-color: #F2E7D5; + } } + + span:nth-child(1) { + position: relative; + left: 10px; + top: 60px; + height: 20px; + //background-color: rgb(135, 100, 34); + } + + span:nth-child(2) { + position: relative; + top: 60px; + left: 110px; + height: 20px; + //background-color: rgb(31, 216, 114); + } + + span:nth-child(3) { + position: relative; + top: 60px; + left: 110px; + height: 20px; + //background-color: rgb(16, 123, 211); + } + + .RentList-priceBox{ + width: auto; + position: relative; + //background-color: rgb(239, 179, 191); + left: 350px; + top:60px; + height: 20px; + } + + .Rent-ButtonBox{ + width: 30px; + position: relative; + //background-color: rgb(239, 179, 191); + left: 528px; + top:60px; + height: 20px; + + button{ + width:30px; + position: absolute; + } + } + } } + } + } } } \ No newline at end of file diff --git a/src/Components/Views/MyPage/MyPage.tsx b/src/Components/Views/MyPage/MyPage.tsx index 839342c9..67fb955a 100644 --- a/src/Components/Views/MyPage/MyPage.tsx +++ b/src/Components/Views/MyPage/MyPage.tsx @@ -4,26 +4,79 @@ import { Link } from "react-router-dom"; import "./MyPage.scss"; function MyPage() { - /* 구현해야할일 - 1. 아임포트 결제 내역을 조회해오기 위해서는 acesstoken 이 필요함. - 2. 이 acesstoken 을 발급받기 위해서는 POST /users/getToken 을 사용해 헤더에 API 키, API secret 보낸후 - 발급받음. - 3. 발급받은 acesstoken 은 30분마다 새롭게 발급받아야함. - 4. 그럼 헤더에 보내는 관리자 api키 , API secret 은 고정으로 있기때문에 만약 30분이 지나 기존 - acesstoken 맞지 않을때 , 기존 acesstoken 값을 삭제함과 동시에 새로 발급 받을수 있도록 조건식을 써야함. - 5. 그렇게 30분마다 기존 토큰값을 삭세한후 새로운 토큰 값을 사용해 결제 내역을 받아옴 - () - */ - useEffect(() => { - async function fetchdata() { - const { data } = await axios.get( - "/iamport/status/all?limit=20&sorting=-started&_token=a293f3ff21b8cfdc954b49b6957eef717c6e580a" - ); - console.log("data:", data); - } - fetchdata(); - }, []); + const TopCategory = { + orderId:'주문번호', + orderDate:'주문날짜', + productname:'상품이름', + price:'상품가격', + cancel:'구매취소' + } as const; + +const [itemList, setItemList] = useState([]); +const [mydataList, setMydataList] = useState([]); + +useEffect(() => { + const paynumber = window.localStorage.getItem("mypayment"); + const merchantUids = JSON.parse(paynumber); + + axios({ + method: "post", + url: "/iamport/users/getToken", + data: JSON.stringify({ + imp_key: "5758023681388354", + imp_secret: "tCdwGmiflqhMA3It54n6aLBIeA7LCg0O3WYu5qI1SKpwQ85FKXtJsiHu8yUWTynhDx7fxCFY1wsA3KVc", + }), + headers: { "Content-Type": "application/json" }, + }) + .then((res) => res.data.response) + .then((data) => { + axios.get(`/iamport/payments/status/paid?limit=20&sorting=paid&_token=${data.access_token}`) + .then((res) => res.data.response) + .then((res) => { + if (res && res.list) { + const filteredList = res.list.filter((item) => merchantUids.includes(item.merchant_uid)); + setItemList(filteredList); + } else { + console.log('Invalid response format'); + } + }) + .catch((error) => { + console.log('Error occurred:', error); + }); + }); +}, []); + +useEffect(() => { + const useData = itemList.filter((item) => item.custom_data); + useData.forEach((item) => { + if(item.custom_data){ + let parsedData = JSON.parse(item.custom_data); + parsedData = parsedData.map((data) => ({ + ...data, + paid_at: item.paid_at, //결제날짜 + merchant_uid: item.merchant_uid,//주문번호 + // Add more properties as needed + })); + setMydataList((prevDataList) => [...prevDataList, ...parsedData]); + } + }); +}, [itemList]); + +useEffect(() => { + console.log(mydataList); +},[mydataList]); + +const getDate = function(param){ + const date = new Date(param * 1000); + const koreaTime = date.toLocaleString("ko-KR", { + timeZone: "Asia/Seoul", + year: "numeric", + month: "2-digit", + day: "2-digit", + }); + return koreaTime; +} return ( <> @@ -54,29 +107,71 @@ function MyPage() {
+
구매 내역
+ +
-
구매 내역
+
+ {Object.keys(TopCategory).map(key => { + return + {TopCategory[key]} + + })} +
-
-
-
-
-
+ {mydataList + .filter(el => el.gubun === 'buy') + .map((item, index) => ( + +
+ {item.merchant_uid.replace("mid_","")} + {getDate(item.paid_at)} +
+ 책이미지 + {item.product_name} +
+ {item.price} +
+ +
+
+ + ))}
-
-
-
대여 내역
-
- {/*
-
-
-
*/} +
대여 내역
+
+
+ {Object.keys(TopCategory).map(key => { + return + {TopCategory[key]} + + })} +
+
+ {mydataList + .filter(el => el.gubun === 'rent') + .map((item, index) => ( + +
+ {item.merchant_uid.replace("mid_","")} + {getDate(item.paid_at)} +
+ 책이미지 + {item.product_name} +
+ {item.price} +
+ +
+
+ + ))}
-
+
diff --git a/src/Components/Views/MyPage/UserInfo.scss b/src/Components/Views/MyPage/UserInfo.scss index 58c842e8..bd813df9 100644 --- a/src/Components/Views/MyPage/UserInfo.scss +++ b/src/Components/Views/MyPage/UserInfo.scss @@ -1,4 +1,4 @@ - .myPageContainer{ + .myPageeContainer{ background-color: white; width: 1200px; height: 900px; diff --git a/src/Components/Views/MyPage/UserInfo.tsx b/src/Components/Views/MyPage/UserInfo.tsx index a5eaa497..b5d1e744 100644 --- a/src/Components/Views/MyPage/UserInfo.tsx +++ b/src/Components/Views/MyPage/UserInfo.tsx @@ -55,7 +55,7 @@ function UserInfo() { return ( <> -
+
My Page
diff --git a/vite.config.ts b/vite.config.ts index eb282fed..ad417abd 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -21,7 +21,7 @@ export default defineConfig({ rewrite: (path) => path.replace(/^\/cafe24/, ""), }, "/iamport": { - target: "https://api.iamport.kr/payments", + target: "https://api.iamport.kr/", changeOrigin: true, secure: false, rewrite: (path) => path.replace(/^\/iamport/, ""), From 8b5aaae154d420539ae429747d1aded6a7a98634 Mon Sep 17 00:00:00 2001 From: moon daehyun Date: Thu, 22 Jun 2023 21:04:30 +0900 Subject: [PATCH 35/75] =?UTF-8?q?feat:=20css=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Common/Form/Login/login.scss | 7 +- src/Common/Form/Login/login.tsx | 3 +- src/Common/Form/Signin/join.scss | 13 +- src/Common/Layout/Footer/footer.scss | 5 +- src/Common/Layout/Header/header.tsx | 44 ++- src/Common/Layout/Header/headers.scss | 79 +++- .../Views/CartPage/CartItems/CartItems.scss | 13 +- src/Components/Views/CartPage/CartPage.scss | 4 +- .../Views/CartPage/CartRent/CartRent.scss | 4 +- .../Views/DetailPage/DetailPage.scss | 4 +- .../DetailPage/components/TopHeader.scss | 2 +- .../Views/MainPage/Component/Carousel.scss | 1 + src/Components/Views/MainPage/MainPage.scss | 2 +- src/Components/Views/MyPage/MyPage.tsx | 4 +- src/Components/Views/MyPage/UserInfo copy.tsx | 226 ----------- src/Components/Views/MyPage/UserInfo.scss | 11 +- src/Components/Views/MyPage/UserInfo.tsx | 361 ++++++++---------- src/Components/Views/MyPage/UserInfo1.tsx | 236 ------------ 18 files changed, 300 insertions(+), 719 deletions(-) delete mode 100644 src/Components/Views/MyPage/UserInfo copy.tsx delete mode 100644 src/Components/Views/MyPage/UserInfo1.tsx diff --git a/src/Common/Form/Login/login.scss b/src/Common/Form/Login/login.scss index cb1c8485..9d6f1190 100644 --- a/src/Common/Form/Login/login.scss +++ b/src/Common/Form/Login/login.scss @@ -59,6 +59,9 @@ height: 50px; color: black; background-color: #F7E9D7; + // border: solid 2px #F7E9D7; + cursor: pointer; + border-radius: 10px; } } } @@ -68,9 +71,11 @@ width: 350px; height: 20px; //background-color: teal; + // padding-top: 20px; font-size: 18px; position: absolute; - bottom: 300px; + bottom: 350px; left: 445px; + } } \ No newline at end of file diff --git a/src/Common/Form/Login/login.tsx b/src/Common/Form/Login/login.tsx index 106e5a66..3a30f54c 100644 --- a/src/Common/Form/Login/login.tsx +++ b/src/Common/Form/Login/login.tsx @@ -53,6 +53,7 @@ function Login() { alert("로그인 되었습니다!"); window.localStorage.setItem("token", data.accessToken); navigate("/"); + location.reload(); } else { alert("로그인에 실패하였습니다. 다시 시도해주세요."); } @@ -95,7 +96,7 @@ function Login() {
diff --git a/src/Common/Form/Signin/join.scss b/src/Common/Form/Signin/join.scss index 774207f5..eb97148f 100644 --- a/src/Common/Form/Signin/join.scss +++ b/src/Common/Form/Signin/join.scss @@ -1,16 +1,18 @@ @mixin Container { width: 1200px; - //height: 780px; + height: 900px; padding-bottom: 80px; - background-color: aqua; + // background-color: aqua; position: relative; - left: 300px; + // left: 300px; + margin: 0 auto; } @mixin FormContainerStyle { width: 500px; height: 700px; position: relative; + // border: solid 1px #c6c6c6; border-radius: 10px; top: 50px; margin: auto; @@ -73,7 +75,7 @@ span { width: 260px; - //background-color: oldlace; + // background-color: oldlace; position: relative; margin: 0 auto; top:10px; @@ -98,6 +100,9 @@ height: 50px; color: black; background-color: #F7E9D7; + // border: solid 1px #dfdfdf; + border-radius: 10px; + cursor: pointer; } } } diff --git a/src/Common/Layout/Footer/footer.scss b/src/Common/Layout/Footer/footer.scss index 06d4db67..e3e83458 100644 --- a/src/Common/Layout/Footer/footer.scss +++ b/src/Common/Layout/Footer/footer.scss @@ -1,7 +1,8 @@ footer { - background-color: #f6f4ef; - padding-bottom: 100px; + background-color: rgb(255, 255, 255); + height: 100px; position: relative; + border-top: solid 2px rgb(202, 159, 18); .Footer-inner { display: flex; diff --git a/src/Common/Layout/Header/header.tsx b/src/Common/Layout/Header/header.tsx index c2e01b59..3e9c6e6f 100644 --- a/src/Common/Layout/Header/header.tsx +++ b/src/Common/Layout/Header/header.tsx @@ -1,4 +1,6 @@ import { Link, useNavigate } from "react-router-dom"; +import axios from "axios"; +import { useEffect, useState } from "react"; //import { useSelector } from 'react-redux'; import "./headers.scss"; //import { RootState } from '../_reducers'; @@ -6,11 +8,17 @@ import "./headers.scss"; //import { logoutUser } from '_reducers/user_reducer'; import { LogoutForm } from "@/Apis/register"; +interface User { + displayName: string // 사용자 표시 이름 + profileImg: string // 사용자 프로필 이미지 URL +} + function Header() { // const userState = useSelector((state) => state.user); // const accessToken = userState.accessToken; // console.log("1", accessToken); // const dispatch = useDispatch(); + const [user, setUser] =useState({} as User) const navigate = useNavigate(); @@ -20,6 +28,7 @@ function Header() { localStorage.removeItem("token"); alert("로그아웃 되셨습니다"); navigate("/"); + // location.reload(); }) .catch((error: string) => { console.log("Logout failed:", error); @@ -28,6 +37,27 @@ function Header() { const token = localStorage.getItem("token"); + + async function authenticate() { + axios('https://asia-northeast3-heropy-api.cloudfunctions.net/api/auth/me',{ + method:"post", + headers:{ + Authorization: `Bearer ${localStorage.getItem("token")}`, + "Content-Type": "application/json", + apikey: "KDT5_nREmPe9B", + username: "KDT5_TeamWink", + }, + }).then((res) => { + console.log("res:",res); + setUser(res.data); + }) + } + + + useEffect(() => { + authenticate() + }, []) + return ( <>
@@ -36,7 +66,7 @@ function Header() { logo
- +
@@ -47,8 +77,15 @@ function Header() { 마이페이지 {token ? ( -
-

로그아웃

+ //
+
+
로그아웃
+
+ +
) : ( <> @@ -60,7 +97,6 @@ function Header() { )} -
diff --git a/src/Common/Layout/Header/headers.scss b/src/Common/Layout/Header/headers.scss index 5ed56426..5aee14b4 100644 --- a/src/Common/Layout/Header/headers.scss +++ b/src/Common/Layout/Header/headers.scss @@ -1,19 +1,19 @@ + .headerContainer{ width: 100%; margin: auto; height: 80px; - background-color: white; + background-color: rgb(255, 255, 255); border-bottom: 2px solid rgb(202, 159, 18); - max-width: 1920px; + // max-width: 1920px; //position: relative; .itemsWrapper{ - //width: 80%; - width: 1400px; + width: 80%; margin: 0 auto; left: 0; right: 0; - //background-color: greenyellow; + // background-color: greenyellow; display: flex; position: absolute; justify-content: space-between; @@ -25,7 +25,7 @@ height: 50px; display: inline-block; position: relative; - //background-color: aqua; + // background-color: aqua; img{ width: 80px; @@ -37,43 +37,84 @@ } .searchBox{ - width: 270px; - height: 40px; - background-color: white; - border-radius: 10px; - margin-top: 10px; + margin-top: 20px; input{ - margin: auto; + padding-left: 30px; + border: solid 1px #c6c6c6; + border-radius: 10px; + margin: 0 auto; display: flex; height: 40px; - width: 250px; + width: 400px; outline: none; - border: none; + left: 0; + right: 0; + // background-color:aqua; } } - .Header-box { display: flex; - //vertical-align: top; + // vertical-align: top; align-items: center; gap: 30px; height: 30px; margin-top: 20px; - //max-width: 1230px; - background-color: yellow; + // max-width: 1230px; + // background-color: yellow; .Header-box__text{ text-Decoration:none; color: gray; font-weight: bold; + cursor: pointer; + display: flex; + + .Header-box__logout{ + padding: 15px 20px 0 0; + } } .cart { + // border: solid 1px red; + position: relative; width: 50px; height: 50px; - background-color: red; + border-radius: 50%; + overflow: hidden; + border: none; + background-position: center; + background-size: contain; + background-repeat: no-repeat; + overflow: hidden; + object-fit: cover; + + .cartPhoto{ + // border: solid 1px blue; + + // position: absolute; + // width: 100%; + // height: 100%; + // top: 0; + // left: 0; + // object-fit: cover; + + cursor:auto; + box-sizing: border-box; + position: relative; + // top:-5px; + // left:-5px; + width: 50px; + height: 50px; + // border-width:2px; + border-radius: 50%; + background-position: center; + background-size: contain; + background-repeat: no-repeat; + overflow: hidden; + object-fit: cover; + } } } diff --git a/src/Components/Views/CartPage/CartItems/CartItems.scss b/src/Components/Views/CartPage/CartItems/CartItems.scss index d8e01efa..3406486e 100644 --- a/src/Components/Views/CartPage/CartItems/CartItems.scss +++ b/src/Components/Views/CartPage/CartItems/CartItems.scss @@ -71,11 +71,11 @@ .ImageBox{ width: 100px; - //height: 100px; + // height: 100px; position: relative; bottom: 10px; - margin-left: 120px; - background-color: rebeccapurple; + margin-left: 140px; + // background-color: rebeccapurple; img{ //position: absolute; @@ -91,6 +91,7 @@ position: absolute; top: 50px; left: 260px; + text-align: center; span:nth-child(1) { font-size: 20px; @@ -111,16 +112,16 @@ top: 50px; position: absolute; right: 370px; - background-color: olivedrab; + // background-color: olivedrab; font-size: 15px; } .CartButtonBox{ width: 60px; position: absolute; - top: 30px; + top: 35px; right: 100px; - //background-color: burlywood; + // background-color: burlywood; button{ display: block; diff --git a/src/Components/Views/CartPage/CartPage.scss b/src/Components/Views/CartPage/CartPage.scss index e19d934a..8e2d4d5c 100644 --- a/src/Components/Views/CartPage/CartPage.scss +++ b/src/Components/Views/CartPage/CartPage.scss @@ -125,7 +125,7 @@ .Buy-ButtonBox { width: 300px; height: 55px; - background-color: firebrick; + // background-color: firebrick; position: relative; left: 650px; top: 70px; @@ -133,7 +133,7 @@ button { width: inherit; height: inherit; - border-radius: 5px; + border-radius: 10px; color: white; font-weight: bold; background-color: #f99417; diff --git a/src/Components/Views/CartPage/CartRent/CartRent.scss b/src/Components/Views/CartPage/CartRent/CartRent.scss index 4b2840e1..53084a1a 100644 --- a/src/Components/Views/CartPage/CartRent/CartRent.scss +++ b/src/Components/Views/CartPage/CartRent/CartRent.scss @@ -116,7 +116,7 @@ position: absolute; top: 20px; right: 80px; - background-color: olivedrab; + // background-color: olivedrab; display: table-column; font-size: 18px; @@ -126,7 +126,7 @@ margin: 0 auto; left: 0; right: 0; - background-color: #bff12b; + // background-color: #bff12b; } } } diff --git a/src/Components/Views/DetailPage/DetailPage.scss b/src/Components/Views/DetailPage/DetailPage.scss index 955005d0..dde30f94 100644 --- a/src/Components/Views/DetailPage/DetailPage.scss +++ b/src/Components/Views/DetailPage/DetailPage.scss @@ -19,6 +19,7 @@ position: absolute; color: white; border: none; + border-radius: 10px; cursor: pointer; } @@ -44,6 +45,7 @@ top: 60px; left: 100px; z-index: 100; + .TitleBox{ position: absolute; @@ -78,7 +80,7 @@ margin: auto; left: 0; right: 0; - + img{ position: absolute; margin: 0 auto; diff --git a/src/Components/Views/DetailPage/components/TopHeader.scss b/src/Components/Views/DetailPage/components/TopHeader.scss index b947a19e..9421b839 100644 --- a/src/Components/Views/DetailPage/components/TopHeader.scss +++ b/src/Components/Views/DetailPage/components/TopHeader.scss @@ -1,5 +1,5 @@ .TopHeader-container{ - + .TopHeader-container__text{ width:700px; diff --git a/src/Components/Views/MainPage/Component/Carousel.scss b/src/Components/Views/MainPage/Component/Carousel.scss index f9fde8fe..9cf06b6a 100644 --- a/src/Components/Views/MainPage/Component/Carousel.scss +++ b/src/Components/Views/MainPage/Component/Carousel.scss @@ -29,6 +29,7 @@ top: 0; left: 0; object-fit: cover; + // background-color: red; } } .navigation { diff --git a/src/Components/Views/MainPage/MainPage.scss b/src/Components/Views/MainPage/MainPage.scss index d59f3e82..58005f20 100644 --- a/src/Components/Views/MainPage/MainPage.scss +++ b/src/Components/Views/MainPage/MainPage.scss @@ -1,7 +1,7 @@ .wrapper { width: 1500px; margin: 100px auto 0; - //background-color: yellow; + // background-color: yellow; position: relative; } a { diff --git a/src/Components/Views/MyPage/MyPage.tsx b/src/Components/Views/MyPage/MyPage.tsx index 839342c9..07576a87 100644 --- a/src/Components/Views/MyPage/MyPage.tsx +++ b/src/Components/Views/MyPage/MyPage.tsx @@ -42,11 +42,11 @@ function MyPage() {
- +
주문내역조회
{" "}
- +
회원정보 수정
{" "}
diff --git a/src/Components/Views/MyPage/UserInfo copy.tsx b/src/Components/Views/MyPage/UserInfo copy.tsx deleted file mode 100644 index 84c5b6e8..00000000 --- a/src/Components/Views/MyPage/UserInfo copy.tsx +++ /dev/null @@ -1,226 +0,0 @@ -import { FormEvent, useState, useEffect, ChangeEvent, useCallback, useRef } from "react"; -import axios from "axios"; -import { Link, useNavigate } from "react-router-dom"; -import "./UserInfo.scss"; -import { ReadStream } from "fs"; - -interface User { - displayName: string // 사용자 표시 이름 - profileImg: string // 사용자 프로필 이미지 URL -} - -function UserInfo() { - - // 이름 , 프로필사진 , 구 비밀번호 , 새 비밀번호 - const [user, setUser] =useState({} as User) - const [displayName, setDisplayName] = useState({} as User); // {} as User - // const [profileImgBase64, setProfileImgBase64] = useState(""); - const [oldPassword, setOldPassword] = useState(""); - const [newPassword, setNewPassword] = useState(""); - - const [profileImg, setProfileImg] = useState(""); - - - - - - async function Image(event: Event) { - const files = (event.target as HTMLInputElement).files as FileList - for (const file of files) { - const reader = new FileReader() - reader.readAsDataURL(file) - reader.addEventListener('load', e=> { - setProfileImg((e.target as FileReader).result as string) - }) - } - - - // const d = await fetch("https://asia-northeast3-heropy-api.cloudfunctions.net/api/auth/user", { - // method:'PUT', - // headers:{ - // Authorization:`Bearer ${localStorage.getItem("token")}`, - // "Content-Type": "application/json", - // apikey: "KDT5_nREmPe9B", - // username: "KDT5_TeamWink", - // } - // }) - // const json = await res.json() - // console.log(json) - - - - return ( - <> -
-
- My Page -
- - - - - {/* */} - - {/*
*/} -
-
-

{displayName.displayName}

-
-
-
-
- -
주문내역조회
- {" "} -
- -
회원정보 수정
- {" "} -
- -
배송지 관리
- {" "} -
- -
결제수단 관리
- {" "} -
- -
1:1 문의
- {" "} -
-
-
- -
-
-
-
-
회원정보 수정
-
-
-
-
-
기존 비밀번호
-
- { - setOldPassword(e.target.value); - }} - /> -
-
-
-
새 비밀번호
-
- { - setNewPassword(e.target.value); - }} - /> -
-
-
-
닉네임 변경
-
- {/* { - setDisplayName(e.target.value); - }} - /> */} -
-
-
-
프로필 이미지
-
- - - - - {/* { - const files = e.target.files; - // console.log("111111", e.target.files); - // console.log("files:", files); - var reader = new FileReader(); - reader.onload = function (upload) { - if (upload.target != null) { - console.log( - // "asd:", - upload.target.result?.toString() - ); - setProfileImgBase64( - upload.target.result - ? upload.target.result.toString() - : "" - ); - } - }; - if (files != null) { - reader.readAsDataURL(files[0]); - } - // setProfileImgBase64(files); - // console.log("profileImgBase64:", profileImgBase64); - }} - /> */} - -
- - - -
-
-
- -
-
-
-
-
-
-
-
- - ); -} - -export default UserInfo; diff --git a/src/Components/Views/MyPage/UserInfo.scss b/src/Components/Views/MyPage/UserInfo.scss index e4739609..4f8b021b 100644 --- a/src/Components/Views/MyPage/UserInfo.scss +++ b/src/Components/Views/MyPage/UserInfo.scss @@ -8,6 +8,12 @@ .subContainer{ width: 25%; + + .subText{ + font-size: 15px; + padding: 0 0 0 15px; + + } .profile{ border: solid 1px rgb(221, 221, 221); position: relative; @@ -17,8 +23,9 @@ .profilePhoto{ position: relative; top:20px; - width: 120px; - height: 120px; + left:75px; + width: 150px; + height: 150px; margin-left: auto; margin-right: auto; border: solid 1px rgb(221,221,221); diff --git a/src/Components/Views/MyPage/UserInfo.tsx b/src/Components/Views/MyPage/UserInfo.tsx index 6e19aa10..38394b2f 100644 --- a/src/Components/Views/MyPage/UserInfo.tsx +++ b/src/Components/Views/MyPage/UserInfo.tsx @@ -1,241 +1,184 @@ -import { FormEvent, useState, useEffect, ChangeEvent, useCallback, useRef } from 'react'; -import axios from 'axios'; -import { Link, useNavigate } from 'react-router-dom'; -import './UserInfo.scss' -import { NONAME } from 'dns'; +import { FormEvent, useState, useEffect, ChangeEvent, useCallback, useRef } from "react"; +import axios from "axios"; +import { Link, useNavigate } from "react-router-dom"; +import "./UserInfo.scss"; +import { ReadStream } from "fs"; + +interface User { + displayName: string // 사용자 표시 이름 + profileImg: string // 사용자 프로필 이미지 URL +} function UserInfo() { const navigate = useNavigate(); // 이름 , 프로필사진 , 구 비밀번호 , 새 비밀번호 - const [displayName, setDisplayName] = useState(''); - const [profileImgBase64, setProfileImgBase64] = useState(''); - const [oldPassword, setOldPassword] = useState(''); - const [newPassword, setNewPassword] = useState(''); - - //비밀번호 유효성 검사 - const [isName, setIsName] = useState(false); - const [isOldPassword, setIsOldPassword] = useState(false); - const [isNewPasswordConfirm, setIsNewPasswordConfirm] = useState(false); - - //오류 메세지 저장 - const [nameMessage, setNameMessage] = useState(''); - const [passwordMessage, setPasswordMessage] = useState(''); - const [passwordConfirmMessage, setPasswordConfirmMessage] = useState(''); - + const [user, setUser] =useState({} as User) + const [displayName, setDisplayName] = useState(); // {} as User + const [profileImgBase64, setProfileImgBase64] = useState(""); + const [oldPassword, setOldPassword] = useState(""); + const [newPassword, setNewPassword] = useState(""); - async function submit(e) { + async function submit(e: any) { e.preventDefault(); try { - const res = await axios.put('https://asia-northeast3-heropy-api.cloudfunctions.net/api/auth/user', { - displayName: displayName, // 새로운 표시 이름 - profileImgBase64: profileImgBase64, // 사용자 프로필 이미지(base64) - jpg, jpeg, webp, png, gif, svg - oldPassword: oldPassword, // 기존 비밀번호 - newPassword: newPassword // 새로운 비밀번호 - }, { - headers: { - Authorization: `Bearer ${localStorage.getItem('token')}`, - 'Content-Type': 'application/json', - apikey: 'KDT5_nREmPe9B', - username: 'KDT5_TeamWink', - } - }) - }catch(err){ - console.log(err) + const res = await axios.put("https://asia-northeast3-heropy-api.cloudfunctions.net/api/auth/user", { + displayName: displayName, // 새로운 표시 이름 + profileImgBase64: profileImgBase64, // 사용자 프로필 이미지(base64) - jpg, jpeg, webp, png, gif, svg + oldPassword: oldPassword, // 기존 비밀번호 + newPassword: newPassword, // 새로운 비밀번호 + },{ + headers: { + Authorization: `Bearer ${localStorage.getItem("token")}`, + "Content-Type": "application/json", + apikey: "KDT5_nREmPe9B", + username: "KDT5_TeamWink", + }, + }, + ); + alert("수정완료"); + window.location.reload(); + } catch (err) { + console.error("error"); + alert("수정 실패"); + window.location.reload(); } } - const onChangeName = useCallback((e: React.ChangeEvent) => { - setDisplayName(e.target.value); - if (e.target.value.length < 2 || e.target.value.length > 21) { - setNameMessage('2글자 이상 21글자 미만으로 입력해주세요.'); - setIsName(false); - } else { - setNameMessage('올바른 이름 형식입니다 '); - setIsName(true); - } - }, []); - - const onChangePassword = useCallback( - (e: React.ChangeEvent) => { - const passwordCurrent = e.target.value; - setOldPassword(passwordCurrent); - - if (!PwCheck(passwordCurrent)) { - setPasswordMessage('8자리 이상 입력해주세요.'); - setIsOldPassword(false); - } else { - setPasswordMessage('안전한 비밀번호에요 '); - setIsOldPassword(true); - } - }, - [oldPassword] - ); - - const onChangePasswordConfirm = ( - password: any, - confirmPassword: any, - setPasswordConfirmMessage: any, - setIsPasswordConfirm: any - ) => { - if (password === confirmPassword) { - setPasswordConfirmMessage('비밀번호를 똑같이 입력했어요.'); - setIsPasswordConfirm(true); - } else { - setPasswordConfirmMessage('비밀번호가 틀립니다. 다시 입력해주세요.'); - setIsPasswordConfirm(false); + function uploadImage(event: Event){ + const files = (event.target as HTMLInputElement).files as FileList + for (const file of files) { + const reader = new FileReader() + reader.readAsDataURL(file) // 파일을 base64형식으로 읽음 + reader.addEventListener('load', e => { + setProfileImgBase64((e.target as FileReader).result as string) + }) } - }; - - const onPasswordConfirmChange = useCallback( - (e: React.ChangeEvent) => { - const passwordConfirmCurrent = e.target.value; - setNewPassword(passwordConfirmCurrent); - onChangePasswordConfirm( - oldPassword, - passwordConfirmCurrent, - setPasswordConfirmMessage, - setIsNewPasswordConfirm - ); - }, - [oldPassword] - ); + } + async function authenticate() { + axios('https://asia-northeast3-heropy-api.cloudfunctions.net/api/auth/me',{ + method:"post", + headers:{ + Authorization: `Bearer ${localStorage.getItem("token")}`, + "Content-Type": "application/json", + apikey: "KDT5_nREmPe9B", + username: "KDT5_TeamWink", + }, + }).then((res) => { + console.log("res:",res); + setUser(res.data); + + }) + } - return( - <> -
-
- My Page -
-
-
-
-

닉네임{displayName}

-
- {/*
-
-

자기소개

-
-
*/} + useEffect(() => { + authenticate() + }, []) + + + return ( + <> +
+
+
My Page
+
+ 프로필사진 +
+
+

{user.displayName}

-
- -
주문내역조회
-
- -
회원정보 수정
-
- -
배송지 관리
-
- -
결제수단 관리
-
- -
1:1 문의
-
-
+
+ +
주문내역조회
+ {" "} +
+ +
회원정보 수정
+ {" "} +
+
+
회원정보 수정
-
-
-
-
-
기존 비밀번호
-
-

- {oldPassword.length > 0 && ( - - {passwordMessage} - - )} -
+
+
+ +
+
기존 비밀번호
+
+ {setOldPassword(e.target.value)}} + />
-
-
새 비밀번호
-
-

- {newPassword.length > 0 && ( - - {passwordConfirmMessage} - - )} -
+
+
+
새 비밀번호
+
+ {setNewPassword(e.target.value)}} + />
-
-
닉네임 변경
-
-

- {displayName.length > 0 && ( - - {nameMessage} - - )} -
+
+
+
닉네임 변경
+
+ {setDisplayName(e.target.value)}} + />
-
-
프로필 이미지
-
- {/* */} - {/* - // */} - {setProfileImgBase64(e.target.value)}} - /> -
+
+
+
프로필 이미지
+
+
-
-
- {/* */} - -
+
+
+
+
- -
- +
+
diff --git a/src/Components/Views/MyPage/UserInfo1.tsx b/src/Components/Views/MyPage/UserInfo1.tsx deleted file mode 100644 index 74b6f241..00000000 --- a/src/Components/Views/MyPage/UserInfo1.tsx +++ /dev/null @@ -1,236 +0,0 @@ -import { FormEvent, useState, useEffect, ChangeEvent, useCallback, useRef } from 'react'; -import axios from 'axios'; -import { Link, useNavigate } from 'react-router-dom'; -import './UserInfo.scss' -import { NONAME } from 'dns'; -import { refreshToken } from '@/Apis/Token/token'; - -function UserInfo () { - const navigate = useNavigate(); - - - // 이름 , 프로필사진 , 구 비밀번호 , 새 비밀번호 - const [displayName, setDisplayName] = useState(''); - const [profileImgBase64, setProfileImgBase64] = useState(''); - const [oldPassword, setOldPassword] = useState(''); - const [newPassword, setNewPassword] = useState(''); - - - async function submit(e) { - e.preventDefault(); - - // const formData = new FormData(); - // formData.append("photo", files.length && files[0].uploadedFile); - // formData.append("comment", commentValue); - // formData.append("content_id", classData.content_id); - - // await axios({ - // method: "put", - // url: process.env.REACT_APP_STREAMING_COMMENT_URL, //환경변수 - // data: formData, - // headers: { "Content-Type": "multipart/form-data", Authorization: `Bearer ${localStorage.getItem('token')}` } - // }); - // setCommentValue(""); - // setFiles([]); - // }; - - // const handleUpload = (e) => { - // e.preventDefault(); - // const file = e.target.files[0]; - // setFiles([...files, { uploadedFile: file }]); - // }; - - - try { - const res = await axios.put('https://asia-northeast3-heropy-api.cloudfunctions.net/api/auth/user', { - displayName: displayName, // 새로운 표시 이름 - // profileImgBase64: profileImgBase64, // 사용자 프로필 이미지(base64) - jpg, jpeg, webp, png, gif, svg - oldPassword: oldPassword, // 기존 비밀번호 - newPassword: newPassword, // 새로운 비밀번호 - },{ - headers: { - Authorization: `Bearer ${localStorage.getItem('token')}`, - 'Content-Type': 'application/json', - // 'Content-Type': 'multipart/form-data', - apikey: 'KDT5_nREmPe9B', - username: 'KDT5_TeamWink', - } - }) - alert('수정완료'); - // console.log("res:",res) - }catch(err){ - console.error('error'); - alert('수정 실패'); - } - } - - - const onChangeImg = async (e: React.ChangeEvent) => { - e.preventDefault(); - - if(e.target.files){ - const uploadFile = e.target.files[0] - const formData = new FormData() - formData.append('files',uploadFile) - - await axios({ - url: 'https://asia-northeast3-heropy-api.cloudfunctions.net/api/auth/user', - method: 'put', - headers: { - Authorization: `Bearer ${localStorage.getItem('token')}`, - 'Content-Type': 'multipart/form-data', - apikey: 'KDT5_nREmPe9B', - username: 'KDT5_TeamWink', - }, - data: { - profileImgBase64: profileImgBase64, // 사용자 프로필 이미지(base64) - jpg, jpeg, webp, png, gif, svg - formData, - } - }); - } - } - - - // const goToMyPage = () => { - // navigate("/MyPage"); - // } - - return( - <> -
-
- My Page -
- - - - {/*
*/} -
-
-

{displayName}

-
-
-
-
- -
주문내역조회
-
- -
회원정보 수정
-
- -
배송지 관리
-
- -
결제수단 관리
-
- -
1:1 문의
-
-
-
- -
-
-
-
-
회원정보 수정
-
-
-
-
-
기존 비밀번호
-
- {setOldPassword(e.target.value)}} - /> -
-
-
-
새 비밀번호
-
- {setNewPassword(e.target.value)}} - /> -
-
-
-
닉네임 변경
-
- {setDisplayName(e.target.value)}} - /> -
-
-
-
프로필 이미지
-
- {/* */} - {/* - // */} - {setProfileImgBase64(e.target.value)}} - /> - {/* -
-
-
-
- -
-
- - - -
-
-
-
-
- - ) -} - - - - - -export default UserInfo From 5b68a7f3408bb52ebdcdb709f8125f38ea2fd49f Mon Sep 17 00:00:00 2001 From: moon daehyun Date: Thu, 22 Jun 2023 21:17:14 +0900 Subject: [PATCH 36/75] =?UTF-8?q?feat:=20css=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Components/Views/MainPage/Component/Genre.scss | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Components/Views/MainPage/Component/Genre.scss b/src/Components/Views/MainPage/Component/Genre.scss index a0b53ed1..494eee81 100644 --- a/src/Components/Views/MainPage/Component/Genre.scss +++ b/src/Components/Views/MainPage/Component/Genre.scss @@ -23,8 +23,10 @@ display: flex; flex-wrap: wrap; height: 918px; + border-radius: 0 5px 5px 0; border-top: 1px solid rgb(219, 218, 218); border-bottom: 1px solid rgb(219, 218, 218); + border-right:1px solid rgb(219, 218, 218); .Top-bookContainer{ position: absolute; From e57adb8621bf341f5ada091b9d09fc9960518f65 Mon Sep 17 00:00:00 2001 From: Seo Donguk Date: Thu, 22 Jun 2023 21:35:07 +0900 Subject: [PATCH 37/75] =?UTF-8?q?fix:=20detailpage=20scss=20=EC=A4=91?= =?UTF-8?q?=EA=B4=84=ED=98=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Views/DetailPage/DetailPage.scss | 521 +++++++++--------- 1 file changed, 258 insertions(+), 263 deletions(-) diff --git a/src/Components/Views/DetailPage/DetailPage.scss b/src/Components/Views/DetailPage/DetailPage.scss index 3def91f9..917ddf28 100644 --- a/src/Components/Views/DetailPage/DetailPage.scss +++ b/src/Components/Views/DetailPage/DetailPage.scss @@ -1,315 +1,310 @@ @mixin PriceContainer { - width: 300px; - height: 30px; - } - - @mixin PriceText { - font-size: 20px; - height: 30px; - } - - @mixin PriceNumber{ - font-size: 20px; - margin-left: 50px; + width: 300px; + height: 30px; +} + +@mixin PriceText { + font-size: 20px; + height: 30px; +} + +@mixin PriceNumber { + font-size: 20px; + margin-left: 50px; +} + +@mixin ButtonStyle { + width: 150px; + height: 50px; + position: absolute; + color: white; + border: none; + border-radius: 10px; + cursor: pointer; +} + +.DetailContainer { + position: relative; + width: 1400px; + margin: 0 auto; + left: 0; + right: 0; + font-family: 'SUITE-Regular'; + + .ImgContainer { + height: 780px; + position: relative; } - @mixin ButtonStyle{ - width: 150px; - height: 50px; + .LeftContainer { + width: 600px; + max-width: 500px; position: absolute; - color: white; - border: none; - border-radius: 10px; - cursor: pointer; - } + height: 650px; + top: 60px; + left: 100px; + z-index: 100; + .TitleBox { + position: absolute; + margin-top: 10px; + padding-bottom: 5px; + border-bottom: 2px solid black; - .DetailContainer { - position: relative; - width: 1400px; - margin: 0 auto; - left: 0; - right: 0; - font-family: 'SUITE-Regular'; + span:nth-child(1) { + font-size: 30px; + } + + span:nth-child(2) { + font-size: 15px; + margin-left: 20px; + } + + .InnerTitleBox { + width: 500px; - .ImgContainer{ - height: 780px; + p { + margin-top: 10px; + font-size: 15px; + } + } + } + .BookimgBox { + padding-bottom: 500px; + border-radius: 10px; + border: 2px solid rgb(116, 45, 1); position: relative; + top: 150px; + margin: auto; + left: 0; + right: 0; + + img { + position: absolute; + margin: 0 auto; + left: 0; + right: 0; + } + } + } + + .RightContainer { + width: 500px; + max-width: 500px; + padding-bottom: 540px; + position: absolute; + top: 100px; + right: 130px; + z-index: 100; + + .RightContainer-TopText { + width: 300px; + height: 60px; + font-size: 20px; + color: rgb(234, 72, 99); } - - .LeftContainer { - width: 600px; - max-width: 500px; + + .RightContainer-Content { + width: inherit; + height: 400px; position: absolute; - height: 650px; top: 60px; - left: 100px; - z-index: 100; - - - .TitleBox{ - position: absolute; - margin-top: 10px; - padding-bottom: 5px; - border-bottom: 2px solid black; - span:nth-child(1){ - font-size: 30px; - } - - span:nth-child(2) { - font-size: 15px; - margin-left: 20px; - } + .OriginPrice { + @include PriceContainer; + margin-top: 20px; - .InnerTitleBox{ - width: 500px; + .PriceText { + @include PriceText; + } - p{ - margin-top: 10px; - font-size: 15px; - } + .PriceNumber { + @include PriceNumber; } } - .BookimgBox{ - padding-bottom: 500px; - border-radius: 10px; - border: 2px solid rgb(116, 45, 1); + + .ContentContainer { + width: 400px; + height: 200px; + margin-top: 10px; position: relative; - top: 150px; - margin: auto; - left: 0; - right: 0; - - img{ + + .ContentBox { + width: 200px; + height: 100px; + font-size: 20px; + } + + .contentText { + width: 400px; + height: 100px; position: absolute; - margin: 0 auto; + top: 40px; left: 0; right: 0; } } - } - - .RightContainer{ - width: 500px; - max-width: 500px; - padding-bottom: 540px; - position: absolute; - top: 100px; - right: 130px; - z-index: 100; - - .RightContainer-TopText{ - width: 300px; - height: 60px; - font-size: 20px; - color: rgb(234, 72, 99); + + .CardPrice { + width: 450px; + height: 30px; + margin-top: 60px; + display: flex; + gap: 40px; + font-size: 18px; } - - .RightContainer-Content{ - width: inherit; - height: 400px; - position: absolute; - top: 60px; - - - .OriginPrice{ - @include PriceContainer; - margin-top: 20px; - - .PriceText{ - @include PriceText; - } - - .PriceNumber{ - @include PriceNumber; - } - } - - .ContentContainer{ - width: 400px; - height: 200px; - margin-top: 10px; - position: relative; - - .ContentBox{ - width: 200px; - height: 100px; - font-size: 20px; - } - - .contentText{ - width: 400px; - height: 100px; - position: absolute; - top: 40px; - left: 0; - right: 0; - } - } - .CardPrice{ - width: 450px; - height: 30px; - margin-top: 60px; - display: flex; - gap: 40px; - font-size: 18px; + .ButtonContainer { + width: 400px; + height: 50px; + position: relative; + margin-top: 20px; + + .CartAdd { + @include ButtonStyle; + background-color: #df307f; } - - .ButtonContainer{ - width: 400px; - height: 50px; - position: relative; - margin-top: 20px; - - .CartAdd{ - @include ButtonStyle; - background-color: #df307f; - } - - .BookBill{ - @include ButtonStyle; - background-color: #e24457; - right: 20px; - } + + .BookBill { + @include ButtonStyle; + background-color: #e24457; + right: 20px; } } } + } - .BookContent { - width: 1150px; - margin: auto; - border: 1px solid black; - margin-top: 50px !important; - } + .BookContent { + width: 1150px; + margin: auto; + border: 1px solid black; + margin-top: 50px !important; + } - .BookContent-text{ - width: 140px; - position: absolute; - padding-bottom: 10px; - background-color: rgb(253, 248, 248); - border-radius: 10px; - padding: 10px; - font-size: 23px; - font-weight: bold; - margin-top: 20px; - margin-left: 50px; - } + .BookContent-text { + width: 140px; + position: absolute; + padding-bottom: 10px; + background-color: rgb(253, 248, 248); + border-radius: 10px; + padding: 10px; + font-size: 23px; + font-weight: bold; + margin-top: 20px; + margin-left: 50px; + } - .TopBox { - width: 100%; - top: 0; - background-color: white; - right: 0; - font-size: 20px; - z-index: 1; - position: fixed; - border-bottom: 2px solid gray; - transition: transform 0.3s ease-in-out; - transform: translateY(-50px); - } + .TopBox { + width: 100%; + top: 0; + background-color: white; + right: 0; + font-size: 20px; + z-index: 1; + position: fixed; + border-bottom: 2px solid gray; + transition: transform 0.3s ease-in-out; + transform: translateY(-50px); + } - .TopBox.slide-down { - transform: translateY(-1px); /* Apply the slide-down transform value */ - } + .TopBox.slide-down { + transform: translateY(-1px); /* Apply the slide-down transform value */ + } + + .TopContentBox { + width: 130px; + margin: 0 auto; + background-color: darkcyan; + } + + .InnerContent { + padding-bottom: 20px; + width: 800px; + margin: 0 auto; + font-size: 20px !important; - .TopContentBox{ - width: 130px; + img { + width: 800px; margin: 0 auto; - background-color: darkcyan; } - - .InnerContent { - padding-bottom: 20px; + + a { + font-family: 'SUITE-Regular' !important; + background-color: #f8ede3 !important; + border-radius: 10px; width: 800px; - margin: 0 auto; + margin: 0 auto !important; + padding: 20px !important; font-size: 20px !important; + } - img { - width: 800px; - margin: 0 auto; - } + p { + background-color: #f8ede3 !important; + border-radius: 10px; + width: 800px; + margin: 0 auto !important; + padding: 20px !important; + font-size: 20px !important; + } - a { - font-family: 'SUITE-Regular' !important; - background-color: #f8ede3 !important; - border-radius: 10px; - width: 800px; - margin: 0 auto !important; - padding: 20px !important; - font-size: 20px !important; - } + span { + font-size: 18px !important; + } + } - p { - background-color: #f8ede3 !important; - border-radius: 10px; - width: 800px; - margin: 0 auto !important; - padding: 20px !important; - font-size: 20px !important; - } + .Bookple-Container { + width: 800px; + padding-bottom: 10px; + //background-color: aliceblue; + margin: auto; + position: relative; + border-bottom: 1px solid black; + border-top: 1px solid black; - span { - font-size: 18px !important; - } + .Bookple-Container__text { + width: 180px; + background-color: rgb(248, 244, 244); + position: absolute; + color: #0086cd; + left: -250px; + margin-top: 20px; + font-size: 20px; + padding: 10px; + font-size: 23px; + //font-weight: bold; + border-radius: 10px; } - .Bookple-Container{ - width: 800px; - padding-bottom: 10px; - //background-color: aliceblue; - margin: auto; + .Bookple-Container__coment { + width: 500px; + display: flex; + gap: 30px; + font-size: 20px; + font-weight: bold; position: relative; - border-bottom: 1px solid black; - border-top: 1px solid black; - - .Bookple-Container__text{ - width: 180px; - background-color: rgb(248, 244, 244); - position: absolute; - color: #0086cd; - left: -250px; - margin-top: 20px; - font-size: 20px; - padding: 10px; - font-size: 23px; - //font-weight: bold; - border-radius: 10px; - } - - .Bookple-Container__coment{ - width: 500px; - display: flex; - gap: 30px; - font-size: 20px; - font-weight: bold; - position: relative; - margin-top: 40px; - margin-left: 20px; - } + margin-top: 40px; + margin-left: 20px; } } +} + +.InnerContent { + width: 900px; + background-color: red; + height: auto; + display: block; + margin: 0 auto; + font-family: 'SUITE-Regular'; - .InnerContent{ + img { width: 900px; - background-color: red; - height: auto; - display: block; + //position: absolute; + display: flex; margin: 0 auto; - font-family: 'SUITE-Regular'; - - img{ - width: 900px; - //position: absolute; - display: flex; - margin: 0 auto; - } + } - p{ - font-family: 'SUITE-Regular' !important; - background-color: antiquewhite; - } - + p { + font-family: 'SUITE-Regular' !important; + background-color: antiquewhite; } } From 355054d011afff7c5a8498991cb50eb27217f40d Mon Sep 17 00:00:00 2001 From: saeyeon Date: Thu, 22 Jun 2023 21:48:11 +0900 Subject: [PATCH 38/75] test --- src/Common/Form/Login/login.tsx | 4 +- .../Views/CartPage/CartItems/CartItems.tsx | 32 +- .../Views/DetailPage/DetailPage.scss | 521 +++++++++--------- 3 files changed, 281 insertions(+), 276 deletions(-) diff --git a/src/Common/Form/Login/login.tsx b/src/Common/Form/Login/login.tsx index 3a30f54c..ddbfbd76 100644 --- a/src/Common/Form/Login/login.tsx +++ b/src/Common/Form/Login/login.tsx @@ -11,7 +11,6 @@ function Login() { const [email, setEmail] = useState(""); const [password, setPassword] = useState(""); - const onChangeEmail = (e: ChangeEvent) => { setEmail(e.target.value); }; @@ -20,7 +19,6 @@ function Login() { setPassword(e.target.value); }; - interface DataToSubmit { email: string; // 사용자 아이디 (필수!) password: string; // 사용자 비밀번호 (필수!) @@ -53,7 +51,7 @@ function Login() { alert("로그인 되었습니다!"); window.localStorage.setItem("token", data.accessToken); navigate("/"); - location.reload(); + // location.reload(); } else { alert("로그인에 실패하였습니다. 다시 시도해주세요."); } diff --git a/src/Components/Views/CartPage/CartItems/CartItems.tsx b/src/Components/Views/CartPage/CartItems/CartItems.tsx index bec5a8d1..32b5f4bd 100644 --- a/src/Components/Views/CartPage/CartItems/CartItems.tsx +++ b/src/Components/Views/CartPage/CartItems/CartItems.tsx @@ -24,27 +24,36 @@ interface CartItemsProps { pitem: string; setItems: React.Dispatch>; delete: (index: number, key: any) => void; - datalist : any - setdata : React.Dispatch>; - checkOne : any; - checkTwo : any; + datalist: any; + setdata: React.Dispatch>; + checkOne: any; + checkTwo: any; } -const CartItems = ({ check, pitem, setItems, delete: RemoveBuyItem, datalist, setdata, checkOne, checkTwo }: CartItemsProps) => { +const CartItems = ({ + check, + pitem, + setItems, + delete: RemoveBuyItem, + datalist, + setdata, + checkOne, + checkTwo, +}: CartItemsProps) => { const [buyItem, setbuyItem] = useState([]); const [checkedItems, setCheckedItems] = useState(check); useEffect(() => { - setbuyItem(datalist) + setbuyItem(datalist); }, [datalist]); const handleChange1 = (event: React.ChangeEvent) => { - setCheckedItems(checkOne(event, buyItem,'buy')); + setCheckedItems(checkOne(event, buyItem, "buy")); }; const handleChange2 = (el: any) => (event: React.ChangeEvent) => { - setCheckedItems(checkTwo(event, checkedItems,el)) + setCheckedItems(checkTwo(event, checkedItems, el)); }; const children = (el: any, index: number) => ( @@ -120,8 +129,11 @@ const CartItems = ({ check, pitem, setItems, delete: RemoveBuyItem, datalist, se
- - +
))} diff --git a/src/Components/Views/DetailPage/DetailPage.scss b/src/Components/Views/DetailPage/DetailPage.scss index 3def91f9..3cfb9473 100644 --- a/src/Components/Views/DetailPage/DetailPage.scss +++ b/src/Components/Views/DetailPage/DetailPage.scss @@ -1,315 +1,310 @@ @mixin PriceContainer { - width: 300px; - height: 30px; - } - - @mixin PriceText { - font-size: 20px; - height: 30px; - } - - @mixin PriceNumber{ - font-size: 20px; - margin-left: 50px; + width: 300px; + height: 30px; +} + +@mixin PriceText { + font-size: 20px; + height: 30px; +} + +@mixin PriceNumber { + font-size: 20px; + margin-left: 50px; +} + +@mixin ButtonStyle { + width: 150px; + height: 50px; + position: absolute; + color: white; + border: none; + border-radius: 10px; + cursor: pointer; +} + +.DetailContainer { + position: relative; + width: 1400px; + margin: 0 auto; + left: 0; + right: 0; + font-family: "SUITE-Regular"; + + .ImgContainer { + height: 780px; + position: relative; } - @mixin ButtonStyle{ - width: 150px; - height: 50px; + .LeftContainer { + width: 600px; + max-width: 500px; position: absolute; - color: white; - border: none; - border-radius: 10px; - cursor: pointer; - } + height: 650px; + top: 60px; + left: 100px; + z-index: 100; + .TitleBox { + position: absolute; + margin-top: 10px; + padding-bottom: 5px; + border-bottom: 2px solid black; - .DetailContainer { - position: relative; - width: 1400px; - margin: 0 auto; - left: 0; - right: 0; - font-family: 'SUITE-Regular'; + span:nth-child(1) { + font-size: 30px; + } + + span:nth-child(2) { + font-size: 15px; + margin-left: 20px; + } + + .InnerTitleBox { + width: 500px; - .ImgContainer{ - height: 780px; + p { + margin-top: 10px; + font-size: 15px; + } + } + } + .BookimgBox { + padding-bottom: 500px; + border-radius: 10px; + border: 2px solid rgb(116, 45, 1); position: relative; + top: 150px; + margin: auto; + left: 0; + right: 0; + + img { + position: absolute; + margin: 0 auto; + left: 0; + right: 0; + } + } + } + + .RightContainer { + width: 500px; + max-width: 500px; + padding-bottom: 540px; + position: absolute; + top: 100px; + right: 130px; + z-index: 100; + + .RightContainer-TopText { + width: 300px; + height: 60px; + font-size: 20px; + color: rgb(234, 72, 99); } - - .LeftContainer { - width: 600px; - max-width: 500px; + + .RightContainer-Content { + width: inherit; + height: 400px; position: absolute; - height: 650px; top: 60px; - left: 100px; - z-index: 100; - - - .TitleBox{ - position: absolute; - margin-top: 10px; - padding-bottom: 5px; - border-bottom: 2px solid black; - span:nth-child(1){ - font-size: 30px; - } - - span:nth-child(2) { - font-size: 15px; - margin-left: 20px; - } + .OriginPrice { + @include PriceContainer; + margin-top: 20px; - .InnerTitleBox{ - width: 500px; + .PriceText { + @include PriceText; + } - p{ - margin-top: 10px; - font-size: 15px; - } + .PriceNumber { + @include PriceNumber; } } - .BookimgBox{ - padding-bottom: 500px; - border-radius: 10px; - border: 2px solid rgb(116, 45, 1); + + .ContentContainer { + width: 400px; + height: 200px; + margin-top: 10px; position: relative; - top: 150px; - margin: auto; - left: 0; - right: 0; - - img{ + + .ContentBox { + width: 200px; + height: 100px; + font-size: 20px; + } + + .contentText { + width: 400px; + height: 100px; position: absolute; - margin: 0 auto; + top: 40px; left: 0; right: 0; } } - } - - .RightContainer{ - width: 500px; - max-width: 500px; - padding-bottom: 540px; - position: absolute; - top: 100px; - right: 130px; - z-index: 100; - - .RightContainer-TopText{ - width: 300px; - height: 60px; - font-size: 20px; - color: rgb(234, 72, 99); + + .CardPrice { + width: 450px; + height: 30px; + margin-top: 60px; + display: flex; + gap: 40px; + font-size: 18px; } - - .RightContainer-Content{ - width: inherit; - height: 400px; - position: absolute; - top: 60px; - - - .OriginPrice{ - @include PriceContainer; - margin-top: 20px; - - .PriceText{ - @include PriceText; - } - - .PriceNumber{ - @include PriceNumber; - } - } - - .ContentContainer{ - width: 400px; - height: 200px; - margin-top: 10px; - position: relative; - - .ContentBox{ - width: 200px; - height: 100px; - font-size: 20px; - } - - .contentText{ - width: 400px; - height: 100px; - position: absolute; - top: 40px; - left: 0; - right: 0; - } - } - .CardPrice{ - width: 450px; - height: 30px; - margin-top: 60px; - display: flex; - gap: 40px; - font-size: 18px; + .ButtonContainer { + width: 400px; + height: 50px; + position: relative; + margin-top: 20px; + + .CartAdd { + @include ButtonStyle; + background-color: #df307f; } - - .ButtonContainer{ - width: 400px; - height: 50px; - position: relative; - margin-top: 20px; - - .CartAdd{ - @include ButtonStyle; - background-color: #df307f; - } - - .BookBill{ - @include ButtonStyle; - background-color: #e24457; - right: 20px; - } + + .BookBill { + @include ButtonStyle; + background-color: #e24457; + right: 20px; } } } + } - .BookContent { - width: 1150px; - margin: auto; - border: 1px solid black; - margin-top: 50px !important; - } + .BookContent { + width: 1150px; + margin: auto; + border: 1px solid black; + margin-top: 50px !important; + } - .BookContent-text{ - width: 140px; - position: absolute; - padding-bottom: 10px; - background-color: rgb(253, 248, 248); - border-radius: 10px; - padding: 10px; - font-size: 23px; - font-weight: bold; - margin-top: 20px; - margin-left: 50px; - } + .BookContent-text { + width: 140px; + position: absolute; + padding-bottom: 10px; + background-color: rgb(253, 248, 248); + border-radius: 10px; + padding: 10px; + font-size: 23px; + font-weight: bold; + margin-top: 20px; + margin-left: 50px; + } - .TopBox { - width: 100%; - top: 0; - background-color: white; - right: 0; - font-size: 20px; - z-index: 1; - position: fixed; - border-bottom: 2px solid gray; - transition: transform 0.3s ease-in-out; - transform: translateY(-50px); - } + .TopBox { + width: 100%; + top: 0; + background-color: white; + right: 0; + font-size: 20px; + z-index: 1; + position: fixed; + border-bottom: 2px solid gray; + transition: transform 0.3s ease-in-out; + transform: translateY(-50px); + } - .TopBox.slide-down { - transform: translateY(-1px); /* Apply the slide-down transform value */ - } + .TopBox.slide-down { + transform: translateY(-1px); /* Apply the slide-down transform value */ + } + + .TopContentBox { + width: 130px; + margin: 0 auto; + background-color: darkcyan; + } + + .InnerContent { + padding-bottom: 20px; + width: 800px; + margin: 0 auto; + font-size: 20px !important; - .TopContentBox{ - width: 130px; + img { + width: 800px; margin: 0 auto; - background-color: darkcyan; } - - .InnerContent { - padding-bottom: 20px; + + a { + font-family: "SUITE-Regular" !important; + background-color: #f8ede3 !important; + border-radius: 10px; width: 800px; - margin: 0 auto; + margin: 0 auto !important; + padding: 20px !important; font-size: 20px !important; + } - img { - width: 800px; - margin: 0 auto; - } + p { + background-color: #f8ede3 !important; + border-radius: 10px; + width: 800px; + margin: 0 auto !important; + padding: 20px !important; + font-size: 20px !important; + } - a { - font-family: 'SUITE-Regular' !important; - background-color: #f8ede3 !important; - border-radius: 10px; - width: 800px; - margin: 0 auto !important; - padding: 20px !important; - font-size: 20px !important; - } + span { + font-size: 18px !important; + } + } - p { - background-color: #f8ede3 !important; - border-radius: 10px; - width: 800px; - margin: 0 auto !important; - padding: 20px !important; - font-size: 20px !important; - } + .Bookple-Container { + width: 800px; + padding-bottom: 10px; + //background-color: aliceblue; + margin: auto; + position: relative; + border-bottom: 1px solid black; + border-top: 1px solid black; - span { - font-size: 18px !important; - } + .Bookple-Container__text { + width: 180px; + background-color: rgb(248, 244, 244); + position: absolute; + color: #0086cd; + left: -250px; + margin-top: 20px; + font-size: 20px; + padding: 10px; + font-size: 23px; + //font-weight: bold; + border-radius: 10px; } - .Bookple-Container{ - width: 800px; - padding-bottom: 10px; - //background-color: aliceblue; - margin: auto; + .Bookple-Container__coment { + width: 500px; + display: flex; + gap: 30px; + font-size: 20px; + font-weight: bold; position: relative; - border-bottom: 1px solid black; - border-top: 1px solid black; - - .Bookple-Container__text{ - width: 180px; - background-color: rgb(248, 244, 244); - position: absolute; - color: #0086cd; - left: -250px; - margin-top: 20px; - font-size: 20px; - padding: 10px; - font-size: 23px; - //font-weight: bold; - border-radius: 10px; - } - - .Bookple-Container__coment{ - width: 500px; - display: flex; - gap: 30px; - font-size: 20px; - font-weight: bold; - position: relative; - margin-top: 40px; - margin-left: 20px; - } + margin-top: 40px; + margin-left: 20px; } } +} + +.InnerContent { + width: 900px; + background-color: red; + height: auto; + display: block; + margin: 0 auto; + font-family: "SUITE-Regular"; - .InnerContent{ + img { width: 900px; - background-color: red; - height: auto; - display: block; + //position: absolute; + display: flex; margin: 0 auto; - font-family: 'SUITE-Regular'; - - img{ - width: 900px; - //position: absolute; - display: flex; - margin: 0 auto; - } + } - p{ - font-family: 'SUITE-Regular' !important; - background-color: antiquewhite; - } - + p { + font-family: "SUITE-Regular" !important; + background-color: antiquewhite; } } From 748e999dd37fd48bebf93e3397ea1d17d46bd08d Mon Sep 17 00:00:00 2001 From: saeyeon Date: Fri, 23 Jun 2023 15:31:56 +0900 Subject: [PATCH 39/75] feat: searchpage router --- src/App.tsx | 10 +-- src/Common/Layout/Header/header.tsx | 64 +++++++++----- .../Views/CartPage/CartItems/CartItems.tsx | 55 +----------- .../Views/SearchPage/SearchPage.tsx | 87 +++++-------------- src/routes/routes.tsx | 2 + 5 files changed, 77 insertions(+), 141 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index 470ca64d..e34b4700 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,12 +1,12 @@ -import './App.scss'; -import RoutesPage from './routes/routes'; -import SearchPage from './Components/Views/SearchPage/SearchPage'; +import "./App.scss"; +import RoutesPage from "./routes/routes"; +import SearchPage from "./Components/Views/SearchPage/SearchPage"; function App() { return ( <> - {/* */} - + + {/* */} ); } diff --git a/src/Common/Layout/Header/header.tsx b/src/Common/Layout/Header/header.tsx index 3e9c6e6f..61751f7e 100644 --- a/src/Common/Layout/Header/header.tsx +++ b/src/Common/Layout/Header/header.tsx @@ -7,10 +7,11 @@ import "./headers.scss"; //import { useDispatch } from 'react-redux'; //import { logoutUser } from '_reducers/user_reducer'; import { LogoutForm } from "@/Apis/register"; +import SearchPage from "@/Components/Views/SearchPage/SearchPage"; interface User { - displayName: string // 사용자 표시 이름 - profileImg: string // 사용자 프로필 이미지 URL + displayName: string; // 사용자 표시 이름 + profileImg: string; // 사용자 프로필 이미지 URL } function Header() { @@ -18,10 +19,19 @@ function Header() { // const accessToken = userState.accessToken; // console.log("1", accessToken); // const dispatch = useDispatch(); - const [user, setUser] =useState({} as User) + const [user, setUser] = useState({} as User); + const [search, setSearch] = useState([] as Products); + const [input, setInput] = useState(""); + const [keyword, setKeyWord] = useState(""); const navigate = useNavigate(); + // const searchUpload = async () => { + // const result = await SearchAPI(input); + // setSearch(result); + // console.log(result); + // }; + const logoutHandler = () => { LogoutForm() .then(() => { @@ -34,29 +44,31 @@ function Header() { console.log("Logout failed:", error); }); }; + const onSubmit = async () => { + // window.location.href = "/search/" + keyword; + navigate("/search/" + keyword); + }; const token = localStorage.getItem("token"); - async function authenticate() { - axios('https://asia-northeast3-heropy-api.cloudfunctions.net/api/auth/me',{ - method:"post", - headers:{ + axios("https://asia-northeast3-heropy-api.cloudfunctions.net/api/auth/me", { + method: "post", + headers: { Authorization: `Bearer ${localStorage.getItem("token")}`, "Content-Type": "application/json", apikey: "KDT5_nREmPe9B", username: "KDT5_TeamWink", }, }).then((res) => { - console.log("res:",res); + console.log("res:", res); setUser(res.data); - }) + }); } - useEffect(() => { - authenticate() - }, []) + authenticate(); + }, []); return ( <> @@ -66,7 +78,20 @@ function Header() { logo
- + { + setKeyWord(e.target.value); + }} + /> +
@@ -78,14 +103,13 @@ function Header() { {token ? ( //
-
-
로그아웃
+
+
+ 로그아웃 +
- -
+ +
) : ( <> diff --git a/src/Components/Views/CartPage/CartItems/CartItems.tsx b/src/Components/Views/CartPage/CartItems/CartItems.tsx index 6bda40e1..32b5f4bd 100644 --- a/src/Components/Views/CartPage/CartItems/CartItems.tsx +++ b/src/Components/Views/CartPage/CartItems/CartItems.tsx @@ -1,4 +1,3 @@ -<<<<<<< HEAD import React, { useEffect } from "react"; import { useState } from "react"; import Box from "@mui/material/Box"; @@ -6,14 +5,6 @@ import Checkbox from "@mui/material/Checkbox"; import FormControlLabel from "@mui/material/FormControlLabel"; //import RemoveItemButton from "../Components/DeletButton"; import "./CartItems.scss"; -======= -import React, { useEffect } from 'react'; -import { useState } from 'react'; -import Box from '@mui/material/Box'; -import Checkbox from '@mui/material/Checkbox'; -import FormControlLabel from '@mui/material/FormControlLabel'; -import './CartItems.scss'; ->>>>>>> 9dd5bd33b85c19daa2055001fa2bb5c25bc900cf interface BuyItem { id: number; @@ -53,19 +44,8 @@ const CartItems = ({ const [checkedItems, setCheckedItems] = useState(check); useEffect(() => { -<<<<<<< HEAD setbuyItem(datalist); }, [datalist]); -======= - BuyCart(); - }, []); - - const BuyCart = () => { - const BuyItems = JSON.parse(localStorage.getItem('cart')) || []; - setbuyItem(BuyItems); - console.log(BuyItems); - }; ->>>>>>> 9dd5bd33b85c19daa2055001fa2bb5c25bc900cf const handleChange1 = (event: React.ChangeEvent) => { setCheckedItems(checkOne(event, buyItem, "buy")); @@ -79,10 +59,10 @@ const CartItems = ({ const children = (el: any, index: number) => ( ); -<<<<<<< HEAD -======= - const RemoveBuyItem = (index: number, key: any) => { - console.log(key); - const confirmation = window.confirm('삭제하시겠습니까?'); - if (confirmation) { - const updatedCartData = JSON.parse(localStorage.getItem('cart')); - localStorage.setItem( - 'cart', - JSON.stringify( - updatedCartData.filter((item) => item.product_no !== key) - ) - ); - - const updatedBuyItem = [...buyItem]; - //선택한 index 1개를 buyItem 배열에서 제거. - updatedBuyItem.splice(index, 1); - // 제거한후의 값 setState 갑에 담아줌. - setbuyItem(updatedBuyItem); - // cart 키 값으로 로컬에서 데이터 찾아옴 - alert('삭제되었습니다.'); - } else { - alert('취소되었습니다.'); - } - }; - ->>>>>>> 9dd5bd33b85c19daa2055001fa2bb5c25bc900cf return ( <>
@@ -160,7 +113,7 @@ const CartItems = ({
{buyItem - .filter((el) => el.gubun === 'buy') + .filter((el) => el.gubun === "buy") .map((el, index) => (
{children(el, index)}
diff --git a/src/Components/Views/SearchPage/SearchPage.tsx b/src/Components/Views/SearchPage/SearchPage.tsx index 01967998..2e5da1ed 100644 --- a/src/Components/Views/SearchPage/SearchPage.tsx +++ b/src/Components/Views/SearchPage/SearchPage.tsx @@ -1,66 +1,21 @@ -import { useState } from 'react'; -import './SearchPage.scss'; -import axios from 'axios'; -// const dummy = [ -// { -// list_image: -// 'https://teamwink.cafe24.com/web/product/big/202306/6543ff6b482a7dfbf4275363d79e01dc.png', -// product_name: '피나 바우쉬(끝나지 않을 몸짓)', -// summary_description: -// "'현대 예술의 거장' 시리즈는 20세기를 전후한 문화 예술계에큰 영향력을 끼친 국내외 거장 아티스트의 평전으로 구성된다.", -// retail_price: '20000', -// price: '18000', -// }, -// { -// list_image: -// 'https://teamwink.cafe24.com/web/product/big/202306/23ee454750818ac377870ea574e832bd.png', -// product_name: '일향 강우방의 예술 혁명일지', -// summary_description: -// '우리나라 미술사학계를 대표하는 원로이자 현역으로 활동하는 강우방(83)의 자전적 에세이다.', -// retail_price: '20000', -// price: '18000', -// }, -// { -// list_image: -// 'https://teamwink.cafe24.com/web/product/big/202306/fd86c152ea5616135b40747f895a576c.png', -// product_name: '예술이 필요한 시간(전시 디자이너 에세이)', -// summary_description: -// '《에드워드 호퍼: 길 위에서》를 비롯해 까르띠에 현대미술재단 소장품전 《하이라이트》, 《빛: 영국 테이트미술관 특별전》 등 해외 유명 걸작전을 담당해온 전시 디자이너의 시선을 담아낸 책이다', -// retail_price: '20000', -// price: '18000', -// }, -// { -// list_image: -// 'https://teamwink.cafe24.com/web/product/big/202306/abc3fc36c0dad20454ad0433b4c662c5.png', -// product_name: '예썰의 전당: 서양미술 편(예술에 관한 세상의 모든 썰)', -// summary_description: -// "KBS 화제의 교양 프로그램 '예썰의 전당'을 책으로 만난다.", -// retail_price: '20000', -// price: '18000', -// }, -// { -// list_image: -// 'https://teamwink.cafe24.com/web/product/big/202306/84a72535341fa2d5966129b260f97857.png', -// product_name: -// '생성 예술의 시대(챗GPT가 말하고 DALL E가 그리는 인공지능 시대의 예술)', -// summary_description: -// '인공지능을 위시한 이 시대 가장 첨예한 신기술에 항상 주목해 왔던 뇌과학자 김대식이 이번에는 생성AI를 활용한 AI 그림의 가능성에 눈을 돌렸다', -// retail_price: '20000', -// price: '18000', -// }, -// ]; +import { useState, useEffect } from "react"; +import "./SearchPage.scss"; +import axios from "axios"; +import { useParams } from "react-router-dom"; + const { VITE_CLIENT_ID } = import.meta.env; const ajax = axios.create({ - baseURL: '/cafe24', + baseURL: "/cafe24", headers: { - 'Content-Type': 'application/json', - 'X-Cafe24-Api-Version': '2023-03-01', - 'X-Cafe24-Client-Id': VITE_CLIENT_ID, + "Content-Type": "application/json", + "X-Cafe24-Api-Version": "2023-03-01", + "X-Cafe24-Client-Id": VITE_CLIENT_ID, }, }); + async function SearchAPI(product_name: string) { try { - const res = await ajax.get('/products', { + const res = await ajax.get("/products", { params: { product_name: product_name, }, @@ -72,28 +27,30 @@ async function SearchAPI(product_name: string) { } export default function SearchPage() { - const [input, setInput] = useState(''); + const [input, setInput] = useState(""); const [search, setSearch] = useState([] as Products); + const params = useParams(); const searchInputChange = (e) => { setInput(e.target.value); }; - - const searchUpload = async () => { - const result = await SearchAPI(input); - setSearch(result); - console.log(result); - }; + useEffect(() => { + (async () => { + const result = await SearchAPI(params.keyword); + setSearch(result); + console.log(result); + })(); + }, [params]); return (
- - + */} {search && search.map((v) => { return ( diff --git a/src/routes/routes.tsx b/src/routes/routes.tsx index 44fefc9a..46566a59 100644 --- a/src/routes/routes.tsx +++ b/src/routes/routes.tsx @@ -8,6 +8,7 @@ import MyPage from "@/Components/Views/MyPage/MyPage"; import PrivatePage from "./privateRoute"; import DetailPage from "@/Components/Views/DetailPage/DetailPage"; import UserInfo from "@/Components/Views/MyPage/UserInfo"; +import SearchPage from "@/Components/Views/SearchPage/SearchPage"; import { Routes, BrowserRouter, Route, Outlet } from "react-router-dom"; @@ -31,6 +32,7 @@ function RoutesPage() { } /> } /> } /> + } /> } status={""} />} From f475233d03de408f62d158e8b9483e738174d665 Mon Sep 17 00:00:00 2001 From: saeyeon Date: Fri, 23 Jun 2023 15:40:26 +0900 Subject: [PATCH 40/75] test --- src/App.tsx | 4 +-- .../Views/SearchPage/SearchPage.tsx | 34 +++++++++++++++++++ 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index e34b4700..efbea74a 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -5,8 +5,8 @@ import SearchPage from "./Components/Views/SearchPage/SearchPage"; function App() { return ( <> - - {/* */} + {/* */} + ); } diff --git a/src/Components/Views/SearchPage/SearchPage.tsx b/src/Components/Views/SearchPage/SearchPage.tsx index 2e5da1ed..60be7d75 100644 --- a/src/Components/Views/SearchPage/SearchPage.tsx +++ b/src/Components/Views/SearchPage/SearchPage.tsx @@ -30,10 +30,15 @@ export default function SearchPage() { const [input, setInput] = useState(""); const [search, setSearch] = useState([] as Products); const params = useParams(); + const [offset, setOffset] = useState(0); const searchInputChange = (e) => { setInput(e.target.value); }; + + useEffect(() => { + searchUpload(); + }, [offset]); useEffect(() => { (async () => { const result = await SearchAPI(params.keyword); @@ -76,6 +81,35 @@ export default function SearchPage() {
); })} +
    { + if (e.target instanceof HTMLLIElement) { + setOffset(e.target.value); + // console.log("e:", e.target.value); + } + }} + style={{ + display: "flex", + justifyContent: "center", + paddingTop: 20, + paddingBottom: 20, + }} + > + {Array(parseInt(((count - 0.1) / 10 + 1).toString())) + .fill(0) + .map((i, index) => ( +
  • + +
  • + ))} +
); } From 3b381898ba17502d8df438824f897bf94488679c Mon Sep 17 00:00:00 2001 From: saeyeon Date: Fri, 23 Jun 2023 15:46:26 +0900 Subject: [PATCH 41/75] test --- .../Views/SearchPage/SearchPage.tsx | 55 +++++++++++-------- 1 file changed, 33 insertions(+), 22 deletions(-) diff --git a/src/Components/Views/SearchPage/SearchPage.tsx b/src/Components/Views/SearchPage/SearchPage.tsx index 60be7d75..f6d3628f 100644 --- a/src/Components/Views/SearchPage/SearchPage.tsx +++ b/src/Components/Views/SearchPage/SearchPage.tsx @@ -13,40 +13,51 @@ const ajax = axios.create({ }, }); -async function SearchAPI(product_name: string) { - try { - const res = await ajax.get("/products", { - params: { - product_name: product_name, - }, - }); - return res.data.products; - } catch (err) { - console.log(err); - } -} - export default function SearchPage() { const [input, setInput] = useState(""); const [search, setSearch] = useState([] as Products); const params = useParams(); const [offset, setOffset] = useState(0); + const [count, setCount] = useState(0); + + async function SearchAPI(product_name: string) { + try { + const res = await ajax.get("/products", { + params: { + product_name: product_name, + offset: offset * 10, + }, + }); + return res.data.products; + } catch (err) { + console.log(err); + } + } const searchInputChange = (e) => { setInput(e.target.value); }; useEffect(() => { - searchUpload(); - }, [offset]); - useEffect(() => { - (async () => { - const result = await SearchAPI(params.keyword); - setSearch(result); - console.log(result); - })(); - }, [params]); + const searchUpload = () => { + (async () => { + await ajax + .get("/products/count", { + params: { + product_name: input, + }, + }) + .then((res) => setCount(res.data.count)); + const result = await SearchAPI(params.keyword); + setSearch(result); + console.log(result); + })(); + }; + }, [params, offset]); + // useEffect(() => { + // searchUpload(); + // }, [offset]); return (
{/* Date: Fri, 23 Jun 2023 15:53:33 +0900 Subject: [PATCH 42/75] test --- .../Views/SearchPage/SearchPage.tsx | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/Components/Views/SearchPage/SearchPage.tsx b/src/Components/Views/SearchPage/SearchPage.tsx index f6d3628f..498945c1 100644 --- a/src/Components/Views/SearchPage/SearchPage.tsx +++ b/src/Components/Views/SearchPage/SearchPage.tsx @@ -34,17 +34,17 @@ export default function SearchPage() { } } - const searchInputChange = (e) => { - setInput(e.target.value); - }; + // const searchInputChange = (e: any) => { + // setInput(e.target.value); + // }; - useEffect(() => { - const searchUpload = () => { + const searchUpload = () => { + useEffect(() => { (async () => { await ajax .get("/products/count", { params: { - product_name: input, + product_name: params.keyword, }, }) .then((res) => setCount(res.data.count)); @@ -52,12 +52,12 @@ export default function SearchPage() { setSearch(result); console.log(result); })(); - }; - }, [params, offset]); + }, [params]); + }; - // useEffect(() => { - // searchUpload(); - // }, [offset]); + useEffect(() => { + searchUpload(); + }, [offset]); return (
{/* Date: Fri, 23 Jun 2023 16:18:43 +0900 Subject: [PATCH 43/75] test --- .../Views/SearchPage/SearchPage.tsx | 140 +++++++++--------- 1 file changed, 71 insertions(+), 69 deletions(-) diff --git a/src/Components/Views/SearchPage/SearchPage.tsx b/src/Components/Views/SearchPage/SearchPage.tsx index 498945c1..1327a5da 100644 --- a/src/Components/Views/SearchPage/SearchPage.tsx +++ b/src/Components/Views/SearchPage/SearchPage.tsx @@ -2,8 +2,8 @@ import { useState, useEffect } from "react"; import "./SearchPage.scss"; import axios from "axios"; import { useParams } from "react-router-dom"; - const { VITE_CLIENT_ID } = import.meta.env; + const ajax = axios.create({ baseURL: "/cafe24", headers: { @@ -16,9 +16,9 @@ const ajax = axios.create({ export default function SearchPage() { const [input, setInput] = useState(""); const [search, setSearch] = useState([] as Products); - const params = useParams(); const [offset, setOffset] = useState(0); const [count, setCount] = useState(0); + const params = useParams(); async function SearchAPI(product_name: string) { try { @@ -33,31 +33,28 @@ export default function SearchPage() { console.log(err); } } + useEffect(() => { + searchUpload(); + }, [offset]); - // const searchInputChange = (e: any) => { - // setInput(e.target.value); - // }; + const searchInputChange = (e: any) => { + setInput(e.target.value); + }; - const searchUpload = () => { - useEffect(() => { - (async () => { - await ajax - .get("/products/count", { - params: { - product_name: params.keyword, - }, - }) - .then((res) => setCount(res.data.count)); - const result = await SearchAPI(params.keyword); - setSearch(result); - console.log(result); - })(); - }, [params]); + const searchUpload = async () => { + await ajax + .get("/products/count", { + params: { + product_name: input, + }, + }) + .then((res) => setCount(res.data.count)); + const result = await SearchAPI(input); + setSearch(result); + console.log(result); }; + // console.log("search:", search); - useEffect(() => { - searchUpload(); - }, [offset]); return (
{/* { return ( -
-
- 책표지 -
-
-

{v.product_name}

-
-

{v.summary_description}

-

{v.product_tag}

+ <> +
+
+ 책표지 +
+ +
+

{v.product_name}

+
+

{v.summary_description}

+

{v.product_tag}

+
+
+

{v.price.slice(0, -3)}원

+

{v.retail_price.slice(0, -3)}원

+
-
-

{v.price.slice(0, -3)}원

-

{v.retail_price.slice(0, -3)}원

+
+ +
-
- - -
-
+ ); })} -
    { - if (e.target instanceof HTMLLIElement) { - setOffset(e.target.value); - // console.log("e:", e.target.value); - } - }} - style={{ - display: "flex", - justifyContent: "center", - paddingTop: 20, - paddingBottom: 20, - }} - > - {Array(parseInt(((count - 0.1) / 10 + 1).toString())) - .fill(0) - .map((i, index) => ( -
  • - -
  • - ))} -
+
+
    { + if (e.target instanceof HTMLLIElement) { + setOffset(e.target.value); + // console.log("e:", e.target.value); + } + }} + style={{ + display: "flex", + justifyContent: "center", + paddingTop: 20, + paddingBottom: 20, + }} + > + {Array(parseInt(((count - 0.1) / 10 + 1).toString())) + .fill(0) + .map((i, index) => ( +
  • + +
  • + ))} +
+
); } From 673dd5a762dad29d0d4aa9e9e0e9fdfab3d9c41f Mon Sep 17 00:00:00 2001 From: hahahaday12 Date: Mon, 26 Jun 2023 13:05:11 +0900 Subject: [PATCH 44/75] =?UTF-8?q?feat:=20=ED=95=84=EC=9A=94=EC=97=86?= =?UTF-8?q?=EB=8A=94=20=ED=8F=B4=EB=8D=94=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Components/Views/MyPage/test.jsx | 42 ---------------------------- 1 file changed, 42 deletions(-) delete mode 100644 src/Components/Views/MyPage/test.jsx diff --git a/src/Components/Views/MyPage/test.jsx b/src/Components/Views/MyPage/test.jsx deleted file mode 100644 index d3b7d09c..00000000 --- a/src/Components/Views/MyPage/test.jsx +++ /dev/null @@ -1,42 +0,0 @@ -import { useState } from "react"; -import axios from "axios"; - -export default function Test() { - const [name, setName] = useState(''); - const [pwd, setPwd] = useState(''); - - async function submit(e) { - e.preventDefault(); - - try { - const res = await axios.post('url', { - displayName: name, - newPassword: pwd - }, { - headers: { - Authorization: `Bearer ${accessToken}` - } - }) - }catch(err){ - console.log(err) - } - } - - return ( -
- {setName(e.target.value)}} - /> - {setPwd(e.target.value)}}/> - - -
- ) -} \ No newline at end of file From d0b8c09bd1b1b501c3f7da1f58b991fafbc65231 Mon Sep 17 00:00:00 2001 From: hahahaday12 Date: Mon, 26 Jun 2023 13:07:30 +0900 Subject: [PATCH 45/75] =?UTF-8?q?feat:=20=EA=B2=B0=EC=A0=9C=20=EC=B7=A8?= =?UTF-8?q?=EC=86=8C=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80=20-=20?= =?UTF-8?q?=EC=8A=A4=ED=83=80=EC=9D=BC=20=EC=88=98=EC=A0=95=20-=20?= =?UTF-8?q?=EB=8B=A4=EB=A5=B8=20=ED=8C=8C=EC=9D=BC=20=EB=B3=80=EA=B2=BD?= =?UTF-8?q?=EC=82=AC=ED=95=AD=20=EC=A0=80=EC=9E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Apis/register.tsx | 61 ++--- src/Common/Form/Login/login.tsx | 16 -- src/Common/Form/Signin/join.tsx | 11 +- src/Common/Layout/Footer/footer.tsx | 2 +- src/Common/Layout/Header/header.tsx | 55 ++-- src/Common/Layout/Header/headers.scss | 102 ++------ src/Components/Views/CartPage/CartPage.tsx | 27 -- .../Views/CartPage/Payment/Payment.tsx | 15 +- .../Views/DetailPage/DetailPage.scss | 15 +- .../Views/DetailPage/DetailPage.tsx | 2 +- .../Views/MainPage/Component/BookInfo.scss | 2 - .../Views/MainPage/Component/Genre.tsx | 2 +- .../Views/MainPage/Component/Main.tsx | 2 +- src/Components/Views/MainPage/MainPage.scss | 6 +- src/Components/Views/MyPage/MyPage.scss | 88 +------ src/Components/Views/MyPage/MyPage.tsx | 224 ++++++++++------ src/Components/Views/MyPage/UserInfo.scss | 242 ++---------------- src/Components/Views/MyPage/UserInfo.tsx | 112 +------- .../Views/MyPage/common/StyleCommon.scss | 30 +++ .../MyPage/common/components/Category.scss | 87 +++++++ .../MyPage/common/components/Category.tsx | 48 ++++ src/bookcustom/bookcustom.scss | 3 - src/bookcustom/bookcustom.tsx | 16 +- 23 files changed, 441 insertions(+), 727 deletions(-) create mode 100644 src/Components/Views/MyPage/common/StyleCommon.scss create mode 100644 src/Components/Views/MyPage/common/components/Category.scss create mode 100644 src/Components/Views/MyPage/common/components/Category.tsx diff --git a/src/Apis/register.tsx b/src/Apis/register.tsx index 41bd458c..b4d73aea 100644 --- a/src/Apis/register.tsx +++ b/src/Apis/register.tsx @@ -1,42 +1,31 @@ +import axios from 'axios'; + const headers = { 'Content-Type': 'application/json', - 'apikey': "KDT5_nREmPe9B", - 'username': "KDT5_TeamWink", -} - -const options = (method: string, param:object , tokenparam?:string ): RequestInit => { -const updateHeader = tokenparam ? {...headers, 'Authorization': 'Bearer '+ tokenparam} : headers; - return { - method, - headers: updateHeader, - body: JSON.stringify(param) - } -} - - const mainURL = "https://asia-northeast3-heropy-api.cloudfunctions.net/api/auth"; - - export const JoinForm = async (email:string,displayName:string,password:string) => { - const URL = `${mainURL}/signup`; - const res = await fetch(URL,options("POST", {email,displayName,password})); - const param = await res.json(); - return param; - }; + 'apikey': 'KDT5_nREmPe9B', + 'username': 'KDT5_TeamWink', +}; - //const LOGINURL = "https://asia-northeast3-heropy-api.cloudfunctions.net/api/auth/login"; +const axiosInstance = axios.create({ + baseURL: 'https://asia-northeast3-heropy-api.cloudfunctions.net/api/auth', + headers, +}); - export const LoginForm = async (email:string,password:string) => { - const LOGINURL = `${mainURL}/login` - const res = await fetch(LOGINURL,options("POST", {email,password})); - const param = await res.json(); - return param; - }; +export const JoinForm = async (email: string, displayName: string, password: string, profileImg:string) => { + const URL = '/signup'; + const res = await axiosInstance.post(URL, { email, displayName, password, profileImg }); + return res.data; +}; - //const LogoutURL = "https://asia-northeast3-heropy-api.cloudfunctions.net/api/auth/logout"; +export const LoginForm = async (email: string, password: string) => { + const LOGINURL = '/login'; + const res = await axiosInstance.post(LOGINURL, { email, password }); + return res.data; +}; - export const LogoutForm = async () => { - const LOGOUTURL = `${mainURL}/logout` - const token:string = localStorage.getItem("token") as string; - const res = await fetch(LOGOUTURL,options("POST",{} , token)); - const param = await res.json(); - return param; - }; \ No newline at end of file +export const LogoutForm = async () => { + const LOGOUTURL = '/logout'; + const token = localStorage.getItem('token') as string; + const res = await axiosInstance.post(LOGOUTURL, {}, { headers: { ...headers, 'Authorization': `Bearer ${token}` } }); + return res.data; +}; diff --git a/src/Common/Form/Login/login.tsx b/src/Common/Form/Login/login.tsx index 3a30f54c..aa74b9eb 100644 --- a/src/Common/Form/Login/login.tsx +++ b/src/Common/Form/Login/login.tsx @@ -1,13 +1,10 @@ import "./login.scss"; import { useNavigate, Link } from "react-router-dom"; -//import { useDispatch } from "react-redux"; import { FormEvent, useState, ChangeEvent } from "react"; -//import { loginUser } from '_reducers/user_reducer'; import { LoginForm } from "@/Apis/register"; function Login() { const navigate = useNavigate(); - //const dispatch = useDispatch(); const [email, setEmail] = useState(""); const [password, setPassword] = useState(""); @@ -20,12 +17,6 @@ function Login() { setPassword(e.target.value); }; - - interface DataToSubmit { - email: string; // 사용자 아이디 (필수!) - password: string; // 사용자 비밀번호 (필수!) - } - async function Signin(event: FormEvent) { event.preventDefault(); @@ -39,13 +30,7 @@ function Login() { return false; } - const dataToSubmit: DataToSubmit = { - email: email, - password: password, - }; - try { - //const data = await dispatch(loginUser(dataToSubmit)); const data = await LoginForm(email, password); console.log(data); @@ -53,7 +38,6 @@ function Login() { alert("로그인 되었습니다!"); window.localStorage.setItem("token", data.accessToken); navigate("/"); - location.reload(); } else { alert("로그인에 실패하였습니다. 다시 시도해주세요."); } diff --git a/src/Common/Form/Signin/join.tsx b/src/Common/Form/Signin/join.tsx index f8b6d669..b12baff6 100644 --- a/src/Common/Form/Signin/join.tsx +++ b/src/Common/Form/Signin/join.tsx @@ -1,5 +1,4 @@ import { FormEvent, useState, useCallback } from "react"; -import axios from "axios"; import { useNavigate } from "react-router-dom"; import { PwCheck, emailCheck } from "../Validation "; import { JoinForm } from "@/Apis/register"; @@ -113,17 +112,11 @@ function Join() { return false; } - const param = { - email: email, - password: password, - displayName: displayName, - }; - + try { - const res = await JoinForm(email, displayName, password); + const res = await JoinForm(email, displayName, password,profileImg ); if (res.accessToken) { alert("가입되었습니다."); - //localStorage.setItem('token', res.accessToken); navigate("/login"); } else { alert("가입에 실패했습니다. 다시 시도해주세요."); diff --git a/src/Common/Layout/Footer/footer.tsx b/src/Common/Layout/Footer/footer.tsx index 6ae7cb55..f6da4ad3 100644 --- a/src/Common/Layout/Footer/footer.tsx +++ b/src/Common/Layout/Footer/footer.tsx @@ -70,7 +70,7 @@ const Footer = () => {
- logo_image + logo_image

toyproject ©️ 5기 7조 twinkle

diff --git a/src/Common/Layout/Header/header.tsx b/src/Common/Layout/Header/header.tsx index 3e9c6e6f..47111680 100644 --- a/src/Common/Layout/Header/header.tsx +++ b/src/Common/Layout/Header/header.tsx @@ -1,11 +1,6 @@ import { Link, useNavigate } from "react-router-dom"; -import axios from "axios"; -import { useEffect, useState } from "react"; -//import { useSelector } from 'react-redux'; +import { useState } from "react"; import "./headers.scss"; -//import { RootState } from '../_reducers'; -//import { useDispatch } from 'react-redux'; -//import { logoutUser } from '_reducers/user_reducer'; import { LogoutForm } from "@/Apis/register"; interface User { @@ -14,11 +9,8 @@ interface User { } function Header() { - // const userState = useSelector((state) => state.user); - // const accessToken = userState.accessToken; - // console.log("1", accessToken); - // const dispatch = useDispatch(); const [user, setUser] =useState({} as User) + //const [token, setToken] = useState(localStorage.getItem("token")); const navigate = useNavigate(); @@ -28,35 +20,34 @@ function Header() { localStorage.removeItem("token"); alert("로그아웃 되셨습니다"); navigate("/"); - // location.reload(); }) .catch((error: string) => { console.log("Logout failed:", error); }); }; - const token = localStorage.getItem("token"); + const token = localStorage.getItem('token'); + // async function authenticate() { + // axios('https://asia-northeast3-heropy-api.cloudfunctions.net/api/auth/me',{ + // method:"post", + // headers:{ + // Authorization: `Bearer ${localStorage.getItem("token")}`, + // "Content-Type": "application/json", + // apikey: "KDT5_nREmPe9B", + // username: "KDT5_TeamWink", + // }, + // }).then((res) => { + // console.log("res:",res); + // setUser(res.data); + // }) + // } - async function authenticate() { - axios('https://asia-northeast3-heropy-api.cloudfunctions.net/api/auth/me',{ - method:"post", - headers:{ - Authorization: `Bearer ${localStorage.getItem("token")}`, - "Content-Type": "application/json", - apikey: "KDT5_nREmPe9B", - username: "KDT5_TeamWink", - }, - }).then((res) => { - console.log("res:",res); - setUser(res.data); - }) - } + // useEffect(() => { + // authenticate() + // }, []) - useEffect(() => { - authenticate() - }, []) return ( <> @@ -77,14 +68,10 @@ function Header() { 마이페이지 {token ? ( - //
로그아웃
- +
) : ( diff --git a/src/Common/Layout/Header/headers.scss b/src/Common/Layout/Header/headers.scss index 5aee14b4..09e7fc00 100644 --- a/src/Common/Layout/Header/headers.scss +++ b/src/Common/Layout/Header/headers.scss @@ -62,110 +62,44 @@ height: 30px; margin-top: 20px; // max-width: 1230px; - // background-color: yellow; + width: 400px; + background-color: yellow; - .Header-box__text{ - text-Decoration:none; + .Header-box__text { color: gray; - font-weight: bold; + background-color: orange; + font-weight: bold; + width: 100px; + height: 30px; cursor: pointer; - display: flex; + .Header-box__logout{ - padding: 15px 20px 0 0; + width: inherit; } } .cart { - // border: solid 1px red; position: relative; - width: 50px; - height: 50px; - border-radius: 50%; - overflow: hidden; - border: none; - background-position: center; - background-size: contain; - background-repeat: no-repeat; - overflow: hidden; - object-fit: cover; + width: 60px; + height: 60px; + //background-color: pink; + left: 130px; + bottom: 30px; - .cartPhoto{ - // border: solid 1px blue; - - // position: absolute; - // width: 100%; - // height: 100%; - // top: 0; - // left: 0; - // object-fit: cover; - + .img { cursor:auto; + background-color: olive; box-sizing: border-box; - position: relative; - // top:-5px; - // left:-5px; + position: absolute; width: 50px; height: 50px; - // border-width:2px; border-radius: 50%; background-position: center; background-size: contain; background-repeat: no-repeat; - overflow: hidden; - object-fit: cover; } } } -} - - - - - - - - - - - - -// addict — 오늘 오후 3:06 -// { -// margin: 0; -// padding: 0; -// box-sizing: border-box; -// } -// body { -// background-color: #e8d5c4; -// min-height: 100vh; -// } -// .container { -// width: 1250px; -// margin: auto; -// } -// header { -// display: flex; -// background-color: transparent; -// justify-content: space-between; -// align-items: center; -// padding: 0 50px; -// border-bottom: 1px solid; -// .logo { -// width: 150px; -// height: 50px; -// margin: 25px 0; -// background-color: aqua; -// } -// .user-box { -// display: flex; -// align-items: center; -// gap: 10px; -// .cart { -// width: 50px; -// height: 50px; -// background-color: red; -// } -// } -// } \ No newline at end of file +} \ No newline at end of file diff --git a/src/Components/Views/CartPage/CartPage.tsx b/src/Components/Views/CartPage/CartPage.tsx index ed1f34b0..118638cc 100644 --- a/src/Components/Views/CartPage/CartPage.tsx +++ b/src/Components/Views/CartPage/CartPage.tsx @@ -3,8 +3,6 @@ import { useState, useEffect } from "react"; import CartItems from "./CartItems/CartItems"; import RentalItems from "./CartRent/CartRent"; import Payment from "./Payment/Payment"; -//import useCheckedItems from "../Custom/useChecked"; - interface BuyItem { id: number; @@ -31,24 +29,6 @@ function CartPage() { calculateTotal(); }, [selectedItem]); - // const checkOne = (event: React.ChangeEvent,buyItem:any) => { - // const checkedValue = event.target.checked; - // const updatedCheckedItems = checkedValue - // ? buyItem.map((item,index) => index) - // : []; - // //setCheckedItems(updatedCheckedItems); - // setSelectedItem(buyItem); - // return updatedCheckedItems; - // }; - - // const checkOne = (event: React.ChangeEvent, buyItem: any[], gubun:string) => { - // const checkedValue = event.target.checked; - // const updatedCheckedItems = checkedValue ? buyItem.map((item, index) => index) : []; - // // Update selectedItem based on checkedValue - // const updatedSelectedItems = checkedValue ? buyItem : []; - // setSelectedItem(updatedSelectedItems); - // return updatedCheckedItems; - // }; const checkOne = (event: React.ChangeEvent, buyItem: any[], gubun: string) => { const checkedValue = event.target.checked; // Filter buyItem based on the condition (item.gubun === gubun) @@ -83,8 +63,6 @@ function CartPage() { }; const calculateTotal = () => { - console.log(selectedItem) - console.log("ccccccc" + Array.isArray(selectedItem)); let total = 0; if (Array.isArray(selectedItem)) { selectedItem.forEach((item) => { @@ -98,7 +76,6 @@ function CartPage() { }); } setTotal(total); - console.log(total + "토"); setShowTotal(true); }; @@ -123,16 +100,12 @@ function CartPage() { setbuyItem(updatedBuyItem); // cart 키 값으로 로컬에서 데이터 찾아옴 console.log(buyItem); - alert("삭제되었습니다."); } else { alert("취소되었습니다."); } }; - - - return ( <>
diff --git a/src/Components/Views/CartPage/Payment/Payment.tsx b/src/Components/Views/CartPage/Payment/Payment.tsx index 5b6cf381..433393ce 100644 --- a/src/Components/Views/CartPage/Payment/Payment.tsx +++ b/src/Components/Views/CartPage/Payment/Payment.tsx @@ -26,14 +26,6 @@ const Payment = ({ amount, productlists }: PaymentInfo) => { const itemName = productlists.map((obj) => obj.product_name).join(","); - const custom_data = [{productlists}]; - // custom_data = { - // 0: [product_no:1,gubun:'buy']; - // 1: [product_no:3,gubun:'buy']; - // 2: [product_no:4,gubun:'rent']; - // } - - console.log(itemName); const { IMP }: any = window; IMP.init("imp36252452"); @@ -41,15 +33,14 @@ const Payment = ({ amount, productlists }: PaymentInfo) => { const data = { pg: "html5_inicis", // PG사 html5_inicis: KG이니시스, kakaopay: 카카오페이, naverpay: 네이버페이, payco: 페이코 pay_method: "card", // 결제수단 - merchant_uid: orderNumber, // 주문번호 // 만약 여기에 에세스키 + merchant_uid: orderNumber, amount: amount, // 결제금액 name: `${itemName}`, // 주문명 buyer_name: "", // 구매자 이름 // buyer_tel: "01032752740", // 구매자 전화번호 // 전화번호: 일단 빼고 나중에 추가 시도.. buyer_email: "", // 구매자 이메일 - 작성시 구매창에서 이메일 부분에 들어가있음 - //https://developers.portone.io/docs/ko/api/api-1/api-1 - //productinfos : productlists + custom_data:productlists }; @@ -73,7 +64,7 @@ const Payment = ({ amount, productlists }: PaymentInfo) => { combinedArray.push(orderNumber); window.localStorage.setItem("mypayment", JSON.stringify(combinedArray)); } - + //결제 성공을 하고 성공된 데이터가 로컬스토리지에서 지워져야함. produc_id diff --git a/src/Components/Views/DetailPage/DetailPage.scss b/src/Components/Views/DetailPage/DetailPage.scss index 3def91f9..6725cbe4 100644 --- a/src/Components/Views/DetailPage/DetailPage.scss +++ b/src/Components/Views/DetailPage/DetailPage.scss @@ -45,6 +45,7 @@ top: 60px; left: 100px; z-index: 100; + background-color: #ffff; .TitleBox{ @@ -188,8 +189,8 @@ width: 140px; position: absolute; padding-bottom: 10px; - background-color: rgb(253, 248, 248); - border-radius: 10px; + //background-color: rgb(253, 248, 248); + //border-radius: 10px; padding: 10px; font-size: 23px; font-weight: bold; @@ -233,8 +234,8 @@ a { font-family: 'SUITE-Regular' !important; - background-color: #f8ede3 !important; - border-radius: 10px; + //background-color: #f8ede3 !important; + //border-radius: 10px; width: 800px; margin: 0 auto !important; padding: 20px !important; @@ -266,7 +267,7 @@ .Bookple-Container__text{ width: 180px; - background-color: rgb(248, 244, 244); + //background-color: rgb(248, 244, 244); position: absolute; color: #0086cd; left: -250px; @@ -293,7 +294,7 @@ .InnerContent{ width: 900px; - background-color: red; + //background-color: red; height: auto; display: block; margin: 0 auto; @@ -312,4 +313,4 @@ } } -} + diff --git a/src/Components/Views/DetailPage/DetailPage.tsx b/src/Components/Views/DetailPage/DetailPage.tsx index a50e7cab..cf05dc5f 100644 --- a/src/Components/Views/DetailPage/DetailPage.tsx +++ b/src/Components/Views/DetailPage/DetailPage.tsx @@ -161,7 +161,7 @@ function DetailPage() { className="CartAdd" onClick={() => BuyBook(detail, "buy")} > - {" "} + 책 구매하기
diff --git a/src/Components/Views/MainPage/Component/Main.tsx b/src/Components/Views/MainPage/Component/Main.tsx index d76b352a..3fcde540 100644 --- a/src/Components/Views/MainPage/Component/Main.tsx +++ b/src/Components/Views/MainPage/Component/Main.tsx @@ -44,7 +44,7 @@ export default function Main() { return (
- 책갈피 + 책갈피
    {category.map((item) => (
  • diff --git a/src/Components/Views/MainPage/MainPage.scss b/src/Components/Views/MainPage/MainPage.scss index cb2fdd09..28694cf1 100644 --- a/src/Components/Views/MainPage/MainPage.scss +++ b/src/Components/Views/MainPage/MainPage.scss @@ -29,11 +29,11 @@ main { } .Category-menu__text{ - width: 125px; + width: 127px; position: absolute; bottom: 50px; height: 360px; - padding: 10px; + padding: 4px; li { display: flex; @@ -57,7 +57,7 @@ main { align-items: center; justify-content: center; height: 50px; - width: 100px; + width: 110px; border-radius: 30px; transition: background-color 0.3s; } diff --git a/src/Components/Views/MyPage/MyPage.scss b/src/Components/Views/MyPage/MyPage.scss index ca3ca454..8b1ad5ca 100644 --- a/src/Components/Views/MyPage/MyPage.scss +++ b/src/Components/Views/MyPage/MyPage.scss @@ -1,83 +1,17 @@ -.MyPage-AllLayout { - width: 1200px; - padding-bottom: 1500px; - position: relative; - margin: 0 auto; - - .myPageContainer{ - width: 1200px; - position: absolute; - display: flex; - margin: 0 auto; - left: 0; - right: 0; - top:100px; - - - .subContainer{ - width: 250px; - background-color: #F2E7D5; - border-radius: 10px 0px 0px 10px; - - .profile{ - position: relative; - top:21.5px; - height: 250px; - background-color: bisque; - - .profilePhoto{ - position: relative; - top:20px; - width: 120px; - height: 120px; - margin-left: auto; - margin-right: auto; - border: solid 1px rgb(243, 214, 172); - border-radius: 50%; - box-shadow: 2px 5px 5px rgb(0,0,0,.3); - background-position: center; - } - - .profileContainer{ - position: relative; - margin-top: 2.5rem; - color:black; - text-align: center; - - .profileName{ - font-size: 20px; - font-weight: 1000; - } +@import './common/StyleCommon.scss'; - .profileText{ - font-size: 15px; - margin-top: 1rem; - } - } - } - - .category { - flex-direction: column; - position: relative; - height: 350px; - width: 200px; - top:30px; +.MyPage-AllLayout { + @include AllLayoutStyle; - .categoryTap { - font-weight: bold; - padding: 15px; - color: black; - border-bottom: solid 2px rgb(239, 211, 174); - text-align: center; - } - } - } + .MyPage-AllLayout__center{ + @include LayoutCenterStyle; + + .LeftContainer{ + @include LeftContainerStyle; + } - .detailsContainer{ - width: 1500px; - border-radius: 0px 10px 10px 0px; - padding-bottom: 178px; - background-color: rgb(227 213 197); + .RightContainer{ + @include RightContainerStyle; .orderText{ position: relative; diff --git a/src/Components/Views/MyPage/MyPage.tsx b/src/Components/Views/MyPage/MyPage.tsx index 326f56eb..1dae0ccb 100644 --- a/src/Components/Views/MyPage/MyPage.tsx +++ b/src/Components/Views/MyPage/MyPage.tsx @@ -1,11 +1,38 @@ import { useState, useEffect } from "react"; -import axios from "axios"; -import { Link } from "react-router-dom"; +import axios,{ AxiosResponse } from "axios"; +import Category from "./common/components/Category"; import "./MyPage.scss"; +interface PaymentItem { + merchant_uid: string; + custom_data:string; + paid_at: string; + +} + +interface PaymentsResponse { + response: { + list: PaymentItem[]; + }; +} + +interface CategoryMap { + readonly [key: string]: string; +} + +interface PageData { + gubun: string; + merchant_uid: string; + small_image: string; + product_name: string; + price: number; + custom_data:string; + paid_at: string; +} + function MyPage() { - const TopCategory = { + const TopCategory: CategoryMap = { orderId:'주문번호', orderDate:'주문날짜', productname:'상품이름', @@ -13,61 +40,118 @@ function MyPage() { cancel:'구매취소' } as const; -const [itemList, setItemList] = useState([]); -const [mydataList, setMydataList] = useState([]); +const [itemList, setItemList] = useState([]); +const [mydataList, setMydataList] = useState([]); + +const GetToken = async () => { + try{ + const response = await axios.post('/iamport/users/getToken', + { + imp_key: '5758023681388354', + imp_secret: 'tCdwGmiflqhMA3It54n6aLBIeA7LCg0O3WYu5qI1SKpwQ85FKXtJsiHu8yUWTynhDx7fxCFY1wsA3KVc', + }, + { + headers: { 'Content-Type': 'application/json' }, + } + ); + const accessToken = response.data.response.access_token; + return accessToken; + } catch (error) { + console.log(error); + throw error; + } +} + + +const fetchData = async (): Promise => { + try { + const paynumber: string | null = window.localStorage.getItem('mypayment'); + + if (paynumber) { + const merchantUids = JSON.parse(paynumber); + const accessToken = await GetToken(); + const paymentsResponse: AxiosResponse = await axios.get( + `/iamport/payments/status/paid?limit=20&sorting=paid&_token=${accessToken}` + ); + + if (paymentsResponse.data && paymentsResponse.data.response && paymentsResponse.data.response.list) { + const filteredList: PaymentItem[] = paymentsResponse.data.response.list.filter((item) => + merchantUids.includes(item.merchant_uid) + ); + if(filteredList){ + setItemList(filteredList); + }else{ + setItemList([]); + } + } else { + console.log('Invalid response format'); + setItemList([]); + } + } + } catch (error) { + console.log('Error occurred:', error); + } +}; useEffect(() => { - const paynumber = window.localStorage.getItem("mypayment"); - const merchantUids = JSON.parse(paynumber); - - axios({ - method: "post", - url: "/iamport/users/getToken", - data: JSON.stringify({ - imp_key: "5758023681388354", - imp_secret: "tCdwGmiflqhMA3It54n6aLBIeA7LCg0O3WYu5qI1SKpwQ85FKXtJsiHu8yUWTynhDx7fxCFY1wsA3KVc", - }), - headers: { "Content-Type": "application/json" }, - }) - .then((res) => res.data.response) - .then((data) => { - axios.get(`/iamport/payments/status/paid?limit=20&sorting=paid&_token=${data.access_token}`) - .then((res) => res.data.response) - .then((res) => { - if (res && res.list) { - const filteredList = res.list.filter((item) => merchantUids.includes(item.merchant_uid)); - setItemList(filteredList); - } else { - console.log('Invalid response format'); - } - }) - .catch((error) => { - console.log('Error occurred:', error); - }); - }); + fetchData(); }, []); useEffect(() => { - const useData = itemList.filter((item) => item.custom_data); - useData.forEach((item) => { - if(item.custom_data){ - let parsedData = JSON.parse(item.custom_data); - parsedData = parsedData.map((data) => ({ - ...data, - paid_at: item.paid_at, //결제날짜 - merchant_uid: item.merchant_uid,//주문번호 - // Add more properties as needed - })); - setMydataList((prevDataList) => [...prevDataList, ...parsedData]); - } - }); + setMydataList([]); + if (itemList.length === 0) { + return; + } + const useData = itemList.filter((item) => item.custom_data); + useData.forEach((item) => { + if (item.custom_data) { + let parsedData: PageData[] = JSON.parse(item.custom_data); + parsedData = parsedData.map((data) => ({ + ...data, + paid_at: item.paid_at, + merchant_uid: item.merchant_uid, + // Add more properties as needed + })); + setMydataList((prevDataList) => [...prevDataList, ...parsedData]); + } + }); }, [itemList]); -useEffect(() => { - console.log(mydataList); -},[mydataList]); -const getDate = function(param){ +const DeleteList = (itemnum: string) => { + const MyPay = localStorage.getItem("mypayment"); + + if (MyPay && MyPay.includes(itemnum)) { + const updatedList = MyPay.replace(itemnum, "").trim(); + localStorage.setItem("mypayment", updatedList); + } + fetchData(); +} + +const onClickDelete = async (key:string) => { + + if(confirm("주문을 취소 하시겠습니까?")){ + const accessToken = await GetToken(); + const data = { + merchant_uid : key + } + await axios.post( + `/iamport/payments/cancel?_token=${accessToken}`, data) + .then((res) => { + if(res.status == 200){ + alert("삭제되었습니다."); + DeleteList(key); + } else { + console.log(res.status) + } + }); + } else { + alert("취소되었습니다.") + } +}; + + +const getDate = function(param:any){ const date = new Date(param * 1000); const koreaTime = date.toLocaleString("ko-KR", { timeZone: "Asia/Seoul", @@ -81,32 +165,12 @@ const getDate = function(param){ return ( <>
    -
    -
    -
    -
    -
    -
    -

    닉네임

    -
    -
    -

    프로필 자기소개란입니다.

    -
    -
    -
    -
    - -
    주문내역조회
    - {" "} -
    - -
    회원정보 수정
    - {" "} -
    -
    +
    +
    +
    -
    +
    구매 내역
    @@ -121,8 +185,8 @@ const getDate = function(param){
    {mydataList - .filter(el => el.gubun === 'buy') - .map((item, index) => ( + .filter((el: PageData) => el.gubun === 'buy') + .map((item: PageData, index: number) => (
    {item.merchant_uid.replace("mid_","")} @@ -133,7 +197,7 @@ const getDate = function(param){
    {item.price}
    - +
    @@ -152,8 +216,8 @@ const getDate = function(param){
    {mydataList - .filter(el => el.gubun === 'rent') - .map((item, index) => ( + .filter((el: PageData) => el.gubun === 'rent') + .map((item: PageData, index: number) => (
    {item.merchant_uid.replace("mid_","")} @@ -164,7 +228,7 @@ const getDate = function(param){
    {item.price}
    - +
    diff --git a/src/Components/Views/MyPage/UserInfo.scss b/src/Components/Views/MyPage/UserInfo.scss index d782b2d4..82ca001b 100644 --- a/src/Components/Views/MyPage/UserInfo.scss +++ b/src/Components/Views/MyPage/UserInfo.scss @@ -1,224 +1,18 @@ - .myPageeContainer{ - background-color: white; - width: 1200px; - height: 900px; - position: relative; - left: 200px; - display: flex; - - .subContainer{ - width: 25%; - - .subText{ - font-size: 15px; - padding: 0 0 0 15px; - - } - .profile{ - border: solid 1px rgb(221, 221, 221); - position: relative; - top:21.5px; - height: 250px; - - .profilePhoto{ - position: relative; - top:20px; - left:75px; - width: 150px; - height: 150px; - margin-left: auto; - margin-right: auto; - border: solid 1px rgb(221,221,221); - border-radius: 50%; - box-shadow: 2px 5px 5px rgb(0,0,0,.3); - background-position: center; - background-size: contain; - background-repeat: no-repeat; - overflow: hidden; - object-fit: cover; - } - - .profileContainer{ - position: relative; - margin-top: 2.5rem; - color:black; - text-align: center; - - .profileName{ - font-size: 20px; - font-weight: 1000; - } - - .profileText{ - font-size: 15px; - margin-top: 1rem; - } - } - } - - .category { - // margin-top: 4rem; - display: block; - flex-direction: column; - // background-color: gray; - position: relative; - height: auto; - top:20px; - border: solid 1px rgb(221, 221, 221); - - .categoryTap { - font-weight: 700; - padding: 1.2rem 0 0 0; - border-top: solid 1px rgb(221, 221, 221); - text-align: center; - } - } - } - - .detailsContainer{ - width: 75%; - flex-direction: column; - // background-color: aquamarine; - - .infoContainer{ - position: relative; - top: 3rem; - margin-left: 3rem; - margin-right: 3rem; - height: 90%; - border: solid 1px rgb(221,221,221); - // background-color: rgb(124, 255, 255); - - .info{ - position: relative; - // background-color: rgb(224, 57, 57); - top:3rem; - - .infoTag{ - display: flex; - - .infoText{ - position: relative; - left:2rem; - // border: solid 1px black; - font-size: 24px; - font-weight: 900; - color:black; - padding:.5rem 1rem; - margin-left: 2rem; - } - } - - .infoBox{ - position: relative; - margin: 2rem 4rem 0 4rem; - // background-color: cadetblue; - // border: dotted 1px black; - width:auto; - height: 30rem; - // display: flex; - - .infoList{ - display:flex; - // background-color: rgb(245, 242, 97); - padding: 1.5rem 1.2rem; - - - .infoTitle{ - width: 8rem; - padding-top: 10px; - text-align: center; - } - - .infoItem{ - .infoItemForm{ - padding: 15px; - margin-left: 15px; - width:500px; - background-color: white; - border: solid 1px rgb(221, 221, 221); - border-radius: .5rem; - } - - .infoPic{ - padding: 15px; - margin-left: 10px; - width: 200px; - background-color: white; - border: solid 1px rgb(221,221,221); - color: gray; - } - - } - - .infoFix{ - background-color:rgb(53, 197, 240); - border-radius: .5rem; - margin-left: 10rem; - padding: 15px; - width: 15rem; - color:white; - font-weight: 700; - font-size: 18px; - cursor: pointer; - } - - - // background-position: center; - // background-size: contain; - // background-repeat: no-repeat; - // overflow: hidden; - // padding-top: 30px; - // width: 100px; - // margin:0 auto; - } - } - } - } - - - // .rentContainer{ - // position: relative; - // height: 40%; - // // background-color: rgb(124, 255, 255); - - // .rent{ - // position: relative; - // // background-color: rgb(224, 57, 57); - // top:3rem; - - // .rentText{ - // font-size: 20px; - // font-weight:700; - // color:black; - // padding: 0 0 0 6rem; - // } - - // .rentBox{ - // position: relative; - // margin: 2rem 6rem 0 6rem; - // // background-color: cadetblue; - // border:dotted 1px black; - // width:auto; - // height: 12rem; - // display: flex; - // flex-wrap: nowrap; - - - // .rentList{ - // background-image: url(./8954699375_2.jpg); - // background-position: center; - // background-size: contain; - // background-repeat: no-repeat; - // overflow: hidden; - // padding: 3rem; - // // width: 100%; - // margin:0 auto; - // } - // } - // } - // } - - - } - } \ No newline at end of file +@import './common/StyleCommon.scss'; + +.UserInfo-AllLayout{ + @include AllLayoutStyle; + + .UserInfo-AllLayout__center{ + @include LayoutCenterStyle; + + .LeftContainer{ + @include LeftContainerStyle; + } + + .RightContainer{ + @include RightContainerStyle; + } + } +} + \ No newline at end of file diff --git a/src/Components/Views/MyPage/UserInfo.tsx b/src/Components/Views/MyPage/UserInfo.tsx index adb1022d..1ae4789c 100644 --- a/src/Components/Views/MyPage/UserInfo.tsx +++ b/src/Components/Views/MyPage/UserInfo.tsx @@ -2,7 +2,7 @@ import { FormEvent, useState, useEffect, ChangeEvent, useCallback, useRef } from import axios from "axios"; import { Link, useNavigate } from "react-router-dom"; import "./UserInfo.scss"; -import { ReadStream } from "fs"; +import Category from "./common/components/category"; interface User { displayName: string // 사용자 표시 이름 @@ -80,109 +80,21 @@ function UserInfo() { return ( <> -
    -
    -
    My Page
    -
    - 프로필사진 -
    -
    -

    {user.displayName}

    -
    -
    +
    +
    +
    +
    -
    - -
    주문내역조회
    - {" "} -
    - -
    회원정보 수정
    - {" "} -
    -
    -
    + +
    + -
    -
    -
    -
    -
    회원정보 수정
    -
    -
    -
    -
    -
    기존 비밀번호
    -
    - {setOldPassword(e.target.value)}} - /> -
    -
    -
    -
    새 비밀번호
    -
    - {setNewPassword(e.target.value)}} - /> -
    -
    -
    -
    닉네임 변경
    -
    - {setDisplayName(e.target.value)}} - /> -
    -
    -
    -
    프로필 이미지
    -
    - -
    -
    -
    -
    - -
    -
    -
    -
    -
    + +
    + +
    ); diff --git a/src/Components/Views/MyPage/common/StyleCommon.scss b/src/Components/Views/MyPage/common/StyleCommon.scss new file mode 100644 index 00000000..f8832f03 --- /dev/null +++ b/src/Components/Views/MyPage/common/StyleCommon.scss @@ -0,0 +1,30 @@ +@mixin AllLayoutStyle { + width: 1200px; + padding-bottom: 1500px; + position: relative; + margin: 0 auto; +} + +@mixin LayoutCenterStyle { + width: 1200px; + position: absolute; + display: flex; + margin: 0 auto; + left: 0; + right: 0; + top:100px; +} + +@mixin LeftContainerStyle { + width: 250px; + background-color: #F2E7D5; + border-radius: 10px 0px 0px 10px; +} + +@mixin RightContainerStyle { + width: 1500px; + border-radius: 0px 10px 10px 0px; + padding-bottom: 178px; + background-color: rgb(227 213 197); +} + diff --git a/src/Components/Views/MyPage/common/components/Category.scss b/src/Components/Views/MyPage/common/components/Category.scss new file mode 100644 index 00000000..cf85c34d --- /dev/null +++ b/src/Components/Views/MyPage/common/components/Category.scss @@ -0,0 +1,87 @@ +.LeftContainer{ + width: 250px; + background-color: #F2E7D5; + border-radius: 10px 0px 0px 10px; + + .LeftContainer-profile{ + position: relative; + top:22px; + height: 250px; + background-color: bisque; + + .LeftContainer-profile__Photo{ + position: relative; + margin-top:20px; + width: 120px; + height: 120px; + margin-left: auto; + margin-right: auto; + border: solid 1px rgb(243, 214, 172); + border-radius: 50%; + box-shadow: 2px 5px 5px rgb(0,0,0,.3); + background-position: center; + } + + .LeftContainer-profile__box{ + position: relative; + margin-top: 2.5rem; + color:rgb(192, 138, 138); + text-align: center; + background-color: yellow; + + .LeftContainer-profile__text{ + font-size: 20px; + font-weight: bold; // 1000 + } + + .LeftContainer-profile__name{ + font-size: 15px; + margin-top: 1rem; + } + } + } + + .LeftContainer-category { + flex-direction: column; + position: relative; + height: 290px; + width: 200px; + top:30px; + + .active{ + background-color: red; + } + + a { + color: white; + top: 13px; + position: relative; + } + + .LeftContainer-category__order { + width: 190px; + margin: 0 auto; + font-weight: bold; + position: relative; + padding: 15px; + color: black; + border-radius: 40px; + //border-bottom: solid 2px rgb(239, 211, 174); + text-align: center; + top: 20px; + } + + .LeftContainer-category__infoTap{ + width: 190px; + margin: 0 auto; + font-weight: bold; + position: relative; + padding: 15px; + color: black; + //border-bottom: solid 2px rgb(239, 211, 174); + text-align: center; + border-radius: 40px; + top: 40px; + } + } +} \ No newline at end of file diff --git a/src/Components/Views/MyPage/common/components/Category.tsx b/src/Components/Views/MyPage/common/components/Category.tsx new file mode 100644 index 00000000..a61c431a --- /dev/null +++ b/src/Components/Views/MyPage/common/components/Category.tsx @@ -0,0 +1,48 @@ +import './Category.scss' +import { Link } from "react-router-dom"; +import {useEffect } from 'react'; + +const Category = () => { + + useEffect(() => { + if (location.pathname === "/mypage") { + document.querySelector(".LeftContainer-category__order")?.classList.add("active"); + document.querySelector(".LeftContainer-category__infoTap")?.classList.remove("active"); + } else if (location.pathname === "/mypage/userinfo") { + document.querySelector(".LeftContainer-category__order")?.classList.remove("active"); + document.querySelector(".LeftContainer-category__infoTap")?.classList.add("active"); + } + }, [location]); + + return ( + <> +
    +
    +
    +
    +

    닉네임

    +
    + +
    +

    프로필 자기소개란입니다.

    +
    +
    +
    +
    + +
    + 주문내역조회 +
    + + + +
    + 회원정보 수정 +
    + +
    + + ); +}; + +export default Category; \ No newline at end of file diff --git a/src/bookcustom/bookcustom.scss b/src/bookcustom/bookcustom.scss index f7867d5d..08cd496a 100644 --- a/src/bookcustom/bookcustom.scss +++ b/src/bookcustom/bookcustom.scss @@ -1,7 +1,4 @@ @import url(https://fonts.googleapis.com/css?family=Crimson+Text:400,700,900,400italic,700italic,900italic|Playfair+Display:400,700,900,400italic,700italic,900italic|Rock+Salt:400); - - - #container { float: left; padding: 1em; diff --git a/src/bookcustom/bookcustom.tsx b/src/bookcustom/bookcustom.tsx index 375753a2..839bdd77 100644 --- a/src/bookcustom/bookcustom.tsx +++ b/src/bookcustom/bookcustom.tsx @@ -4,15 +4,13 @@ import'./bookcustom.scss' function BookCustom(){ return( <> -
    -
    -
    -
    - -
    -
    -
    -
    +
    +
    +
    + +
    +
    +
    ) } From 845498442fa0b85e6742a1e823242fd04f04cd83 Mon Sep 17 00:00:00 2001 From: Seo Donguk Date: Tue, 27 Jun 2023 13:04:46 +0900 Subject: [PATCH 46/75] =?UTF-8?q?style:=20=EB=A9=94=EC=9D=B8=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Views/MainPage/Component/BookInfo.scss | 36 +++++---------- .../Views/MainPage/Component/BookInfo.tsx | 22 +++++---- .../Views/MainPage/Component/Genre.scss | 45 +++++++++---------- .../Views/MainPage/Component/Main.tsx | 15 ++++--- .../Views/MainPage/Component/Recommand.scss | 28 +++++------- src/Components/Views/MainPage/MainPage.scss | 32 +++---------- 6 files changed, 71 insertions(+), 107 deletions(-) diff --git a/src/Components/Views/MainPage/Component/BookInfo.scss b/src/Components/Views/MainPage/Component/BookInfo.scss index 04706797..4fe68f88 100644 --- a/src/Components/Views/MainPage/Component/BookInfo.scss +++ b/src/Components/Views/MainPage/Component/BookInfo.scss @@ -1,56 +1,42 @@ -.Book-container{ +.Book-container { margin-top: 40px; } -.BookInfo-Inner{ +.BookInfo-Inner { position: relative; - width: auto; - bottom: 290px; + margin-bottom: 20px; height: 120px; padding: 10px; border-radius: 10px; color: black; - background-color:#f0d5b7; + background-color: #f0d5b7; box-shadow: 5px 5px 5px #b98563; - .RoundCircle{ + .RoundCircle { width: 13px; height: 13px; margin: 0 auto; - left: 0; - right: 0; - position: absolute; border-radius: 50%; background-color: rgba(255, 254, 253, 0.719); - box-shadow: 2px 2px 5px #5a5958; + box-shadow: 2px 2px 5px #5a5958; } .Namebox { - width:160px; - position: relative; - top: 25px; - + margin: 10px 0; + span { - width: 150px; - left: 0; - right: 0; - margin: 0 auto; font-size: 15px; font-weight: bold; } } - .Main-Pricebox{ + .Main-Pricebox { display: flex; - width: auto; position: relative; - top: 28px; } - .retail-price{ - width: 70px; + .retail-price { + padding: 0 5px; font-size: 13px; } } - - diff --git a/src/Components/Views/MainPage/Component/BookInfo.tsx b/src/Components/Views/MainPage/Component/BookInfo.tsx index a2aa445b..4b055779 100644 --- a/src/Components/Views/MainPage/Component/BookInfo.tsx +++ b/src/Components/Views/MainPage/Component/BookInfo.tsx @@ -1,6 +1,6 @@ import { Link } from 'react-router-dom'; import { useState } from 'react'; -import './BookInfo.scss' +import './BookInfo.scss'; interface Props { productNo: number; @@ -40,26 +40,24 @@ export default function BookInfo({
    ) : null} -
    - {productName} - -
    -
    -
    - {productName} +
    +
    +
    +
    + {productName.split('(')[0]}
    {retailPrice === price ? ( -
    {price.slice(0, -3)}원
    +
    {price.slice(0, -3)}원
    ) : ( -
    +
    {retailPrice.slice(0, -3)}원 {price.slice(0, -3)}원
    )} -
    + + {productName}
    - ); } diff --git a/src/Components/Views/MainPage/Component/Genre.scss b/src/Components/Views/MainPage/Component/Genre.scss index 494eee81..f5372200 100644 --- a/src/Components/Views/MainPage/Component/Genre.scss +++ b/src/Components/Views/MainPage/Component/Genre.scss @@ -7,7 +7,6 @@ } .left { background-color: #fed19a; - width: 180px; border-top-left-radius: 10px; border-bottom-left-radius: 10px; @@ -15,47 +14,49 @@ padding: 30px 10px; color: #555252; font-size: 15px; + + h1 { + width: min-content; + } } } .right { - background-color: #FFF3E2; - width: 1030px; + position: relative; + background-color: #fff3e2; + //width: 1030px; display: flex; flex-wrap: wrap; height: 918px; border-radius: 0 5px 5px 0; border-top: 1px solid rgb(219, 218, 218); border-bottom: 1px solid rgb(219, 218, 218); - border-right:1px solid rgb(219, 218, 218); + border-right: 1px solid rgb(219, 218, 218); - .Top-bookContainer{ + .Top-bookContainer { position: absolute; height: 50px; - width: 980px; + width: 100%; z-index: 200; - margin-left: 10px; - margin-top: 370px; + top: 45%; } - - .Bottom-bookContainer{ + + .Bottom-bookContainer { position: absolute; - width: 980px; - margin-left: 10px; - margin-top: 827px; + width: 100%; height: 50px; + bottom: 0; } - + .book { position: relative; padding: 0 10px; - margin: 30px 0; + text-align: center; + width: 20%; img { border-radius: 10px; - width: 100%; height: 230px; position: relative; - top: 80px; } } @@ -70,11 +71,10 @@ height: 230px; border-radius: 10px; overflow: hidden; - //background-color: rgb(255, 239, 228); backdrop-filter: blur(5px); -webkit-backdrop-filter: blur(5px); - top: 120px; - z-index: 1; + bottom: 45px; + z-index: 2; color: #fff; text-shadow: -1px -1px 0 #000, 1px -1px 0 #000, -1px 1px 0 #000, 1px 1px 0 #000; @@ -82,14 +82,13 @@ .discount { position: absolute; width: fit-content; - height: 40px; line-height: 1.8; text-align: center; background-color: red; color: #fff; right: 10%; - z-index: 200; - top: 120px; + top: 40%; + z-index: 1; } .retail-price { text-decoration: line-through; diff --git a/src/Components/Views/MainPage/Component/Main.tsx b/src/Components/Views/MainPage/Component/Main.tsx index 3fcde540..9b5fea2a 100644 --- a/src/Components/Views/MainPage/Component/Main.tsx +++ b/src/Components/Views/MainPage/Component/Main.tsx @@ -44,13 +44,16 @@ export default function Main() { return (
    - 책갈피 + 책갈피
    diff --git a/src/Components/Views/MainPage/Component/Recommand.scss b/src/Components/Views/MainPage/Component/Recommand.scss index 87243300..8ca343da 100644 --- a/src/Components/Views/MainPage/Component/Recommand.scss +++ b/src/Components/Views/MainPage/Component/Recommand.scss @@ -1,10 +1,10 @@ .Recommand { margin: 100px auto 0; width: 90%; - + h1 { width: 150px; - padding-bottom: 10px; + padding-bottom: 10px; } } .Recommand-wrapper { @@ -13,25 +13,21 @@ position: relative; margin-top: 30px; padding: 30px; - padding-bottom: 85px; background-color: #ffffff; border-radius: 10px; border: 3px solid rgb(202, 159, 18); - - span { - position: absolute; - width: 200px; - padding-bottom: 10px; - margin-top: 10px; + img { + height: 250px; + } + h3 { + margin: 5px 0; } } .test { - margin-right: 20px; - width: 220px; - display: inline-block; position: relative; - left: 50px; + width: 20%; + text-align: center; + &:not(:last-child) { + margin-right: 20px; + } } - - - diff --git a/src/Components/Views/MainPage/MainPage.scss b/src/Components/Views/MainPage/MainPage.scss index 28694cf1..98df5c0f 100644 --- a/src/Components/Views/MainPage/MainPage.scss +++ b/src/Components/Views/MainPage/MainPage.scss @@ -1,7 +1,6 @@ .wrapper { - width: 1500px; + width: 1200px; margin: 100px auto 0; - // background-color: yellow; position: relative; } a { @@ -13,33 +12,30 @@ a { main { position: relative; display: flex; - width: 1200px; margin: 100px auto; - + .Category-menu { position: sticky; top: 0px; - margin-left: -80px; height: 410px; - + img { - position: sticky; width: 120px; - height: inherit; } - - .Category-menu__text{ + + .Category-menu__text { width: 127px; position: absolute; bottom: 50px; height: 360px; padding: 4px; - + li { display: flex; align-items: center; justify-content: center; height: 50px; + width: 110px; margin-top: 10px; border-radius: 30px; font-weight: bold; @@ -51,18 +47,4 @@ main { } } } - - li { - display: flex; - align-items: center; - justify-content: center; - height: 50px; - width: 110px; - border-radius: 30px; - transition: background-color 0.3s; - } - .active { - background-color: orange; - //border-radius: 30px; - } } From 541f98d192dc62c67960a31a7c62c320084bf372 Mon Sep 17 00:00:00 2001 From: hahahaday12 Date: Tue, 27 Jun 2023 13:07:23 +0900 Subject: [PATCH 47/75] =?UTF-8?q?fix:=20=EB=B3=80=EA=B2=BD=EC=82=AC?= =?UTF-8?q?=ED=95=AD=20=EC=A0=80=EC=9E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- index.html | 1 + src/Common/Form/Signin/join.tsx | 6 +++--- src/Common/Layout/Header/headers.scss | 14 +++++++------- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/index.html b/index.html index e0d1c840..bb73b662 100644 --- a/index.html +++ b/index.html @@ -11,3 +11,4 @@ + \ No newline at end of file diff --git a/src/Common/Form/Signin/join.tsx b/src/Common/Form/Signin/join.tsx index b12baff6..6cb20bd7 100644 --- a/src/Common/Form/Signin/join.tsx +++ b/src/Common/Form/Signin/join.tsx @@ -96,6 +96,8 @@ function Join() { [password] ); + + async function signUp(event: FormEvent) { event.preventDefault(); if (email === undefined || email === "" || email === null) { @@ -204,9 +206,7 @@ function Join() { className="buttonBox" type="submit" disabled={ - !(isName && isEmail && isPassword && isPasswordConfirm) - } - > + !(isName && isEmail && isPassword && isPasswordConfirm)}> 등록
    diff --git a/src/Common/Layout/Header/headers.scss b/src/Common/Layout/Header/headers.scss index 09e7fc00..4e0ad329 100644 --- a/src/Common/Layout/Header/headers.scss +++ b/src/Common/Layout/Header/headers.scss @@ -25,7 +25,7 @@ height: 50px; display: inline-block; position: relative; - // background-color: aqua; + //background-color: aqua; img{ width: 80px; @@ -63,14 +63,14 @@ margin-top: 20px; // max-width: 1230px; width: 400px; - background-color: yellow; + //background-color: yellow; .Header-box__text { color: gray; background-color: orange; font-weight: bold; - width: 100px; - height: 30px; + width: 80px; + height: 20px; cursor: pointer; @@ -83,9 +83,9 @@ position: relative; width: 60px; height: 60px; - //background-color: pink; - left: 130px; - bottom: 30px; + background-color: pink; + left: 120px; + bottom: 40px; .img { cursor:auto; From 9e2a916385f7c269c2b4a4ecfe6a9d2d6b99796e Mon Sep 17 00:00:00 2001 From: saeyeon Date: Tue, 27 Jun 2023 13:07:58 +0900 Subject: [PATCH 48/75] feat:searchpage --- src/App.tsx | 4 +- src/Common/Layout/Header/header.tsx | 24 ++- src/Common/Layout/Header/headers.scss | 204 +++++++++--------- .../Views/MainPage/Component/Carousel.tsx | 18 +- .../Views/MainPage/Component/Recommand.scss | 7 +- .../Views/MainPage/Component/Recommand.tsx | 12 +- src/Components/Views/MainPage/MainPage.scss | 16 +- .../Views/SearchPage/SearchPage.scss | 24 ++- .../Views/SearchPage/SearchPage.tsx | 64 +++--- 9 files changed, 201 insertions(+), 172 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index efbea74a..e34b4700 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -5,8 +5,8 @@ import SearchPage from "./Components/Views/SearchPage/SearchPage"; function App() { return ( <> - {/* */} - + + {/* */} ); } diff --git a/src/Common/Layout/Header/header.tsx b/src/Common/Layout/Header/header.tsx index 61751f7e..0e9b43ce 100644 --- a/src/Common/Layout/Header/header.tsx +++ b/src/Common/Layout/Header/header.tsx @@ -70,6 +70,14 @@ function Header() { authenticate(); }, []); + const OnKeyPress = (e: any) => { + if (keyword === "") { + alert("검색어를 입력해주세요"); + } else if (e.key === "Enter") { + onSubmit(); // Enter 입력이 되면 클릭 이벤트 실행 + } + }; + return ( <>
    @@ -84,14 +92,26 @@ function Header() { onChange={(e) => { setKeyWord(e.target.value); }} + onKeyPress={OnKeyPress} /> - + */} + searchicon { + if (keyword === "") { + alert("검색어를 입력해주세요"); + } else { + onSubmit(); + } + }} + />
    diff --git a/src/Common/Layout/Header/headers.scss b/src/Common/Layout/Header/headers.scss index 5aee14b4..c03512fe 100644 --- a/src/Common/Layout/Header/headers.scss +++ b/src/Common/Layout/Header/headers.scss @@ -1,5 +1,4 @@ - -.headerContainer{ +.headerContainer { width: 100%; margin: auto; height: 80px; @@ -8,16 +7,16 @@ // max-width: 1920px; //position: relative; - .itemsWrapper{ - width: 80%; - margin: 0 auto; - left: 0; - right: 0; - // background-color: greenyellow; - display: flex; - position: absolute; - justify-content: space-between; - } + .itemsWrapper { + width: 80%; + margin: 0 auto; + left: 0; + right: 0; + // background-color: greenyellow; + display: flex; + position: absolute; + justify-content: space-between; + } .logoBox { width: 150px; @@ -27,7 +26,7 @@ position: relative; // background-color: aqua; - img{ + img { width: 80px; position: absolute; margin: 0 auto; @@ -35,102 +34,103 @@ right: 0; } } - - .searchBox{ - margin-top: 20px; - input{ - padding-left: 30px; - border: solid 1px #c6c6c6; - border-radius: 10px; - margin: 0 auto; - display: flex; - height: 40px; - width: 400px; - outline: none; - left: 0; - right: 0; - // background-color:aqua; + .searchBox { + position: relative; + margin-top: 20px; + display: flex; + + input { + padding-left: 20px; + padding-right: 35px; + border: solid 1px #8b8b8b; + border-radius: 15px; + margin: 0 auto; + display: flex; + height: 40px; + width: 400px; + outline: none; + left: 0; + right: 0; + &:focus { + // border: 2px solid rgb(202, 159, 18); + // box-shadow: 1px 1px 1px 0.3px rgb(202, 159, 18); } } + img { + position: absolute; + width: 25px; + height: 25px; + right: 5px; + top: 6px; + } + } - .Header-box { - display: flex; - // vertical-align: top; - align-items: center; - gap: 30px; - height: 30px; - margin-top: 20px; - // max-width: 1230px; - // background-color: yellow; - - .Header-box__text{ - text-Decoration:none; - color: gray; - font-weight: bold; - cursor: pointer; - display: flex; - - .Header-box__logout{ - padding: 15px 20px 0 0; - } - } - - .cart { - // border: solid 1px red; - position: relative; - width: 50px; - height: 50px; - border-radius: 50%; - overflow: hidden; - border: none; - background-position: center; - background-size: contain; - background-repeat: no-repeat; - overflow: hidden; - object-fit: cover; - - .cartPhoto{ - // border: solid 1px blue; + .Header-box { + display: flex; + // vertical-align: top; + align-items: center; + gap: 30px; + height: 30px; + margin-top: 20px; + // max-width: 1230px; + // background-color: yellow; + + .Header-box__text { + text-decoration: none; + color: gray; + font-weight: bold; + cursor: pointer; + display: flex; + + .Header-box__logout { + padding: 15px 20px 0 0; + } + } - // position: absolute; - // width: 100%; - // height: 100%; - // top: 0; - // left: 0; - // object-fit: cover; - - cursor:auto; - box-sizing: border-box; - position: relative; - // top:-5px; - // left:-5px; - width: 50px; - height: 50px; - // border-width:2px; - border-radius: 50%; - background-position: center; - background-size: contain; - background-repeat: no-repeat; - overflow: hidden; - object-fit: cover; - } - } + .cart { + // border: solid 1px red; + position: relative; + width: 50px; + height: 50px; + border-radius: 50%; + overflow: hidden; + border: none; + background-position: center; + background-size: contain; + background-repeat: no-repeat; + overflow: hidden; + object-fit: cover; + + .cartPhoto { + // border: solid 1px blue; + + // position: absolute; + // width: 100%; + // height: 100%; + // top: 0; + // left: 0; + // object-fit: cover; + + cursor: auto; + box-sizing: border-box; + position: relative; + // top:-5px; + // left:-5px; + width: 50px; + height: 50px; + // border-width:2px; + border-radius: 50%; + background-position: center; + background-size: contain; + background-repeat: no-repeat; + overflow: hidden; + object-fit: cover; } - + } + } } - - - - - - - - - - - // addict — 오늘 오후 3:06 // { // margin: 0; @@ -168,4 +168,4 @@ // background-color: red; // } // } -// } \ No newline at end of file +// } diff --git a/src/Components/Views/MainPage/Component/Carousel.tsx b/src/Components/Views/MainPage/Component/Carousel.tsx index 0ffbbe59..8a59c76e 100644 --- a/src/Components/Views/MainPage/Component/Carousel.tsx +++ b/src/Components/Views/MainPage/Component/Carousel.tsx @@ -1,5 +1,5 @@ -import { useCallback, useEffect, useRef, useState } from 'react'; -import './Carousel.scss'; +import { useCallback, useEffect, useRef, useState } from "react"; +import "./Carousel.scss"; const arr = [2, 3, 1, 2, 3, 1, 2]; let idx = 2; @@ -9,7 +9,7 @@ export default function Carousel() { const timeout = useCallback((idx: number) => { const id = setTimeout(() => { - carousel.current?.classList.remove('transition'); + carousel.current?.classList.remove("transition"); setTransform(50 * idx); }, 500); return () => { @@ -19,16 +19,16 @@ export default function Carousel() { function navigation(e: React.MouseEvent) { if (e.target instanceof Element) { const target = e.target.id; - if (target === 'next') { - carousel.current?.classList.add('transition'); + if (target === "next") { + carousel.current?.classList.add("transition"); idx++; setTransform(50 * idx); if (idx === arr.length - 2) { idx = 2; timeout(idx); } - } else if (target === 'prev') { - carousel.current?.classList.add('transition'); + } else if (target === "prev") { + carousel.current?.classList.add("transition"); idx--; setTransform(50 * idx); if (idx === 1) { @@ -40,7 +40,7 @@ export default function Carousel() { } useEffect(() => { const id = setInterval(() => { - carousel.current?.classList.add('transition'); + carousel.current?.classList.add("transition"); idx++; setTransform(50 * idx); if (idx === arr.length - 2) { @@ -78,4 +78,4 @@ export default function Carousel() {
    ); -} \ No newline at end of file +} diff --git a/src/Components/Views/MainPage/Component/Recommand.scss b/src/Components/Views/MainPage/Component/Recommand.scss index 87243300..92b393bb 100644 --- a/src/Components/Views/MainPage/Component/Recommand.scss +++ b/src/Components/Views/MainPage/Component/Recommand.scss @@ -1,10 +1,10 @@ .Recommand { margin: 100px auto 0; width: 90%; - + h1 { width: 150px; - padding-bottom: 10px; + padding-bottom: 10px; } } .Recommand-wrapper { @@ -32,6 +32,3 @@ position: relative; left: 50px; } - - - diff --git a/src/Components/Views/MainPage/Component/Recommand.tsx b/src/Components/Views/MainPage/Component/Recommand.tsx index b3a5b263..75ab1cca 100644 --- a/src/Components/Views/MainPage/Component/Recommand.tsx +++ b/src/Components/Views/MainPage/Component/Recommand.tsx @@ -1,7 +1,7 @@ -import { useEffect, useState } from 'react'; -import { getRecommand, getList } from '@/Apis/productApi'; -import './Recommand.scss'; -import { Link } from 'react-router-dom'; +import { useEffect, useState } from "react"; +import { getRecommand, getList } from "@/Apis/productApi"; +import "./Recommand.scss"; +import { Link } from "react-router-dom"; type RecommandProducts = RecommandProduct[]; @@ -22,7 +22,7 @@ export default function Recommand() { const res = await getRecommand(); console.log(res.products); setList(res.products); - const productList = res.products.map((obj) => obj.product_no).join(','); + const productList = res.products.map((obj) => obj.product_no).join(","); return productList; } catch (err) { console.log(err); @@ -61,4 +61,4 @@ export default function Recommand() {
    ); -} \ No newline at end of file +} diff --git a/src/Components/Views/MainPage/MainPage.scss b/src/Components/Views/MainPage/MainPage.scss index cb2fdd09..6a182d89 100644 --- a/src/Components/Views/MainPage/MainPage.scss +++ b/src/Components/Views/MainPage/MainPage.scss @@ -15,26 +15,26 @@ main { display: flex; width: 1200px; margin: 100px auto; - + .Category-menu { position: sticky; top: 0px; margin-left: -80px; height: 410px; - + img { position: sticky; width: 120px; height: inherit; } - - .Category-menu__text{ - width: 125px; + + .Category-menu__text { + width: 127px; position: absolute; bottom: 50px; height: 360px; - padding: 10px; - + padding: 4px; + li { display: flex; align-items: center; @@ -57,7 +57,7 @@ main { align-items: center; justify-content: center; height: 50px; - width: 100px; + width: 110px; border-radius: 30px; transition: background-color 0.3s; } diff --git a/src/Components/Views/SearchPage/SearchPage.scss b/src/Components/Views/SearchPage/SearchPage.scss index ca04cd03..e124f489 100644 --- a/src/Components/Views/SearchPage/SearchPage.scss +++ b/src/Components/Views/SearchPage/SearchPage.scss @@ -1,4 +1,4 @@ -.wrapper { +.Search-wrapper { width: 1200px; margin: auto; } @@ -88,3 +88,25 @@ background-color: #e24457; } } +// 페이지네이션 +.pagination { + ul { + display: flex; + justify-content: center; + padding: 20px 0; + + li { + list-style: none; + + button { + width: 30px; + height: 30px; + background-color: #ca9f12; + border: none; + border-radius: 50%; + margin: 0 5px; + color: #fff; + } + } + } +} diff --git a/src/Components/Views/SearchPage/SearchPage.tsx b/src/Components/Views/SearchPage/SearchPage.tsx index 1327a5da..b6f7f31f 100644 --- a/src/Components/Views/SearchPage/SearchPage.tsx +++ b/src/Components/Views/SearchPage/SearchPage.tsx @@ -14,7 +14,7 @@ const ajax = axios.create({ }); export default function SearchPage() { - const [input, setInput] = useState(""); + // const [input, setInput] = useState(""); const [search, setSearch] = useState([] as Products); const [offset, setOffset] = useState(0); const [count, setCount] = useState(0); @@ -33,37 +33,33 @@ export default function SearchPage() { console.log(err); } } - useEffect(() => { - searchUpload(); - }, [offset]); + // useEffect(() => { + // window.scrollTo(0, 0); + // searchUpload(); + // }, [offset]); - const searchInputChange = (e: any) => { - setInput(e.target.value); - }; + // const searchInputChange = (e: any) => { + // setInput(e.target.value); + // }; - const searchUpload = async () => { - await ajax - .get("/products/count", { - params: { - product_name: input, - }, - }) - .then((res) => setCount(res.data.count)); - const result = await SearchAPI(input); - setSearch(result); - console.log(result); - }; - // console.log("search:", search); + useEffect(() => { + (async () => { + await ajax + .get("/products/count", { + params: { + product_name: params.keyword, + }, + }) + .then((res) => setCount(res.data.count)); + const result = await SearchAPI(params.keyword); + setSearch(result); + console.log(result); + window.scrollTo(0, 0); + })(); + }, [params, offset]); return ( -
    - {/* - */} +
    {search && search.map((v) => { return ( @@ -92,7 +88,7 @@ export default function SearchPage() { ); })} -
    +
      { if (e.target instanceof HTMLLIElement) { @@ -100,22 +96,16 @@ export default function SearchPage() { // console.log("e:", e.target.value); } }} - style={{ - display: "flex", - justifyContent: "center", - paddingTop: 20, - paddingBottom: 20, - }} > {Array(parseInt(((count - 0.1) / 10 + 1).toString())) .fill(0) .map((i, index) => ( -
    • +
    • From 39423612095469b0ee090a453c6892c628602022 Mon Sep 17 00:00:00 2001 From: moon daehyun Date: Tue, 27 Jun 2023 13:08:06 +0900 Subject: [PATCH 49/75] =?UTF-8?q?feat:=20css=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/images/default-profile.jpg | Bin 0 -> 6902 bytes src/Apis/register.tsx | 4 +- src/App.scss | 2 + src/Common/Form/Login/login.scss | 3 +- src/Common/Form/Login/login.tsx | 2 + src/Common/Form/Signin/join.scss | 3 +- src/Common/Form/Signin/join.tsx | 2 +- src/Common/Layout/Footer/footer.scss | 23 +++- src/Common/Layout/Header/header.tsx | 62 ++++++---- src/Common/Layout/Header/headers.scss | 37 +++--- src/Components/Views/CartPage/CartPage.scss | 34 ++++-- src/Components/Views/CartPage/CartPage.tsx | 89 +++++++------- .../Views/MainPage/Component/Genre.scss | 7 ++ src/Components/Views/MainPage/MainPage.scss | 7 +- src/Components/Views/MyPage/MyPage.scss | 24 ++-- src/Components/Views/MyPage/MyPage.tsx | 20 +-- src/Components/Views/MyPage/UserInfo.scss | 111 ++++++++++++++++- src/Components/Views/MyPage/UserInfo.tsx | 115 +++++++++++++----- .../Views/MyPage/common/StyleCommon.scss | 8 +- .../MyPage/common/components/Category.scss | 31 ++--- .../MyPage/common/components/Category.tsx | 56 +++++++-- 21 files changed, 447 insertions(+), 193 deletions(-) create mode 100644 public/images/default-profile.jpg diff --git a/public/images/default-profile.jpg b/public/images/default-profile.jpg new file mode 100644 index 0000000000000000000000000000000000000000..853a52b6c66ed1d0b53ec0504e79ddf0ff915050 GIT binary patch literal 6902 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 literal 0 HcmV?d00001 diff --git a/src/Apis/register.tsx b/src/Apis/register.tsx index b4d73aea..90470cba 100644 --- a/src/Apis/register.tsx +++ b/src/Apis/register.tsx @@ -11,9 +11,9 @@ const axiosInstance = axios.create({ headers, }); -export const JoinForm = async (email: string, displayName: string, password: string, profileImg:string) => { +export const JoinForm = async (email: string, displayName: string, password: string) => { const URL = '/signup'; - const res = await axiosInstance.post(URL, { email, displayName, password, profileImg }); + const res = await axiosInstance.post(URL, { email, displayName, password }); return res.data; }; diff --git a/src/App.scss b/src/App.scss index fcd64da1..1dfde087 100644 --- a/src/App.scss +++ b/src/App.scss @@ -8,6 +8,8 @@ body { margin: 0; background-color: #f8ede3; font-family: 'SUITE-Regular'; + width: 100%; + // padding: 0 20px; } a { diff --git a/src/Common/Form/Login/login.scss b/src/Common/Form/Login/login.scss index 9d6f1190..f34803c5 100644 --- a/src/Common/Form/Login/login.scss +++ b/src/Common/Form/Login/login.scss @@ -70,8 +70,7 @@ display: flex; width: 350px; height: 20px; - //background-color: teal; - // padding-top: 20px; + padding-bottom: 50px; font-size: 18px; position: absolute; bottom: 350px; diff --git a/src/Common/Form/Login/login.tsx b/src/Common/Form/Login/login.tsx index aa74b9eb..5015183d 100644 --- a/src/Common/Form/Login/login.tsx +++ b/src/Common/Form/Login/login.tsx @@ -85,6 +85,7 @@ function Login() {

    +

    아이디가 없으신가요?

    회원가입 하러 가기!

    +
    ); diff --git a/src/Common/Form/Signin/join.scss b/src/Common/Form/Signin/join.scss index eb97148f..c62817bf 100644 --- a/src/Common/Form/Signin/join.scss +++ b/src/Common/Form/Signin/join.scss @@ -1,6 +1,7 @@ @mixin Container { + padding-top: 80px; width: 1200px; - height: 900px; + height: 1000px; padding-bottom: 80px; // background-color: aqua; position: relative; diff --git a/src/Common/Form/Signin/join.tsx b/src/Common/Form/Signin/join.tsx index b12baff6..49ee6110 100644 --- a/src/Common/Form/Signin/join.tsx +++ b/src/Common/Form/Signin/join.tsx @@ -114,7 +114,7 @@ function Join() { try { - const res = await JoinForm(email, displayName, password,profileImg ); + const res = await JoinForm(email, displayName, password ); if (res.accessToken) { alert("가입되었습니다."); navigate("/login"); diff --git a/src/Common/Layout/Footer/footer.scss b/src/Common/Layout/Footer/footer.scss index e3e83458..a303dada 100644 --- a/src/Common/Layout/Footer/footer.scss +++ b/src/Common/Layout/Footer/footer.scss @@ -1,14 +1,20 @@ footer { + // position: fixed; + bottom: 0; + width: 100%; + max-width: 100%; background-color: rgb(255, 255, 255); height: 100px; - position: relative; + // position: relative; border-top: solid 2px rgb(202, 159, 18); + max-width: 100%; + z-index: 9999; .Footer-inner { display: flex; position: absolute; width: 380px; - gap: 30px; + gap: 20px; right: 100px; .wrap { @@ -18,6 +24,8 @@ footer { justify-content: center; align-items: center; margin-top: 20px; + width: 100%; + padding: 0 10px; &:hover { cursor: pointer; @@ -31,10 +39,17 @@ footer { .Logo-box { position: absolute; left: 170px; + img{ - width: 110px; - height: 90px; + // width: 100px; + // height: 80px; + width: 80px; + top: 15px; + position: absolute; + margin: 0 auto; + left: 0; + right: 0; } } .title { diff --git a/src/Common/Layout/Header/header.tsx b/src/Common/Layout/Header/header.tsx index 47111680..cb518cee 100644 --- a/src/Common/Layout/Header/header.tsx +++ b/src/Common/Layout/Header/header.tsx @@ -1,5 +1,6 @@ import { Link, useNavigate } from "react-router-dom"; -import { useState } from "react"; +import axios from "axios"; +import { useEffect, useState } from "react"; import "./headers.scss"; import { LogoutForm } from "@/Apis/register"; @@ -9,8 +10,9 @@ interface User { } function Header() { - const [user, setUser] =useState({} as User) - //const [token, setToken] = useState(localStorage.getItem("token")); + + const defaultProfileImgUrl = "/public/images/default-profile.jpg"; + const [user, setUser] = useState({ displayName: "", profileImg: "" }); const navigate = useNavigate(); @@ -28,25 +30,37 @@ function Header() { const token = localStorage.getItem('token'); - // async function authenticate() { - // axios('https://asia-northeast3-heropy-api.cloudfunctions.net/api/auth/me',{ - // method:"post", - // headers:{ - // Authorization: `Bearer ${localStorage.getItem("token")}`, - // "Content-Type": "application/json", - // apikey: "KDT5_nREmPe9B", - // username: "KDT5_TeamWink", - // }, - // }).then((res) => { - // console.log("res:",res); - // setUser(res.data); - // }) - // } - - // useEffect(() => { - // authenticate() - // }, []) - + useEffect(() => { + const authenticate = async () => { + try { + const response = await axios.post( + "https://asia-northeast3-heropy-api.cloudfunctions.net/api/auth/me", + {}, + { + headers: { + Authorization: `Bearer ${localStorage.getItem("token")}`, + "Content-Type": "application/json", + apikey: "KDT5_nREmPe9B", + username: "KDT5_TeamWink", + }, + } + ); + const userData = response.data; + + // 사용자 정보를 업데이트하기 전에 profileImg가 존재하지 않을 경우에만 기본 프로필 이미지 URL을 사용 + setUser((prevUser) => ({ + ...prevUser, + displayName: userData.displayName, + profileImg: userData.profileImg || defaultProfileImgUrl, + })); + } catch (error) { + console.error(error); + // 오류 처리 + } + }; + + authenticate(); + }, []); return ( @@ -71,7 +85,9 @@ function Header() {
    로그아웃
    - +
    ) : ( diff --git a/src/Common/Layout/Header/headers.scss b/src/Common/Layout/Header/headers.scss index 09e7fc00..26a3a7ca 100644 --- a/src/Common/Layout/Header/headers.scss +++ b/src/Common/Layout/Header/headers.scss @@ -1,22 +1,25 @@ - .headerContainer{ + position: fixed; width: 100%; - margin: auto; + max-width: 100%; + margin: 0 auto; height: 80px; background-color: rgb(255, 255, 255); border-bottom: 2px solid rgb(202, 159, 18); - // max-width: 1920px; - //position: relative; + background-size: 100% 100%; // 배경 이미지의 크기를 100%로 설정 + padding: 0 20px; + z-index: 9999; .itemsWrapper{ - width: 80%; + // width: 80%; margin: 0 auto; left: 0; right: 0; - // background-color: greenyellow; display: flex; position: absolute; - justify-content: space-between; + justify-content: space-evenly; + align-items: center; + width: 100%; } .logoBox { @@ -25,7 +28,6 @@ height: 50px; display: inline-block; position: relative; - // background-color: aqua; img{ width: 80px; @@ -38,6 +40,7 @@ .searchBox{ margin-top: 20px; + padding-left: 100px; input{ padding-left: 30px; @@ -50,30 +53,24 @@ outline: none; left: 0; right: 0; - // background-color:aqua; } } .Header-box { display: flex; - // vertical-align: top; align-items: center; gap: 30px; - height: 30px; + height: 45px; margin-top: 20px; - // max-width: 1230px; width: 400px; - background-color: yellow; .Header-box__text { color: gray; - background-color: orange; font-weight: bold; width: 100px; height: 30px; cursor: pointer; - .Header-box__logout{ width: inherit; } @@ -83,13 +80,12 @@ position: relative; width: 60px; height: 60px; - //background-color: pink; left: 130px; bottom: 30px; + - .img { + .cartPhoto{ cursor:auto; - background-color: olive; box-sizing: border-box; position: absolute; width: 50px; @@ -101,5 +97,6 @@ } } } - -} \ No newline at end of file +} + + diff --git a/src/Components/Views/CartPage/CartPage.scss b/src/Components/Views/CartPage/CartPage.scss index 5685bf68..017f0c2e 100644 --- a/src/Components/Views/CartPage/CartPage.scss +++ b/src/Components/Views/CartPage/CartPage.scss @@ -7,20 +7,33 @@ // 장바구니 전체 레이아웃 .CartPage-AllLayout { - //font-family: 'SUITE-Regular'; + font-family: 'SUITE-Regular'; width: 1200px; - padding-bottom: 1400px; + height: 1500px; + // padding-bottom: 1400px; position: relative; margin: 0 auto; + top: 80px; font-weight: 600; - //background-color: aquamarine; + // background-color: aquamarine; + + // .Layout{ + // font-family: 'SUITE-Regular'; + // width: 1200px; + // height: auto; + // padding-bottom: 200px; + // position: relative; + // margin: 0 auto; + // top: 80px; + // font-weight: 600; + // background-color: aquamarine; .ProductText { @include CartNameStyle; top: 10px; left: 45px; position: absolute; - //background-color: red; + // background-color: red; } .CartContainer { @@ -45,7 +58,7 @@ } .RentText { - //background-color: olive; + // background-color: olive; position: absolute; font-size: 20px; top: 600px; @@ -64,7 +77,7 @@ } .BuyText { - //background-color: olive; + // background-color: olive; position: absolute; height: 50px; font-size: 20px; @@ -75,8 +88,10 @@ .BuyContainer { position: absolute; width: inherit; - padding-bottom: 200px; - bottom: 10px; + // padding-bottom: 200px; + height: 200px; + bottom: 100px; + border-radius: 10px; background-color: #eddbc7; .NowBuy { @@ -90,7 +105,7 @@ width: 250px; position: absolute; padding-bottom: 10px; - //background-color: gold; + // background-color: gold; margin: 0 auto; left: 0; right: 0; @@ -147,4 +162,5 @@ } } } +// } } diff --git a/src/Components/Views/CartPage/CartPage.tsx b/src/Components/Views/CartPage/CartPage.tsx index 118638cc..e5a20ad7 100644 --- a/src/Components/Views/CartPage/CartPage.tsx +++ b/src/Components/Views/CartPage/CartPage.tsx @@ -109,57 +109,58 @@ function CartPage() { return ( <>
    - 구매 -
    - -
    - 대여 -
    - -
    + {/*
    */} + 구매 +
    + +
    + 대여 +
    + +
    - 결제 -
    -
    -
    -
    - 총 상품 가격 - {ShowTotal &&

    Total Amount: ${Total}

    } + 결제 +
    +
    +
    +
    + 총 상품 가격 + {ShowTotal &&

    Total Amount: ${Total}

    } +
    -
    -
    -
    - 총 결제 예상 금액 - 28,000 원 +
    +
    + 총 결제 예상 금액 + 28,000 원 +
    -
    -
    - {/* */} - +
    + {/* */} + +
    -
    + {/*
    */}
    ); diff --git a/src/Components/Views/MainPage/Component/Genre.scss b/src/Components/Views/MainPage/Component/Genre.scss index 494eee81..84d93363 100644 --- a/src/Components/Views/MainPage/Component/Genre.scss +++ b/src/Components/Views/MainPage/Component/Genre.scss @@ -1,10 +1,12 @@ .books { display: flex; overflow: hidden; + margin: 0 15px; &:not(:last-child) { margin-bottom: 50px; } } + .left { background-color: #fed19a; width: 180px; @@ -15,8 +17,10 @@ padding: 30px 10px; color: #555252; font-size: 15px; + text-align: center; } } + .right { background-color: #FFF3E2; width: 1030px; @@ -63,6 +67,7 @@ margin: 10px 0; } } + .hover-description { position: absolute; padding: 5%; @@ -79,6 +84,7 @@ text-shadow: -1px -1px 0 #000, 1px -1px 0 #000, -1px 1px 0 #000, 1px 1px 0 #000; } + .discount { position: absolute; width: fit-content; @@ -91,6 +97,7 @@ z-index: 200; top: 120px; } + .retail-price { text-decoration: line-through; color: rgb(122, 122, 122); diff --git a/src/Components/Views/MainPage/MainPage.scss b/src/Components/Views/MainPage/MainPage.scss index 28694cf1..a9b70984 100644 --- a/src/Components/Views/MainPage/MainPage.scss +++ b/src/Components/Views/MainPage/MainPage.scss @@ -1,6 +1,7 @@ .wrapper { + padding-top: 150px; width: 1500px; - margin: 100px auto 0; + margin: 0 auto 0 auto; // background-color: yellow; position: relative; } @@ -18,11 +19,13 @@ main { .Category-menu { position: sticky; - top: 0px; + top: 100px; margin-left: -80px; height: 410px; + // margin-left: 0; img { + border-radius: 10px 10px 0 0; position: sticky; width: 120px; height: inherit; diff --git a/src/Components/Views/MyPage/MyPage.scss b/src/Components/Views/MyPage/MyPage.scss index 8b1ad5ca..b7c33f38 100644 --- a/src/Components/Views/MyPage/MyPage.scss +++ b/src/Components/Views/MyPage/MyPage.scss @@ -18,9 +18,10 @@ left:10px; top: 30px; width: 100px; - font-size: 20px; - margin-left: 2rem; - background-color: #F2E7D5; + font-size: 25px; + font-weight: bold; + margin-left: 5rem; + // background-color: #F2E7D5; } .orderContainer{ @@ -28,6 +29,7 @@ padding-bottom: 400px; //background-color: rgb(148, 255, 124); top: 50px; + .TopCategory{ width: 980px; @@ -35,9 +37,10 @@ position:relative; display: flex; height: 40px; - left: 10px; + // left: 10px; background-color: #e8e0d6; gap: 120px; + margin: 0 auto; .TopCategory-inner{ width: 70px; @@ -46,6 +49,7 @@ position: relative; margin-left: 25px; margin-top: 10px; + } } @@ -145,14 +149,15 @@ } } - .RentContainer-text{ + .RentText{ position: relative; left:10px; top: 100px; width: 100px; - //font-size: 20px; - margin-left: 2rem; - background-color: #F2E7D5; + font-size: 25px; + font-weight: bold; + margin-left: 5rem; + // background-color: #F2E7D5; } .RentContainer{ @@ -167,9 +172,10 @@ position:relative; display: flex; height: 40px; - left: 10px; + // left: 10px; background-color: #e8e0d6; gap: 120px; + margin: 0 auto; .RentCategory-inner{ width: 70px; diff --git a/src/Components/Views/MyPage/MyPage.tsx b/src/Components/Views/MyPage/MyPage.tsx index 1dae0ccb..5e38547b 100644 --- a/src/Components/Views/MyPage/MyPage.tsx +++ b/src/Components/Views/MyPage/MyPage.tsx @@ -7,7 +7,6 @@ interface PaymentItem { merchant_uid: string; custom_data:string; paid_at: string; - } interface PaymentsResponse { @@ -66,14 +65,12 @@ const GetToken = async () => { const fetchData = async (): Promise => { try { const paynumber: string | null = window.localStorage.getItem('mypayment'); - if (paynumber) { const merchantUids = JSON.parse(paynumber); const accessToken = await GetToken(); const paymentsResponse: AxiosResponse = await axios.get( `/iamport/payments/status/paid?limit=20&sorting=paid&_token=${accessToken}` ); - if (paymentsResponse.data && paymentsResponse.data.response && paymentsResponse.data.response.list) { const filteredList: PaymentItem[] = paymentsResponse.data.response.list.filter((item) => merchantUids.includes(item.merchant_uid) @@ -120,7 +117,6 @@ useEffect(() => { const DeleteList = (itemnum: string) => { const MyPay = localStorage.getItem("mypayment"); - if (MyPay && MyPay.includes(itemnum)) { const updatedList = MyPay.replace(itemnum, "").trim(); localStorage.setItem("mypayment", updatedList); @@ -128,8 +124,8 @@ const DeleteList = (itemnum: string) => { fetchData(); } -const onClickDelete = async (key:string) => { +const onClickDelete = async (key:string) => { if(confirm("주문을 취소 하시겠습니까?")){ const accessToken = await GetToken(); const data = { @@ -169,13 +165,9 @@ const getDate = function(param:any){
    -
    구매 내역
    - -
    -
    {Object.keys(TopCategory).map(key => { return @@ -187,7 +179,6 @@ const getDate = function(param:any){ {mydataList .filter((el: PageData) => el.gubun === 'buy') .map((item: PageData, index: number) => ( -
    {item.merchant_uid.replace("mid_","")} {getDate(item.paid_at)} @@ -200,12 +191,10 @@ const getDate = function(param:any){
    - ))}
    - -
    대여 내역
    +
    대여 내역
    {Object.keys(TopCategory).map(key => { @@ -218,7 +207,6 @@ const getDate = function(param:any){ {mydataList .filter((el: PageData) => el.gubun === 'rent') .map((item: PageData, index: number) => ( -
    {item.merchant_uid.replace("mid_","")} {getDate(item.paid_at)} @@ -231,12 +219,10 @@ const getDate = function(param:any){
    - ))}
    - -
    +
    diff --git a/src/Components/Views/MyPage/UserInfo.scss b/src/Components/Views/MyPage/UserInfo.scss index 82ca001b..f3db508f 100644 --- a/src/Components/Views/MyPage/UserInfo.scss +++ b/src/Components/Views/MyPage/UserInfo.scss @@ -1,7 +1,8 @@ @import './common/StyleCommon.scss'; - + .UserInfo-AllLayout{ @include AllLayoutStyle; + padding-bottom: 1000px; .UserInfo-AllLayout__center{ @include LayoutCenterStyle; @@ -12,7 +13,113 @@ .RightContainer{ @include RightContainerStyle; + + .infoContainer{ + position: relative; + top: 3rem; + // margin: 0 auto; + margin-left: 3rem; + height: 90%; + // border: solid 1px rgb(221,221,221); + // background-color: rgb(124, 255, 255); + + .info{ + position: relative; + // background-color: rgb(224, 57, 57); + top: 2rem; + + + .infoTag{ + display: flex; + + .infoText{ + position: relative; + left:2rem; + // border: solid 1px black; + font-size: 24px; + font-weight: 900; + color:black; + padding:.5rem 1rem; + margin-left: 2rem; + } + } + + .infoBox{ + position: relative; + margin: 2rem 4rem 0 4rem; + // background-color: cadetblue; + // border: dotted 1px black; + width: auto; + height: 30rem; + // display: flex; + + .infoList{ + display:flex; + // background-color: rgb(245, 242, 97); + padding: 1.5rem 1.2rem; + + .infoTitle{ + width: 8rem; + padding-top: 10px; + text-align: center; + font-weight: bold; + } + + .infoItem{ + .infoItemForm{ + padding: 15px; + margin-left: 15px; + width:500px; + background-color: white; + border: solid 1px rgb(221, 221, 221); + border-radius: .5rem; + } + + + .btn-upload { + padding: 15px; + margin-left: 15px; + width:200px; + color:rgb(123, 123, 123); + background-color: white; + border: solid 1px rgb(221, 221, 221); + border-radius: .5rem; + cursor: pointer; + display: flex; + justify-content: center; + &:hover { + background: rgb(77,77,77); + color: #fff; + } + } + + #file { + display: none; + } + + } + + .infoFix{ + background-color:rgb(53, 197, 240); + border-radius: .5rem; + margin-left: 10rem; + padding: 15px; + width: 15rem; + color:white; + font-weight: 700; + font-size: 18px; + cursor: pointer; + &:hover { + background-color:rgb(96, 203, 235); + color: black; + } + } + } + } + } + } } } + } - \ No newline at end of file + diff --git a/src/Components/Views/MyPage/UserInfo.tsx b/src/Components/Views/MyPage/UserInfo.tsx index 1ae4789c..8abd1ecf 100644 --- a/src/Components/Views/MyPage/UserInfo.tsx +++ b/src/Components/Views/MyPage/UserInfo.tsx @@ -2,18 +2,14 @@ import { FormEvent, useState, useEffect, ChangeEvent, useCallback, useRef } from import axios from "axios"; import { Link, useNavigate } from "react-router-dom"; import "./UserInfo.scss"; -import Category from "./common/components/category"; +import Category from "./common/components/Category"; -interface User { - displayName: string // 사용자 표시 이름 - profileImg: string // 사용자 프로필 이미지 URL -} function UserInfo() { const navigate = useNavigate(); // 이름 , 프로필사진 , 구 비밀번호 , 새 비밀번호 - const [user, setUser] =useState({} as User) + const [displayName, setDisplayName] = useState(); // {} as User const [profileImgBase64, setProfileImgBase64] = useState(""); const [oldPassword, setOldPassword] = useState(""); @@ -57,27 +53,6 @@ function UserInfo() { } } - async function authenticate() { - axios('https://asia-northeast3-heropy-api.cloudfunctions.net/api/auth/me',{ - method:"post", - headers:{ - Authorization: `Bearer ${localStorage.getItem("token")}`, - "Content-Type": "application/json", - apikey: "KDT5_nREmPe9B", - username: "KDT5_TeamWink", - }, - }).then((res) => { - console.log("res:",res); - setUser(res.data); - - }) - } - - useEffect(() => { - authenticate() - }, []) - - return ( <>
    @@ -85,13 +60,89 @@ function UserInfo() {
    - -
    - + +
    +
    +
    +
    +
    회원정보 수정
    +
    +
    +
    +
    +
    기존 비밀번호
    +
    + setOldPassword(e.target.value)} + required + /> +
    +
    +
    +
    새 비밀번호
    +
    + setNewPassword(e.target.value)} + required + /> +
    +
    +
    +
    닉네임 변경
    +
    + setDisplayName(e.target.value)} + required + /> +
    +
    +
    +
    프로필 이미지
    +
    + + +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    - - +
    diff --git a/src/Components/Views/MyPage/common/StyleCommon.scss b/src/Components/Views/MyPage/common/StyleCommon.scss index f8832f03..25d5c58a 100644 --- a/src/Components/Views/MyPage/common/StyleCommon.scss +++ b/src/Components/Views/MyPage/common/StyleCommon.scss @@ -1,18 +1,18 @@ @mixin AllLayoutStyle { - width: 1200px; - padding-bottom: 1500px; + width: 1600px; + height: 1300px; position: relative; margin: 0 auto; } @mixin LayoutCenterStyle { - width: 1200px; + width: 1300px; position: absolute; display: flex; margin: 0 auto; left: 0; right: 0; - top:100px; + padding-top: 120px; } @mixin LeftContainerStyle { diff --git a/src/Components/Views/MyPage/common/components/Category.scss b/src/Components/Views/MyPage/common/components/Category.scss index cf85c34d..42ce0785 100644 --- a/src/Components/Views/MyPage/common/components/Category.scss +++ b/src/Components/Views/MyPage/common/components/Category.scss @@ -8,36 +8,38 @@ top:22px; height: 250px; background-color: bisque; + text-align: center; .LeftContainer-profile__Photo{ + background-color: white; position: relative; - margin-top:20px; + top: 30px; width: 120px; height: 120px; - margin-left: auto; - margin-right: auto; + // margin-left: auto; + // margin-right: auto; border: solid 1px rgb(243, 214, 172); border-radius: 50%; box-shadow: 2px 5px 5px rgb(0,0,0,.3); background-position: center; + background-size: contain; + background-repeat: no-repeat; + overflow: hidden; + object-fit: cover; } .LeftContainer-profile__box{ position: relative; margin-top: 2.5rem; - color:rgb(192, 138, 138); + // color:rgb(192, 138, 138); text-align: center; - background-color: yellow; + // background-color: yellow; .LeftContainer-profile__text{ - font-size: 20px; + padding-top: 1rem; + font-size: 1.5rem; font-weight: bold; // 1000 } - - .LeftContainer-profile__name{ - font-size: 15px; - margin-top: 1rem; - } } } @@ -47,10 +49,11 @@ height: 290px; width: 200px; top:30px; + margin: auto; - .active{ - background-color: red; - } + .active{ + background-color: rgb(243, 214, 172); + } a { color: white; diff --git a/src/Components/Views/MyPage/common/components/Category.tsx b/src/Components/Views/MyPage/common/components/Category.tsx index a61c431a..45372db0 100644 --- a/src/Components/Views/MyPage/common/components/Category.tsx +++ b/src/Components/Views/MyPage/common/components/Category.tsx @@ -1,9 +1,51 @@ import './Category.scss' import { Link } from "react-router-dom"; -import {useEffect } from 'react'; +import { useState, useEffect } from 'react'; +import axios from "axios"; + +interface User { + displayName: string; // 사용자 표시 이름 + profileImg: string; // 사용자 프로필 이미지 URL +} const Category = () => { +// 기본 프로필 이미지 URL +const defaultProfileImgUrl = "/public/images/default-profile.jpg"; +const [user, setUser] = useState({ displayName: "", profileImg: defaultProfileImgUrl }); + +useEffect(() => { + const authenticate = async () => { + try { + const response = await axios.post( + "https://asia-northeast3-heropy-api.cloudfunctions.net/api/auth/me", + {}, + { + headers: { + Authorization: `Bearer ${localStorage.getItem("token")}`, + "Content-Type": "application/json", + apikey: "KDT5_nREmPe9B", + username: "KDT5_TeamWink", + }, + } + ); + const userData = response.data; + + // 사용자 정보를 업데이트하기 전에 profileImg가 존재하지 않을 경우에만 기본 프로필 이미지 URL을 사용 + setUser((prevUser) => ({ + ...prevUser, + displayName: userData.displayName, + profileImg: userData.profileImg || defaultProfileImgUrl, + })); + } catch (error) { + console.error(error); + // 오류 처리 + } + }; + + authenticate(); +}, []); + useEffect(() => { if (location.pathname === "/mypage") { document.querySelector(".LeftContainer-category__order")?.classList.add("active"); @@ -17,14 +59,14 @@ const Category = () => { return ( <>
    -
    + 프로필사진
    -

    닉네임

    -
    - -
    -

    프로필 자기소개란입니다.

    +

    {user?.displayName}

    From 4d92436da4ad9f0f2c5d0ad20965cdb200d1c0e7 Mon Sep 17 00:00:00 2001 From: moon daehyun Date: Tue, 27 Jun 2023 13:41:00 +0900 Subject: [PATCH 50/75] =?UTF-8?q?feat:=20css=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Common/Layout/Header/headers.scss | 2 +- src/Components/Views/DetailPage/DetailPage.scss | 3 ++- src/Components/Views/DetailPage/components/TopHeader.scss | 3 ++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/Common/Layout/Header/headers.scss b/src/Common/Layout/Header/headers.scss index 8f64dd8f..ff0190bc 100644 --- a/src/Common/Layout/Header/headers.scss +++ b/src/Common/Layout/Header/headers.scss @@ -8,7 +8,7 @@ border-bottom: 2px solid rgb(202, 159, 18); background-size: 100% 100%; // 배경 이미지의 크기를 100%로 설정 padding: 0 20px; - z-index: 9999; + z-index: 900; .itemsWrapper{ // width: 80%; diff --git a/src/Components/Views/DetailPage/DetailPage.scss b/src/Components/Views/DetailPage/DetailPage.scss index 030966c3..9319fe84 100644 --- a/src/Components/Views/DetailPage/DetailPage.scss +++ b/src/Components/Views/DetailPage/DetailPage.scss @@ -24,6 +24,7 @@ } .DetailContainer { + top: 100px; position: relative; width: 1400px; margin: 0 auto; @@ -201,7 +202,7 @@ background-color: white; right: 0; font-size: 20px; - z-index: 1; + z-index: 9999; position: fixed; border-bottom: 2px solid gray; transition: transform 0.3s ease-in-out; diff --git a/src/Components/Views/DetailPage/components/TopHeader.scss b/src/Components/Views/DetailPage/components/TopHeader.scss index 9421b839..91bd594d 100644 --- a/src/Components/Views/DetailPage/components/TopHeader.scss +++ b/src/Components/Views/DetailPage/components/TopHeader.scss @@ -1,5 +1,6 @@ .TopHeader-container{ - + position:relative; + z-index: 9999; .TopHeader-container__text{ width:700px; From dabba4fa410bf27b195d0d89c465c6adba7772f0 Mon Sep 17 00:00:00 2001 From: moon daehyun Date: Tue, 27 Jun 2023 13:41:34 +0900 Subject: [PATCH 51/75] =?UTF-8?q?feat:=20css=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Components/Views/DetailPage/components/TopHeader.scss | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/Components/Views/DetailPage/components/TopHeader.scss b/src/Components/Views/DetailPage/components/TopHeader.scss index 91bd594d..babbdde4 100644 --- a/src/Components/Views/DetailPage/components/TopHeader.scss +++ b/src/Components/Views/DetailPage/components/TopHeader.scss @@ -1,6 +1,4 @@ .TopHeader-container{ - position:relative; - z-index: 9999; .TopHeader-container__text{ width:700px; From f74bdfc6bed65301bcf186b72940d82b12643325 Mon Sep 17 00:00:00 2001 From: moon daehyun Date: Tue, 27 Jun 2023 14:02:06 +0900 Subject: [PATCH 52/75] =?UTF-8?q?feat:=20css=EC=B6=94=EA=B0=80=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Common/Layout/Header/header.tsx | 4 +-- src/Common/Layout/Header/headers.scss | 46 +++++++-------------------- 2 files changed, 13 insertions(+), 37 deletions(-) diff --git a/src/Common/Layout/Header/header.tsx b/src/Common/Layout/Header/header.tsx index cdb20961..4ab95e3a 100644 --- a/src/Common/Layout/Header/header.tsx +++ b/src/Common/Layout/Header/header.tsx @@ -15,7 +15,7 @@ function Header() { // console.log("1", accessToken); // const dispatch = useDispatch(); const defaultProfileImgUrl = "/public/images/default-profile.jpg"; - const [user, setUser] = useState({} as User); + const [user, setUser] = useState({ displayName: "", profileImg: "" }); const [search, setSearch] = useState([] as Products); const [input, setInput] = useState(""); const [keyword, setKeyWord] = useState(""); @@ -139,7 +139,7 @@ function Header() { className="cartPhoto" src={user.profileImg} />
    -
    +
    ) : ( <> diff --git a/src/Common/Layout/Header/headers.scss b/src/Common/Layout/Header/headers.scss index ff0190bc..e3ab06a0 100644 --- a/src/Common/Layout/Header/headers.scss +++ b/src/Common/Layout/Header/headers.scss @@ -71,61 +71,38 @@ .Header-box { display: flex; - // vertical-align: top; align-items: center; gap: 30px; - height: 30px; margin-top: 20px; - // max-width: 1230px; - // background-color: yellow; + width: 400px; .Header-box__text { text-decoration: none; color: gray; font-weight: bold; + width: 100px; + height: 30px; cursor: pointer; display: flex; .Header-box__logout { - padding: 15px 20px 0 0; + width: inherit; + // padding: 15px 20px 0 0; } } - .Header-box { - display: flex; - // vertical-align: top; - align-items: center; - gap: 30px; - height: 30px; - margin-top: 20px; - // max-width: 1230px; - width: 400px; - background-color: yellow; - - .Header-box__text { - color: gray; - background-color: orange; - font-weight: bold; - width: 100px; - height: 30px; - cursor: pointer; - - .Header-box__logout { - width: inherit; - } - } .cart { position: relative; width: 60px; height: 60px; - //background-color: pink; - left: 130px; - bottom: 30px; - - .img { + bottom: 12px; + left:40px; + // background-color: pink; + + .cartPhoto { + // background-color: olive; cursor: auto; - background-color: olive; box-sizing: border-box; position: absolute; width: 50px; @@ -136,6 +113,5 @@ background-repeat: no-repeat; } } - } } } From ae9a9c14b71361df8a9806a6cf66343381e65926 Mon Sep 17 00:00:00 2001 From: saeyeon Date: Tue, 27 Jun 2023 14:06:17 +0900 Subject: [PATCH 53/75] test --- src/Common/Layout/Footer/footer.scss | 87 +++++++++---------- .../Views/SearchPage/SearchPage.scss | 1 + 2 files changed, 44 insertions(+), 44 deletions(-) diff --git a/src/Common/Layout/Footer/footer.scss b/src/Common/Layout/Footer/footer.scss index e3e83458..af2b4c4e 100644 --- a/src/Common/Layout/Footer/footer.scss +++ b/src/Common/Layout/Footer/footer.scss @@ -1,51 +1,50 @@ footer { - background-color: rgb(255, 255, 255); - height: 100px; - position: relative; - border-top: solid 2px rgb(202, 159, 18); - - .Footer-inner { + background-color: rgb(255, 255, 255); + height: 100px; + position: relative; + border-top: solid 2px rgb(202, 159, 18); + + .Footer-inner { + display: flex; + position: absolute; + width: 380px; + gap: 30px; + right: 100px; + + .wrap { display: flex; - position: absolute; - width: 380px; - gap: 30px; - right: 100px; + flex-direction: column; + position: relative; + justify-content: center; + align-items: center; + margin-top: 20px; - .wrap { - display: flex; - flex-direction: column; - position: relative; - justify-content: center; - align-items: center; - margin-top: 20px; - - &:hover { - cursor: pointer; - } - p { - font-size: 12px; - margin-top: 5px; - } + &:hover { + cursor: pointer; } - } - .Logo-box { - position: absolute; - left: 170px; - - img{ - width: 110px; - height: 90px; + p { + font-size: 12px; + margin-top: 5px; } } - .title { - position: absolute; - font-size: 25px; - width: 400px; - height: 40px; - margin: 0 auto; - left: 0; - right: 0; - margin-top: 30px; - + } + .Logo-box { + position: absolute; + left: 170px; + + img { + width: 110px; + height: 90px; } - } \ No newline at end of file + } + .title { + position: absolute; + font-size: 25px; + width: 400px; + height: 40px; + margin: 0 auto; + left: 0; + right: 0; + margin-top: 30px; + } +} diff --git a/src/Components/Views/SearchPage/SearchPage.scss b/src/Components/Views/SearchPage/SearchPage.scss index e124f489..0d498590 100644 --- a/src/Components/Views/SearchPage/SearchPage.scss +++ b/src/Components/Views/SearchPage/SearchPage.scss @@ -1,6 +1,7 @@ .Search-wrapper { width: 1200px; margin: auto; + min-height: 100vh; } .SearchPage { display: flex; From 76de121b4070e33b3bf9de12e80b1773fecdb837 Mon Sep 17 00:00:00 2001 From: saeyeon Date: Tue, 27 Jun 2023 14:27:57 +0900 Subject: [PATCH 54/75] test --- src/Components/Views/MainPage/MainPage.scss | 7 +++---- src/Components/Views/SearchPage/SearchPage.scss | 1 + 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Components/Views/MainPage/MainPage.scss b/src/Components/Views/MainPage/MainPage.scss index 5a104e9e..2903c492 100644 --- a/src/Components/Views/MainPage/MainPage.scss +++ b/src/Components/Views/MainPage/MainPage.scss @@ -1,7 +1,7 @@ .wrapper { padding-top: 150px; - width: 1500px; - margin: 0 auto 0 auto; + width: 1200px; + margin: auto; // background-color: yellow; position: relative; } @@ -19,10 +19,9 @@ main { .Category-menu { position: sticky; top: 100px; - margin-left: -80px; height: 410px; // margin-left: 0; - + img { border-radius: 10px 10px 0 0; position: sticky; diff --git a/src/Components/Views/SearchPage/SearchPage.scss b/src/Components/Views/SearchPage/SearchPage.scss index 0d498590..cda77f63 100644 --- a/src/Components/Views/SearchPage/SearchPage.scss +++ b/src/Components/Views/SearchPage/SearchPage.scss @@ -2,6 +2,7 @@ width: 1200px; margin: auto; min-height: 100vh; + padding-top: 60px; } .SearchPage { display: flex; From 6bcc36567e2b3bb628d0d34f9545e3dfd687ca96 Mon Sep 17 00:00:00 2001 From: hahahaday12 Date: Tue, 27 Jun 2023 14:42:56 +0900 Subject: [PATCH 55/75] =?UTF-8?q?style:=20=EC=8A=A4=ED=83=80=EC=9D=BC=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Components/Views/MainPage/MainPage.scss | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/Components/Views/MainPage/MainPage.scss b/src/Components/Views/MainPage/MainPage.scss index 5a104e9e..476d1b9f 100644 --- a/src/Components/Views/MainPage/MainPage.scss +++ b/src/Components/Views/MainPage/MainPage.scss @@ -1,7 +1,7 @@ .wrapper { padding-top: 150px; - width: 1500px; - margin: 0 auto 0 auto; + width: 1200px; + margin: auto; // background-color: yellow; position: relative; } @@ -19,7 +19,6 @@ main { .Category-menu { position: sticky; top: 100px; - margin-left: -80px; height: 410px; // margin-left: 0; From a36deab87818977442d7102ca0da669d373a82f8 Mon Sep 17 00:00:00 2001 From: Seo Donguk Date: Wed, 28 Jun 2023 13:07:27 +0900 Subject: [PATCH 56/75] =?UTF-8?q?style:=20=EB=A9=94=EC=9D=B8=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20=ED=81=AC=EA=B8=B0=20rem=EC=9C=BC=EB=A1=9C?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Views/MainPage/Component/BookInfo.scss | 14 +++++----- .../Views/MainPage/Component/BookInfo.tsx | 2 +- .../Views/MainPage/Component/Carousel.scss | 6 ++--- .../Views/MainPage/Component/Genre.scss | 24 ++++++++++------- .../Views/MainPage/Component/Genre.tsx | 7 ++--- .../Views/MainPage/Component/Recommand.scss | 2 +- src/Components/Views/MainPage/MainPage.scss | 22 +++++++++------- src/Components/Views/MainPage/MainPage.tsx | 26 ++++--------------- 8 files changed, 46 insertions(+), 57 deletions(-) diff --git a/src/Components/Views/MainPage/Component/BookInfo.scss b/src/Components/Views/MainPage/Component/BookInfo.scss index 4fe68f88..af05058a 100644 --- a/src/Components/Views/MainPage/Component/BookInfo.scss +++ b/src/Components/Views/MainPage/Component/BookInfo.scss @@ -1,20 +1,20 @@ .Book-container { - margin-top: 40px; + margin-bottom: 40px; } .BookInfo-Inner { position: relative; margin-bottom: 20px; - height: 120px; - padding: 10px; + height: 8rem; + padding: 0.6rem; border-radius: 10px; color: black; background-color: #f0d5b7; box-shadow: 5px 5px 5px #b98563; .RoundCircle { - width: 13px; - height: 13px; + width: 0.8rem; + height: 0.8rem; margin: 0 auto; border-radius: 50%; background-color: rgba(255, 254, 253, 0.719); @@ -25,7 +25,7 @@ margin: 10px 0; span { - font-size: 15px; + font-size: 1rem; font-weight: bold; } } @@ -37,6 +37,6 @@ .retail-price { padding: 0 5px; - font-size: 13px; + font-size: 0.6rem; } } diff --git a/src/Components/Views/MainPage/Component/BookInfo.tsx b/src/Components/Views/MainPage/Component/BookInfo.tsx index 4b055779..f4a7180e 100644 --- a/src/Components/Views/MainPage/Component/BookInfo.tsx +++ b/src/Components/Views/MainPage/Component/BookInfo.tsx @@ -36,7 +36,7 @@ export default function BookInfo({ {hover &&
    {summary}
    } {retailPrice !== price ? (
    - {+retailPrice / (+retailPrice - +price)}% + {Math.floor(((+retailPrice - +price) / +retailPrice) * 100)}%
    ) : null} diff --git a/src/Components/Views/MainPage/Component/Carousel.scss b/src/Components/Views/MainPage/Component/Carousel.scss index 9cf06b6a..9b2da427 100644 --- a/src/Components/Views/MainPage/Component/Carousel.scss +++ b/src/Components/Views/MainPage/Component/Carousel.scss @@ -1,5 +1,5 @@ .container { - width: 960px; + width: 60rem; margin: auto; overflow: hidden; border-radius: 10px; @@ -16,8 +16,8 @@ } .page { position: relative; - width: 480px; - height: 460px; + width: 29.7rem; + height: 28rem; flex-shrink: 0; border-radius: 10px; overflow: hidden; diff --git a/src/Components/Views/MainPage/Component/Genre.scss b/src/Components/Views/MainPage/Component/Genre.scss index daafe5cd..b23fdabc 100644 --- a/src/Components/Views/MainPage/Component/Genre.scss +++ b/src/Components/Views/MainPage/Component/Genre.scss @@ -27,10 +27,8 @@ .right { position: relative; background-color: #fff3e2; - //width: 1030px; display: flex; flex-wrap: wrap; - height: 918px; border-radius: 0 5px 5px 0; border-top: 1px solid rgb(219, 218, 218); border-bottom: 1px solid rgb(219, 218, 218); @@ -38,16 +36,16 @@ .Top-bookContainer { position: absolute; - height: 50px; + height: 3.1rem; width: 100%; z-index: 200; - top: 45%; + top: 43%; } .Bottom-bookContainer { position: absolute; width: 100%; - height: 50px; + height: 3.1rem; bottom: 0; } @@ -59,7 +57,7 @@ img { border-radius: 10px; - height: 230px; + width: 100%; position: relative; } } @@ -73,7 +71,7 @@ position: absolute; padding: 5%; width: calc(100% - 20px); - height: 230px; + height: 50%; border-radius: 10px; overflow: hidden; backdrop-filter: blur(5px); @@ -93,12 +91,20 @@ background-color: red; color: #fff; right: 10%; - top: 40%; + //top: 40%; + padding: 0 2px; + overflow: hidden; z-index: 1; } .retail-price { text-decoration: line-through; color: rgb(122, 122, 122); - font-size: 0.6rem; + font-size: 0.8rem; +} + +@media screen and (max-width: 900px) { + html { + font-size: 12px; + } } diff --git a/src/Components/Views/MainPage/Component/Genre.tsx b/src/Components/Views/MainPage/Component/Genre.tsx index 112b4a80..29dc419d 100644 --- a/src/Components/Views/MainPage/Component/Genre.tsx +++ b/src/Components/Views/MainPage/Component/Genre.tsx @@ -30,7 +30,7 @@ export default function Genre({ category }: { category: Props }) {
    - + {list && list.map((item) => ( ))} - +
    ); diff --git a/src/Components/Views/MainPage/Component/Recommand.scss b/src/Components/Views/MainPage/Component/Recommand.scss index 8ca343da..8c65804e 100644 --- a/src/Components/Views/MainPage/Component/Recommand.scss +++ b/src/Components/Views/MainPage/Component/Recommand.scss @@ -17,7 +17,7 @@ border-radius: 10px; border: 3px solid rgb(202, 159, 18); img { - height: 250px; + width: 80%; } h3 { margin: 5px 0; diff --git a/src/Components/Views/MainPage/MainPage.scss b/src/Components/Views/MainPage/MainPage.scss index 5a104e9e..3dce086b 100644 --- a/src/Components/Views/MainPage/MainPage.scss +++ b/src/Components/Views/MainPage/MainPage.scss @@ -1,7 +1,7 @@ .wrapper { padding-top: 150px; - width: 1500px; - margin: 0 auto 0 auto; + max-width: 1200px; + margin: auto; // background-color: yellow; position: relative; } @@ -19,20 +19,22 @@ main { .Category-menu { position: sticky; top: 100px; - margin-left: -80px; - height: 410px; + //height: 410px; + height: 25rem; // margin-left: 0; - + img { border-radius: 10px 10px 0 0; position: sticky; - width: 120px; + //width: 120px; + width: 7.5rem; } .Category-menu__text { width: 127px; position: absolute; - bottom: 50px; + //bottom: 50px; + top: 0; height: 360px; padding: 4px; @@ -40,12 +42,12 @@ main { display: flex; align-items: center; justify-content: center; - height: 50px; - width: 110px; + height: 3.1rem; + width: 6.8rem; margin-top: 10px; border-radius: 30px; font-weight: bold; - font-size: 20px; + font-size: 1.2rem; transition: background-color 0.3s; } .active { diff --git a/src/Components/Views/MainPage/MainPage.tsx b/src/Components/Views/MainPage/MainPage.tsx index 600245e8..b20d0f3c 100644 --- a/src/Components/Views/MainPage/MainPage.tsx +++ b/src/Components/Views/MainPage/MainPage.tsx @@ -1,23 +1,7 @@ -import "./MainPage.scss"; -import Carousel from "./Component/Carousel"; -import ajax from "@/Apis/adminAuth"; -import Main from "./Component/Main"; -import Recommand from "./Component/Recommand"; - - -const params = new URLSearchParams(location.search); -console.log(params.get("code")); -async function auth() { - try { - const res = await ajax.get("/products"); - console.log(res); - } catch (err) { - console.log(err); - } -} -if (params.get("code")) { - auth(); -} +import './MainPage.scss'; +import Carousel from './Component/Carousel'; +import Main from './Component/Main'; +import Recommand from './Component/Recommand'; export default function MainPage() { return ( @@ -27,4 +11,4 @@ export default function MainPage() {
    ); -} \ No newline at end of file +} From cc8e1323855cbb573769725ef5db87588e54835c Mon Sep 17 00:00:00 2001 From: saeyeon Date: Wed, 28 Jun 2023 14:04:40 +0900 Subject: [PATCH 57/75] test --- src/Common/Layout/Header/header.tsx | 42 ++++----- .../Views/SearchPage/SearchPage.tsx | 90 +++++++++++++++---- 2 files changed, 91 insertions(+), 41 deletions(-) diff --git a/src/Common/Layout/Header/header.tsx b/src/Common/Layout/Header/header.tsx index 4ab95e3a..71cf070e 100644 --- a/src/Common/Layout/Header/header.tsx +++ b/src/Common/Layout/Header/header.tsx @@ -3,7 +3,6 @@ import axios from "axios"; import { useEffect, useState } from "react"; import "./headers.scss"; import { LogoutForm } from "@/Apis/register"; -import SearchPage from "@/Components/Views/SearchPage/SearchPage"; interface User { displayName: string; // 사용자 표시 이름 @@ -16,8 +15,6 @@ function Header() { // const dispatch = useDispatch(); const defaultProfileImgUrl = "/public/images/default-profile.jpg"; const [user, setUser] = useState({ displayName: "", profileImg: "" }); - const [search, setSearch] = useState([] as Products); - const [input, setInput] = useState(""); const [keyword, setKeyWord] = useState(""); const navigate = useNavigate(); @@ -62,7 +59,7 @@ function Header() { } ); const userData = response.data; - + // 사용자 정보를 업데이트하기 전에 profileImg가 존재하지 않을 경우에만 기본 프로필 이미지 URL을 사용 setUser((prevUser) => ({ ...prevUser, @@ -74,15 +71,17 @@ function Header() { // 오류 처리 } }; - + authenticate(); }, []); - - const OnKeyPress = (e: any) => { - if (keyword === "") { - alert("검색어를 입력해주세요"); - } else if (e.key === "Enter") { - onSubmit(); // Enter 입력이 되면 클릭 이벤트 실행 + + const HandleKeyPress = (e: any) => { + if (e.key === "Enter") { + if (keyword === "") { + alert("검색어를 입력해주세요"); + } else { + onSubmit(); // Enter 입력이 되면 클릭 이벤트 실행 + } } }; @@ -96,25 +95,18 @@ function Header() {
    { setKeyWord(e.target.value); }} - onKeyPress={OnKeyPress} + onKeyPress={HandleKeyPress} /> - {/* */} searchicon { if (keyword === "") { - alert("검색어를 입력해주세요"); + alert("검색어를 입력해주세요!"); } else { onSubmit(); } @@ -135,11 +127,9 @@ function Header() { 로그아웃
    - -
    -
    + +
+
) : ( <> diff --git a/src/Components/Views/SearchPage/SearchPage.tsx b/src/Components/Views/SearchPage/SearchPage.tsx index b6f7f31f..cc2d2f71 100644 --- a/src/Components/Views/SearchPage/SearchPage.tsx +++ b/src/Components/Views/SearchPage/SearchPage.tsx @@ -1,8 +1,9 @@ import { useState, useEffect } from "react"; import "./SearchPage.scss"; import axios from "axios"; -import { useParams } from "react-router-dom"; +import { Link, useParams, useNavigate } from "react-router-dom"; const { VITE_CLIENT_ID } = import.meta.env; +import { getDetail } from "@/Apis/productApi"; const ajax = axios.create({ baseURL: "/cafe24", @@ -14,11 +15,24 @@ const ajax = axios.create({ }); export default function SearchPage() { - // const [input, setInput] = useState(""); + interface DetailInfo { + detail_image: string; + product_name: string; + retail_price: number; + simple_description: string; + summary_description: string; + product_no: string; + price: number; + price_excluding_tax: string; + selling: string; + description: string; + } + const [search, setSearch] = useState([] as Products); const [offset, setOffset] = useState(0); const [count, setCount] = useState(0); const params = useParams(); + const navigate = useNavigate(); async function SearchAPI(product_name: string) { try { @@ -33,14 +47,51 @@ export default function SearchPage() { console.log(err); } } - // useEffect(() => { - // window.scrollTo(0, 0); - // searchUpload(); - // }, [offset]); - // const searchInputChange = (e: any) => { - // setInput(e.target.value); - // }; + const [detail, setDetail] = useState({} as DetailInfo); + + const { productNo } = useParams(); + async function getDetails() { + try { + const data = await getDetail(productNo as string); + setDetail(data.product); + } catch (err) { + console.log(err); + } + } + + const BuyBook = (detail: any, type: string) => { + let Cart = localStorage.getItem("cart"); + + if (Cart === null) { + Cart = []; + } else { + Cart = JSON.parse(Cart); + } + + if (Cart.some((item) => item.product_no === detail.product_no)) { + alert("이미 장바구니에 담으셨습니다."); + return false; + } + + if (type === "rent") { + detail.rentdate = 7; + } + detail.gubun = type; + Cart.push(detail); + Cart = new Set(Cart); + Cart = [...Cart]; + localStorage.setItem("cart", JSON.stringify(Cart)); + alert("장바구니에 담겼습니다."); + navigate("/cart"); + }; + + useEffect(() => { + window.scrollTo(0, 0); + (async () => { + await getDetails(); + })(); + }, []); useEffect(() => { (async () => { @@ -65,12 +116,17 @@ export default function SearchPage() { return ( <>
-
- 책표지 -
+ +
+ 책표지 +
+
-

{v.product_name}

+ +

{v.product_name}

+ +

{v.summary_description}

{v.product_tag}

@@ -81,8 +137,12 @@ export default function SearchPage() {
- - + +
From b13ba9a833e9ff925fbbea5af591fa105ec61935 Mon Sep 17 00:00:00 2001 From: saeyeon Date: Thu, 29 Jun 2023 13:02:10 +0900 Subject: [PATCH 58/75] fix:search press enter --- src/Apis/register.tsx | 38 ++++-- src/Common/Layout/Header/header.tsx | 7 +- .../Views/SearchPage/SearchPage.tsx | 111 ++++-------------- 3 files changed, 56 insertions(+), 100 deletions(-) diff --git a/src/Apis/register.tsx b/src/Apis/register.tsx index 90470cba..60f1b8cb 100644 --- a/src/Apis/register.tsx +++ b/src/Apis/register.tsx @@ -1,31 +1,45 @@ -import axios from 'axios'; +import axios from "axios"; const headers = { - 'Content-Type': 'application/json', - 'apikey': 'KDT5_nREmPe9B', - 'username': 'KDT5_TeamWink', + "Content-Type": "application/json", + apikey: "KDT5_nREmPe9B", + username: "KDT5_TeamWink", }; const axiosInstance = axios.create({ - baseURL: 'https://asia-northeast3-heropy-api.cloudfunctions.net/api/auth', + baseURL: "https://asia-northeast3-heropy-api.cloudfunctions.net/api/auth", headers, }); -export const JoinForm = async (email: string, displayName: string, password: string) => { - const URL = '/signup'; - const res = await axiosInstance.post(URL, { email, displayName, password }); +export const JoinForm = async ( + email: string, + displayName: string, + password: string, + profileImg: string +) => { + const URL = "/signup"; + const res = await axiosInstance.post(URL, { + email, + displayName, + password, + profileImg, + }); return res.data; }; export const LoginForm = async (email: string, password: string) => { - const LOGINURL = '/login'; + const LOGINURL = "/login"; const res = await axiosInstance.post(LOGINURL, { email, password }); return res.data; }; export const LogoutForm = async () => { - const LOGOUTURL = '/logout'; - const token = localStorage.getItem('token') as string; - const res = await axiosInstance.post(LOGOUTURL, {}, { headers: { ...headers, 'Authorization': `Bearer ${token}` } }); + const LOGOUTURL = "/logout"; + const token = localStorage.getItem("token") as string; + const res = await axiosInstance.post( + LOGOUTURL, + {}, + { headers: { ...headers, Authorization: `Bearer ${token}` } } + ); return res.data; }; diff --git a/src/Common/Layout/Header/header.tsx b/src/Common/Layout/Header/header.tsx index 71cf070e..2e22b86e 100644 --- a/src/Common/Layout/Header/header.tsx +++ b/src/Common/Layout/Header/header.tsx @@ -71,9 +71,10 @@ function Header() { // 오류 처리 } }; - - authenticate(); - }, []); + if (token) { + authenticate(); + } + }, [token]); const HandleKeyPress = (e: any) => { if (e.key === "Enter") { diff --git a/src/Components/Views/SearchPage/SearchPage.tsx b/src/Components/Views/SearchPage/SearchPage.tsx index cc2d2f71..d83740b0 100644 --- a/src/Components/Views/SearchPage/SearchPage.tsx +++ b/src/Components/Views/SearchPage/SearchPage.tsx @@ -1,9 +1,8 @@ import { useState, useEffect } from "react"; import "./SearchPage.scss"; import axios from "axios"; -import { Link, useParams, useNavigate } from "react-router-dom"; +import { Link, useParams } from "react-router-dom"; const { VITE_CLIENT_ID } = import.meta.env; -import { getDetail } from "@/Apis/productApi"; const ajax = axios.create({ baseURL: "/cafe24", @@ -15,24 +14,10 @@ const ajax = axios.create({ }); export default function SearchPage() { - interface DetailInfo { - detail_image: string; - product_name: string; - retail_price: number; - simple_description: string; - summary_description: string; - product_no: string; - price: number; - price_excluding_tax: string; - selling: string; - description: string; - } - const [search, setSearch] = useState([] as Products); const [offset, setOffset] = useState(0); const [count, setCount] = useState(0); const params = useParams(); - const navigate = useNavigate(); async function SearchAPI(product_name: string) { try { @@ -48,51 +33,6 @@ export default function SearchPage() { } } - const [detail, setDetail] = useState({} as DetailInfo); - - const { productNo } = useParams(); - async function getDetails() { - try { - const data = await getDetail(productNo as string); - setDetail(data.product); - } catch (err) { - console.log(err); - } - } - - const BuyBook = (detail: any, type: string) => { - let Cart = localStorage.getItem("cart"); - - if (Cart === null) { - Cart = []; - } else { - Cart = JSON.parse(Cart); - } - - if (Cart.some((item) => item.product_no === detail.product_no)) { - alert("이미 장바구니에 담으셨습니다."); - return false; - } - - if (type === "rent") { - detail.rentdate = 7; - } - detail.gubun = type; - Cart.push(detail); - Cart = new Set(Cart); - Cart = [...Cart]; - localStorage.setItem("cart", JSON.stringify(Cart)); - alert("장바구니에 담겼습니다."); - navigate("/cart"); - }; - - useEffect(() => { - window.scrollTo(0, 0); - (async () => { - await getDetails(); - })(); - }, []); - useEffect(() => { (async () => { await ajax @@ -108,6 +48,7 @@ export default function SearchPage() { window.scrollTo(0, 0); })(); }, [params, offset]); + console.log("search:", search); return (
@@ -115,36 +56,36 @@ export default function SearchPage() { search.map((v) => { return ( <> -
- -
- 책표지 -
- - -
+ {search?.length === 0 ? ( +

검색결과가 0개입니다.

+ ) : ( +
-

{v.product_name}

+
+ 책표지 +
-
-

{v.summary_description}

-

{v.product_tag}

+
+ +

{v.product_name}

+ + +
+

{v.summary_description}

+

{v.product_tag}

+
+
+

{v.price.slice(0, -3)}원

+

{v.retail_price.slice(0, -3)}원

+
-
-

{v.price.slice(0, -3)}원

-

{v.retail_price.slice(0, -3)}원

+
+ +
-
- - -
-
+ )} ); })} From 4509c47ff27a977a4e45f6d2b654066924f40aa7 Mon Sep 17 00:00:00 2001 From: hahahaday12 Date: Thu, 29 Jun 2023 13:03:31 +0900 Subject: [PATCH 59/75] =?UTF-8?q?feat:=20=EA=B8=B0=EB=8A=A5=EC=B6=94?= =?UTF-8?q?=EA=B0=80,=20=EB=B3=80=EA=B2=BD=EC=82=AC=ED=95=AD=20=EC=A0=80?= =?UTF-8?q?=EC=9E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 78 ++++++++++ package.json | 1 + src/Apis/productApi.ts | 2 + src/Apis/register.tsx | 4 +- src/App.scss | 7 - src/Common/Form/Login/login.tsx | 2 + src/Common/Form/Signin/join.scss | 31 +++- src/Common/Form/Signin/join.tsx | 37 ++++- src/Common/Layout/Footer/footer.scss | 6 +- src/Common/Layout/Header/header.tsx | 139 +++++++++++++----- src/Common/Layout/Header/headers.scss | 63 ++++++++ .../Views/CartPage/CartItems/CartItems.scss | 6 +- .../Views/CartPage/CartItems/CartItems.tsx | 38 +++-- src/Components/Views/CartPage/CartPage.scss | 13 +- src/Components/Views/CartPage/CartPage.tsx | 105 +++++++------ .../Views/CartPage/CartRent/CartRent.scss | 6 +- .../Views/CartPage/CartRent/CartRent.tsx | 40 +++-- .../Views/CartPage/Payment/Payment.tsx | 41 ++++-- .../Views/DetailPage/DetailPage.scss | 6 +- .../Views/DetailPage/DetailPage.tsx | 27 ++-- .../Views/MainPage/Component/Recommand.tsx | 2 +- src/Components/Views/MyPage/MyPage.tsx | 35 +++-- .../Views/SearchPage/SearchPage.scss | 11 +- .../Views/SearchPage/SearchPage.tsx | 66 +++++++-- src/routes/route.scss | 5 + src/routes/routes.tsx | 4 +- 26 files changed, 561 insertions(+), 214 deletions(-) create mode 100644 src/routes/route.scss diff --git a/package-lock.json b/package-lock.json index 7a6325eb..d0186ad0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27,6 +27,7 @@ "redux-promise": "^0.6.0", "redux-thunk": "^2.4.2", "sass": "^1.62.1", + "use-history": "^1.4.1", "vite-plugin-mkcert": "^1.15.0", "vite-plugin-sass-dts": "^1.3.5" }, @@ -3442,6 +3443,14 @@ "react-dom": ">=16.6.0" } }, + "node_modules/reactn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/reactn/-/reactn-1.0.0.tgz", + "integrity": "sha512-6i0KHxHZsIz3XNOHZe9LErrYMXMrADfAGzgNS3+Hd+BFTocJJb4f8myIZOvXCkrDGW0ALpqPnLjrFFwBUdmimA==", + "dependencies": { + "use-force-update": "^1.0.0" + } + }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -3840,6 +3849,40 @@ "punycode": "^2.1.0" } }, + "node_modules/use-force-update": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/use-force-update/-/use-force-update-1.0.11.tgz", + "integrity": "sha512-h4SICYgTJHon8w9dFIqdqR1Vrzdgl4YaRfRwhmAh01kBGljzTICanyfaFU8C4etuEfRdYpE+04XX2ZrEhOWKXQ==", + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/CharlesStover" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/use-history": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/use-history/-/use-history-1.4.1.tgz", + "integrity": "sha512-uY12M/GI4c2AW/YR/1SLrveP407kLJnsvH42787QeT5PvVB5/TI1SJrPmTreC2dPMjeEywSAeqsXTqRMHl7F9Q==", + "dependencies": { + "react": "^16.8.6", + "reactn": "^1.0.0" + } + }, + "node_modules/use-history/node_modules/react": { + "version": "16.14.0", + "resolved": "https://registry.npmjs.org/react/-/react-16.14.0.tgz", + "integrity": "sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/use-sync-external-store": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", @@ -6223,6 +6266,14 @@ "prop-types": "^15.6.2" } }, + "reactn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/reactn/-/reactn-1.0.0.tgz", + "integrity": "sha512-6i0KHxHZsIz3XNOHZe9LErrYMXMrADfAGzgNS3+Hd+BFTocJJb4f8myIZOvXCkrDGW0ALpqPnLjrFFwBUdmimA==", + "requires": { + "use-force-update": "^1.0.0" + } + }, "readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -6499,6 +6550,33 @@ "punycode": "^2.1.0" } }, + "use-force-update": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/use-force-update/-/use-force-update-1.0.11.tgz", + "integrity": "sha512-h4SICYgTJHon8w9dFIqdqR1Vrzdgl4YaRfRwhmAh01kBGljzTICanyfaFU8C4etuEfRdYpE+04XX2ZrEhOWKXQ==", + "requires": {} + }, + "use-history": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/use-history/-/use-history-1.4.1.tgz", + "integrity": "sha512-uY12M/GI4c2AW/YR/1SLrveP407kLJnsvH42787QeT5PvVB5/TI1SJrPmTreC2dPMjeEywSAeqsXTqRMHl7F9Q==", + "requires": { + "react": "^16.8.6", + "reactn": "^1.0.0" + }, + "dependencies": { + "react": { + "version": "16.14.0", + "resolved": "https://registry.npmjs.org/react/-/react-16.14.0.tgz", + "integrity": "sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2" + } + } + } + }, "use-sync-external-store": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", diff --git a/package.json b/package.json index 8a71f68e..fe7fb0ba 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,7 @@ "redux-promise": "^0.6.0", "redux-thunk": "^2.4.2", "sass": "^1.62.1", + "use-history": "^1.4.1", "vite-plugin-mkcert": "^1.15.0", "vite-plugin-sass-dts": "^1.3.5" }, diff --git a/src/Apis/productApi.ts b/src/Apis/productApi.ts index 68685482..a44968d2 100644 --- a/src/Apis/productApi.ts +++ b/src/Apis/productApi.ts @@ -14,6 +14,7 @@ const ajax = axios.create({ interface GetList { category?: number; product_no?: string; + limit?: number; } export async function getList(info: GetList) { try { @@ -23,6 +24,7 @@ export async function getList(info: GetList) { selling: 'T', category: info.category, product_no: info.product_no, + limit: info.limit }, }); //console.log(data.products); diff --git a/src/Apis/register.tsx b/src/Apis/register.tsx index 90470cba..aa38daed 100644 --- a/src/Apis/register.tsx +++ b/src/Apis/register.tsx @@ -11,9 +11,9 @@ const axiosInstance = axios.create({ headers, }); -export const JoinForm = async (email: string, displayName: string, password: string) => { +export const JoinForm = async (email: string, displayName: string, password: string, profileImgBase64:string) => { const URL = '/signup'; - const res = await axiosInstance.post(URL, { email, displayName, password }); + const res = await axiosInstance.post(URL, { email, displayName, password, profileImgBase64 }); return res.data; }; diff --git a/src/App.scss b/src/App.scss index 1dfde087..9af29d03 100644 --- a/src/App.scss +++ b/src/App.scss @@ -16,13 +16,6 @@ a { text-decoration: none; } -// @font-face { -// font-family: 'Dovemayo_gothic'; -// src: url('https://cdn.jsdelivr.net/gh/projectnoonnu/noonfonts_2302@1.1/Dovemayo_gothic.woff2') format('woff2'); -// font-weight: normal; -// font-style: normal; -// } - @font-face { font-family: 'SUITE-Regular'; src: url('https://cdn.jsdelivr.net/gh/projectnoonnu/noonfonts_2304-2@1.0/SUITE-Regular.woff2') diff --git a/src/Common/Form/Login/login.tsx b/src/Common/Form/Login/login.tsx index f607ccf0..1486bf55 100644 --- a/src/Common/Form/Login/login.tsx +++ b/src/Common/Form/Login/login.tsx @@ -7,6 +7,7 @@ function Login() { const navigate = useNavigate(); const [email, setEmail] = useState(""); const [password, setPassword] = useState(""); + const onChangeEmail = (e: ChangeEvent) => { setEmail(e.target.value); @@ -36,6 +37,7 @@ function Login() { if (data.accessToken) { alert("로그인 되었습니다!"); window.localStorage.setItem("token", data.accessToken); + //window.location.reload(); navigate("/"); } else { alert("로그인에 실패하였습니다. 다시 시도해주세요."); diff --git a/src/Common/Form/Signin/join.scss b/src/Common/Form/Signin/join.scss index c62817bf..6ae011f2 100644 --- a/src/Common/Form/Signin/join.scss +++ b/src/Common/Form/Signin/join.scss @@ -11,11 +11,11 @@ @mixin FormContainerStyle { width: 500px; - height: 700px; + height: 730px; position: relative; // border: solid 1px #c6c6c6; border-radius: 10px; - top: 50px; + top: 30px; margin: auto; background-color: white; box-shadow: 10px 10px 26px gray, -12px -12px 36px white; @@ -45,7 +45,6 @@ p { margin: auto; font-size: 30px; - //background-color: aliceblue; } } @@ -55,13 +54,11 @@ position: relative; top: 130px; margin: 0 auto; - //background-color: chartreuse; .formBox-inner { width: 300px; height: 95px; margin: 0 auto; - //background-color: red; input { width:100%; @@ -76,7 +73,6 @@ span { width: 260px; - // background-color: oldlace; position: relative; margin: 0 auto; top:10px; @@ -90,7 +86,7 @@ width: 210px; height: 50px; position: absolute; - bottom: 5px; + bottom: -100px; left: 0; right: 0; margin: 0 auto; @@ -101,10 +97,29 @@ height: 50px; color: black; background-color: #F7E9D7; - // border: solid 1px #dfdfdf; border-radius: 10px; cursor: pointer; } } + + .uploadFilebox{ + width: 200px; + padding-bottom: 20px; + position: relative; + margin: 0 auto; + + .uploadFilebox-inner{ + width: 200px; + padding-bottom: 10px; + + span { + margin-left: 20px; + } + + input { + margin-top: 20px; + } + } + } } } diff --git a/src/Common/Form/Signin/join.tsx b/src/Common/Form/Signin/join.tsx index 787905d7..4eb1908b 100644 --- a/src/Common/Form/Signin/join.tsx +++ b/src/Common/Form/Signin/join.tsx @@ -1,4 +1,4 @@ -import { FormEvent, useState, useCallback } from "react"; +import { FormEvent, useState, useCallback, useRef } from "react"; import { useNavigate } from "react-router-dom"; import { PwCheck, emailCheck } from "../Validation "; import { JoinForm } from "@/Apis/register"; @@ -12,6 +12,8 @@ function Join() { const [displayName, setdDisplayName] = useState(""); const [password, setUserPassword] = useState(""); const [confirmPassword, setConfirmPassword] = useState(""); + const [profileImgBase64, setProfileImgBase64] = useState(""); + const imgRef = useRef(); //비밀번호 유효성 검사 const [isName, setIsName] = useState(false); @@ -96,6 +98,22 @@ function Join() { [password] ); + const UploadImage = (event: React.ChangeEvent) => { + const file = (event.target as HTMLInputElement).files?.[0]; + if (!file) { + return; + } + const reader = new FileReader(); + + reader.onloadend = () => { + const base64Data = reader.result as string; + setProfileImgBase64(base64Data); + }; + + if (file) { + reader.readAsDataURL(file); + } + } async function signUp(event: FormEvent) { @@ -116,7 +134,8 @@ function Join() { try { - const res = await JoinForm(email, displayName, password ); + const res = await JoinForm(email, displayName, password,profileImgBase64 ); + if (res.accessToken) { alert("가입되었습니다."); navigate("/login"); @@ -201,6 +220,20 @@ function Join() { )}
+
+
+ 프로필 이미지 고르기🍒 + +
+
+
*/} searchicon { - if (keyword === "") { - alert("검색어를 입력해주세요"); - } else { - onSubmit(); - } - }} + onClick={handleInputButtonClick} /> + + {showInputButton && keyword &&( +
+
+ {keyword && + filteredItems.map((v: Product) => { + if (v.product_name.trim() !== "") { + return ( + +
+ searchbookimage +
+ +
+ {v.product_name} + {v.price.slice(0, -3)}원 +
+ + ); + } else { + return null; + } + })} +
+ )} +
+ + +
@@ -152,8 +213,12 @@ function Header() { )}
+ + + + ); } -export default Header; +export default Header; \ No newline at end of file diff --git a/src/Common/Layout/Header/headers.scss b/src/Common/Layout/Header/headers.scss index e3ab06a0..423beff5 100644 --- a/src/Common/Layout/Header/headers.scss +++ b/src/Common/Layout/Header/headers.scss @@ -114,4 +114,67 @@ } } } + + .Input-Buttom{ + width: 400px; + padding-bottom: 80px; + background-color: #ffff; + position: absolute; + margin-top: 45px; + max-height: 200px; + overflow-y: auto; + display: flex; + border: 1px solid black; + + .Input-Buttom__inner { + width: 380px; + margin: 0 auto; + padding-bottom: 100px; + margin-top: 10px; + //background-color: orange; + + .Input-Buttom__innerBox{ + width: 340px; + height: 160px; + //background-color: red; + margin: 0 auto; + cursor: pointer; + margin-top: 12px; + border-bottom: 1px solid black; + + .Input-Buttom__ImageBox{ + width: 100px; + padding-bottom: 150px; + margin-left: 20px; + position: relative; + background-color: saddlebrown; + + img{ + width: 100px; + height: auto; + } + } + + .Input-Buttom__title{ + width: 210px; + padding-bottom: 15px; + //background-color: yellowgreen; + position: relative; + left: 140px; + bottom: 100px; + display: flex; + } + span:nth-child(1){ + width: 150px; + } + + span:nth-child(2){ + position: relative; + width: 100px; + top: 13px; + margin-left: 15px; + } + } + } + } } diff --git a/src/Components/Views/CartPage/CartItems/CartItems.scss b/src/Components/Views/CartPage/CartItems/CartItems.scss index 3406486e..c4e02c46 100644 --- a/src/Components/Views/CartPage/CartItems/CartItems.scss +++ b/src/Components/Views/CartPage/CartItems/CartItems.scss @@ -74,8 +74,8 @@ // height: 100px; position: relative; bottom: 10px; - margin-left: 140px; - // background-color: rebeccapurple; + margin-left: 160px; + background-color: rebeccapurple; img{ //position: absolute; @@ -90,7 +90,7 @@ padding-bottom: 30px; position: absolute; top: 50px; - left: 260px; + left: 200px; text-align: center; span:nth-child(1) { diff --git a/src/Components/Views/CartPage/CartItems/CartItems.tsx b/src/Components/Views/CartPage/CartItems/CartItems.tsx index 32b5f4bd..e092108d 100644 --- a/src/Components/Views/CartPage/CartItems/CartItems.tsx +++ b/src/Components/Views/CartPage/CartItems/CartItems.tsx @@ -3,52 +3,58 @@ import { useState } from "react"; import Box from "@mui/material/Box"; import Checkbox from "@mui/material/Checkbox"; import FormControlLabel from "@mui/material/FormControlLabel"; -//import RemoveItemButton from "../Components/DeletButton"; import "./CartItems.scss"; interface BuyItem { id: number; + gubun: string; product_name: string; price: number; detail_image: string; product_no: number; + buyItem:number; } interface CartItem { product_no: number; - // Add other properties here + setItems:any; } interface CartItemsProps { check: number[]; - pitem: string; - setItems: React.Dispatch>; - delete: (index: number, key: any) => void; + //pitem: string; + //setItems:React.Dispatch>; + delete: (key: any) => void; datalist: any; - setdata: React.Dispatch>; + //setdata: React.Dispatch>; checkOne: any; checkTwo: any; } const CartItems = ({ check, - pitem, - setItems, delete: RemoveBuyItem, datalist, - setdata, + //setItems, checkOne, checkTwo, }: CartItemsProps) => { const [buyItem, setbuyItem] = useState([]); const [checkedItems, setCheckedItems] = useState(check); - + const [allCheck, setallCheck] = useState(false); + useEffect(() => { setbuyItem(datalist); }, [datalist]); const handleChange1 = (event: React.ChangeEvent) => { - setCheckedItems(checkOne(event, buyItem, "buy")); + if(event.target.checked){ + setCheckedItems(checkOne(event, buyItem, "buy")); + setallCheck(true); + }else{ + setCheckedItems(checkOne(event, buyItem, "buy")); + setallCheck(false); + } }; const handleChange2 = @@ -71,7 +77,7 @@ const CartItems = ({ } /> @@ -86,8 +92,8 @@ const CartItems = ({ control={
0 && checkedItems.length < buyItem.length @@ -130,7 +136,7 @@ const CartItems = ({
@@ -141,4 +147,4 @@ const CartItems = ({ ); }; -export default CartItems; +export default CartItems; \ No newline at end of file diff --git a/src/Components/Views/CartPage/CartPage.scss b/src/Components/Views/CartPage/CartPage.scss index 6d600c61..44fae3c1 100644 --- a/src/Components/Views/CartPage/CartPage.scss +++ b/src/Components/Views/CartPage/CartPage.scss @@ -97,7 +97,7 @@ .NowBuy { width: 500px; position: absolute; - height: 100px; + height: 120px; left: 100px; border-bottom: 2px solid black; @@ -105,18 +105,19 @@ width: 250px; position: absolute; padding-bottom: 10px; - // background-color: gold; + background-color: gold; margin: 0 auto; - left: 0; + left: 150px; right: 0; - top: 30px; + top: 50px; .Pay-Container { width: inherit; - height: 30px; - //background-color: rosybrown; + //height: 30px; + background-color: rosybrown; display: flex; gap: 40px; + font-size: 20px; } } } diff --git a/src/Components/Views/CartPage/CartPage.tsx b/src/Components/Views/CartPage/CartPage.tsx index e5a20ad7..3c81eab0 100644 --- a/src/Components/Views/CartPage/CartPage.tsx +++ b/src/Components/Views/CartPage/CartPage.tsx @@ -7,47 +7,58 @@ import Payment from "./Payment/Payment"; interface BuyItem { id: number; product_name: string; - price: number; + price:string; detail_image: string; product_no: number; } function CartPage() { const [CartItemsValue, setCartItemsValue] = useState([]); - const [selectedItem, setSelectedItem] = useState([]); - const [selectedItemRent, setSelectedItemRent] = useState([]); + const [selectedItem, setSelectedItem] = useState([]); const [Total, setTotal] = useState(0); const [ShowTotal, setShowTotal] = useState(false); const [buyItem, setbuyItem] = useState([]); useEffect(() => { - const BuyItems = JSON.parse(localStorage.getItem("cart")) || []; - setbuyItem(BuyItems); + const cartData = localStorage.getItem("cart"); + const buyItems = cartData ? JSON.parse(cartData) : []; + setbuyItem(buyItems); }, []); useEffect(() => { calculateTotal(); }, [selectedItem]); + // const checkOne = (event: React.ChangeEvent, buyItem: any[], gubun: string) => { + // const checkedValue = event.target.checked; + // const filteredItems = buyItem.filter((item) => item.gubun === gubun); + // const updatedSelectedItems = checkedValue ? [...filteredItems] : []; + // const unchekedSelectedItems = [...filteredItems]; + // const combinedItems = new Set([...selectedItem, ...updatedSelectedItems]); + // const checkitem = checkedValue ? Array.from(combinedItems): selectedItem.filter(item => !unchekedSelectedItems.some(updatedItem => updatedItem.product_no === item.product_no)); + // setSelectedItem(checkitem); + // const updatedCheckedItems = updatedSelectedItems.map((item, index) => index); + // return updatedCheckedItems; + // }; + const checkOne = (event: React.ChangeEvent, buyItem: any[], gubun: string) => { const checkedValue = event.target.checked; - // Filter buyItem based on the condition (item.gubun === gubun) const filteredItems = buyItem.filter((item) => item.gubun === gubun); - // Update selected items based on checkedValue - const updatedSelectedItems = checkedValue ? [...filteredItems] : []; - // Update selectedItem state - if(gubun === "rent"){ - setSelectedItemRent(updatedSelectedItems); - }else{ - setSelectedItem(updatedSelectedItems); + + if(checkedValue) { + const combinedItems = new Set([...selectedItem, ...filteredItems]); + setSelectedItem(Array.from(combinedItems)); + } else { + const remainingItems = selectedItem.filter(item => !filteredItems.some(filteredItem => filteredItem.product_no === item.product_no)); + setSelectedItem(remainingItems); } - // Return an array of indices for the updated selected items - const updatedCheckedItems = updatedSelectedItems.map((item, index) => index); + // Reset filteredItems indices if unchecked + const updatedCheckedItems = checkedValue ? filteredItems.map((_, index) => index) : []; + return updatedCheckedItems; }; - - const checkTwo = (event: React.ChangeEvent, checkedItems:any, el:any) => { + const checkTwo = (event: React.ChangeEvent, checkedItems:number[], el:any) => { const itemId = parseInt(event.target.name); let updatedCheckedItems: number[] = []; let updatedItems: any[] = []; @@ -56,51 +67,49 @@ function CartPage() { updatedItems = [...selectedItem, el]; } else { updatedCheckedItems = checkedItems.filter((id) => id !== itemId); - updatedItems = selectedItem.filter((key) => key.product_no !== el.product_no); + updatedItems = selectedItem.filter((item) => item.product_no !== el.product_no); } setSelectedItem(updatedItems); return updatedCheckedItems; }; const calculateTotal = () => { + setTotal(0); + console.log(selectedItem); let total = 0; if (Array.isArray(selectedItem)) { selectedItem.forEach((item) => { - console.log(item); const itemPrice = parseFloat(item.price); - console.log(itemPrice); if (!isNaN(itemPrice)) { - console.log(itemPrice); total += itemPrice; } }); + }else{ + total = 0; } setTotal(total); setShowTotal(true); }; - - const RemoveBuyItem = (index: number, key: any, buyItem:any) => { + const RemoveBuyItem = (key: any) => { console.log(key); const confirmation = window.confirm("삭제하시겠습니까?"); if (confirmation) { - const updatedCartData = JSON.parse(localStorage.getItem("cart")); - localStorage.setItem( - "cart", - JSON.stringify( - updatedCartData.filter((item) => item.product_no !== key) - ) - ); + // const updatedCartData = JSON.parse(localStorage.getItem("cart")); + // const datalist = JSON.stringify( + // updatedCartData.filter((item) => item.product_no !== key) + // ) + const cartDataString = localStorage.getItem("cart"); - console.log(updatedCartData); - const updatedBuyItem = [...updatedCartData]; - //선택한 index 1개를 buyItem 배열에서 제거. - updatedBuyItem.splice(index, 1); - // 제거한후의 값 setState 갑에 담아줌. - setbuyItem(updatedBuyItem); - // cart 키 값으로 로컬에서 데이터 찾아옴 - console.log(buyItem); - alert("삭제되었습니다."); + if (cartDataString !== null) { + const updatedCartData: BuyItem[] = JSON.parse(cartDataString); + const datalist = JSON.stringify( updatedCartData.filter((item) => item.product_no !== key)) + localStorage.setItem("cart",datalist); + setbuyItem(JSON.parse(datalist)); + alert("삭제되었습니다."); + } else { + console.log("cart data not found"); + } } else { alert("취소되었습니다."); } @@ -114,11 +123,10 @@ function CartPage() {
@@ -127,11 +135,10 @@ function CartPage() {
@@ -143,20 +150,20 @@ function CartPage() {
총 상품 가격 - {ShowTotal &&

Total Amount: ${Total}

} + {ShowTotal &&

${Total}원

}
총 결제 예상 금액 - 28,000 원 + ${Total}
{/* */} - +
@@ -166,4 +173,4 @@ function CartPage() { ); } -export default CartPage; +export default CartPage; \ No newline at end of file diff --git a/src/Components/Views/CartPage/CartRent/CartRent.scss b/src/Components/Views/CartPage/CartRent/CartRent.scss index 58c582cd..8863a534 100644 --- a/src/Components/Views/CartPage/CartRent/CartRent.scss +++ b/src/Components/Views/CartPage/CartRent/CartRent.scss @@ -26,17 +26,17 @@ .Rental-Namebox{ @include CartNameStyle; - left: 140px; + left: 160px; } .Renatal-Price{ @include CartNameStyle; - left: 420px; + left: 400px; } .RentDay{ @include CartNameStyle; - right: 440px; + right: 400px; } .DeleteDay{ diff --git a/src/Components/Views/CartPage/CartRent/CartRent.tsx b/src/Components/Views/CartPage/CartRent/CartRent.tsx index 68c3f707..9b9b5dc1 100644 --- a/src/Components/Views/CartPage/CartRent/CartRent.tsx +++ b/src/Components/Views/CartPage/CartRent/CartRent.tsx @@ -14,7 +14,6 @@ interface RentItem { gubun: string; name: string; rentdate: string; - } interface CartItem { @@ -23,20 +22,28 @@ interface CartItem { interface CartItemsProps { check: number[]; - pitem: string; - setItems: React.Dispatch>; - delete: (index: number, key: any) => void; + //pitem: string; + //setItems: React.Dispatch>; + delete: (key: number) => void; datalist : any - setdata : React.Dispatch>; + //setdata : React.Dispatch>; checkOne : any; checkTwo : any; } - const RentalItems = ({ check,delete: RemoveBuyItem, datalist, checkOne, checkTwo }: CartItemsProps) => { + const RentalItems = ({ + check, + delete: RemoveBuyItem, + datalist, + checkOne, + checkTwo, + //setItems + }: CartItemsProps) => { const [buyItem, setbuyItem] = useState([]); const [checkedItems, setCheckedItems] = useState(check); - + const [allCheck, setallCheck] = useState(false); + useEffect(() => { setbuyItem(datalist) }, [datalist]); @@ -54,7 +61,16 @@ interface CartItem { const handleChange1 = (event: React.ChangeEvent) => { - setCheckedItems(checkOne(event, buyItem,'rent')); + if(event.target.checked){ + setCheckedItems(checkOne(event, buyItem, "rent")); + setallCheck(true); + }else{ + setCheckedItems(checkOne(event, buyItem, "rent")); + // console.log('g'); + // setCheckedItems([]); + // setItems([]); + setallCheck(false); + } }; const handleChange2 = @@ -77,7 +93,7 @@ interface CartItem {
} @@ -93,8 +109,8 @@ interface CartItem { control={
0 && checkedItems.length < buyItem.length} onChange={handleChange1} /> @@ -141,7 +157,7 @@ interface CartItem { {el.rentdate}일
-
diff --git a/src/Components/Views/CartPage/Payment/Payment.tsx b/src/Components/Views/CartPage/Payment/Payment.tsx index 433393ce..1c16e24d 100644 --- a/src/Components/Views/CartPage/Payment/Payment.tsx +++ b/src/Components/Views/CartPage/Payment/Payment.tsx @@ -1,11 +1,22 @@ import { useEffect } from "react"; -export interface PaymentInfo { +interface PaymentInfo { amount: number; productlists: any; + setdatalist: any; } -const Payment = ({ amount, productlists }: PaymentInfo) => { +interface BuyItem { + id: number; + product_name: string; + price: string; + detail_image: string; + product_no: string; + selectedItem?: any; + setdatalist: any; +} + +const Payment = ({ amount, productlists, setdatalist }: PaymentInfo) => { const orderNumber = `mid_${new Date().getTime()}`; console.log(orderNumber); @@ -24,10 +35,11 @@ const Payment = ({ amount, productlists }: PaymentInfo) => { const onClickPayment = () => { console.log(productlists); - const itemName = productlists.map((obj) => obj.product_name).join(","); + const itemName = productlists.map((obj: { product_name: any; }) => obj.product_name).join(","); + console.log(itemName); - const { IMP }: any = window; + const IMP = (window as any).IMP; IMP.init("imp36252452"); const data = { @@ -37,37 +49,34 @@ const Payment = ({ amount, productlists }: PaymentInfo) => { amount: amount, // 결제금액 name: `${itemName}`, // 주문명 buyer_name: "", // 구매자 이름 - // buyer_tel: "01032752740", // 구매자 전화번호 - // 전화번호: 일단 빼고 나중에 추가 시도.. - buyer_email: "", // 구매자 이메일 - 작성시 구매창에서 이메일 부분에 들어가있음 + buyer_email: "", custom_data:productlists }; - IMP.request_pay(data, callback); }; + function callback(response: any) { const { success, error_msg } = response; if (success) { alert("결제 성공"); - //mypayment [] - //mypayment: [orderNumber1] - let mypayarray = window.localStorage.getItem("mypayment"); - let combinedArray = JSON.parse(mypayarray); + const mypayarray: string | null = window.localStorage.getItem("mypayment"); + const combinedArray: string[] | null = mypayarray ? JSON.parse(mypayarray) : null; if (!combinedArray) { - //mypayment: [orderNumber1] window.localStorage.setItem("mypayment", JSON.stringify([orderNumber])); } else { - ////mypayment: [orderNumber1,orderNumber2] 배열을 다시 추가. combinedArray.push(orderNumber); window.localStorage.setItem("mypayment", JSON.stringify(combinedArray)); } + const productItemlist = productlists.map((obj: { product_no: any; }) => obj.product_no).join(","); + const cartlist: BuyItem[] = JSON.parse(window.localStorage.getItem("cart") || "[]"); - - //결제 성공을 하고 성공된 데이터가 로컬스토리지에서 지워져야함. produc_id + const updatedArray = cartlist.filter((item) => !productItemlist.includes(item.product_no)); + window.localStorage.setItem("cart", JSON.stringify(updatedArray)); + setdatalist(updatedArray); } else { alert(`결제 실패: ${error_msg}`); } diff --git a/src/Components/Views/DetailPage/DetailPage.scss b/src/Components/Views/DetailPage/DetailPage.scss index 9319fe84..fd05c80b 100644 --- a/src/Components/Views/DetailPage/DetailPage.scss +++ b/src/Components/Views/DetailPage/DetailPage.scss @@ -223,6 +223,7 @@ padding-bottom: 20px; width: 800px; margin: 0 auto; + padding-bottom: 170px; font-size: 20px !important; img { @@ -232,8 +233,7 @@ a { font-family: "SUITE-Regular" !important; - //background-color: #f8ede3 !important; - //border-radius: 10px; + background-color: #f8ede3 !important; width: 800px; margin: 0 auto !important; padding: 20px !important; @@ -257,7 +257,6 @@ .Bookple-Container { width: 800px; padding-bottom: 10px; - //background-color: aliceblue; margin: auto; position: relative; border-bottom: 1px solid black; @@ -265,7 +264,6 @@ .Bookple-Container__text { width: 180px; - //background-color: rgb(248, 244, 244); position: absolute; color: #0086cd; left: -250px; diff --git a/src/Components/Views/DetailPage/DetailPage.tsx b/src/Components/Views/DetailPage/DetailPage.tsx index cf05dc5f..d6a3558a 100644 --- a/src/Components/Views/DetailPage/DetailPage.tsx +++ b/src/Components/Views/DetailPage/DetailPage.tsx @@ -3,6 +3,7 @@ import { useEffect, useState } from "react"; import { useParams, useNavigate } from "react-router-dom"; import TopHeader from "./components/TopHeader"; import { getDetail } from "@/Apis/productApi"; +import { ChangeEvent } from "react"; import "./DetailPage.scss"; function DetailPage() { @@ -17,16 +18,20 @@ function DetailPage() { price_excluding_tax: string; selling: string; description: string; + rentdate: number; + gubun: string; } const navigate = useNavigate(); const [detail, setDetail] = useState({} as DetailInfo); const { productNo } = useParams(); + async function getDetails() { try { const data = await getDetail(productNo as string); setDetail(data.product); + console.log(data.product) } catch (err) { console.log(err); } @@ -62,15 +67,10 @@ function DetailPage() { })(); }, []); - const BuyBook = (detail: any, type: string) => { - let Cart = localStorage.getItem("cart"); - - if (Cart === null) { - Cart = []; - } else { - Cart = JSON.parse(Cart); - } + const BuyBook = (detail: DetailInfo, type: string) => { + let Cart: DetailInfo[] = JSON.parse(localStorage.getItem("cart") || "[]"); + if (Cart.some((item) => item.product_no === detail.product_no)) { alert("이미 장바구니에 담으셨습니다."); return false; @@ -81,7 +81,7 @@ function DetailPage() { } detail.gubun = type; Cart.push(detail); - Cart = new Set(Cart); + Cart = Array.from(new Set(Cart)); Cart = [...Cart]; localStorage.setItem("cart", JSON.stringify(Cart)); alert("장바구니에 담겼습니다."); @@ -89,8 +89,8 @@ function DetailPage() { }; // html 안에 a 링크 이벤트를 막기 위한 함수 - const disableLinkClick = (event) => { - event.preventDefault(); + const disableLinkClick = (e: React.MouseEvent) => { + e.preventDefault(); }; const modifiedDescription = detail.description @@ -121,7 +121,6 @@ function DetailPage() {
{detail.product_name} - {/* -단돈 1,000원으로 시작할수 있는 */}

윙크북 {detail.product_name} 전자책 출간일 2023-0505

@@ -161,7 +160,6 @@ function DetailPage() { className="CartAdd" onClick={() => BuyBook(detail, "buy")} > - 책 구매하기
+ > +
); diff --git a/src/Components/Views/MainPage/Component/Recommand.tsx b/src/Components/Views/MainPage/Component/Recommand.tsx index 75ab1cca..5417bfa5 100644 --- a/src/Components/Views/MainPage/Component/Recommand.tsx +++ b/src/Components/Views/MainPage/Component/Recommand.tsx @@ -22,7 +22,7 @@ export default function Recommand() { const res = await getRecommand(); console.log(res.products); setList(res.products); - const productList = res.products.map((obj) => obj.product_no).join(","); + const productList = res.products.map((obj:any) => obj.product_no).join(","); return productList; } catch (err) { console.log(err); diff --git a/src/Components/Views/MyPage/MyPage.tsx b/src/Components/Views/MyPage/MyPage.tsx index 5e38547b..cc1e3751 100644 --- a/src/Components/Views/MyPage/MyPage.tsx +++ b/src/Components/Views/MyPage/MyPage.tsx @@ -7,6 +7,7 @@ interface PaymentItem { merchant_uid: string; custom_data:string; paid_at: string; + } interface PaymentsResponse { @@ -65,12 +66,14 @@ const GetToken = async () => { const fetchData = async (): Promise => { try { const paynumber: string | null = window.localStorage.getItem('mypayment'); + if (paynumber) { const merchantUids = JSON.parse(paynumber); const accessToken = await GetToken(); const paymentsResponse: AxiosResponse = await axios.get( `/iamport/payments/status/paid?limit=20&sorting=paid&_token=${accessToken}` ); + if (paymentsResponse.data && paymentsResponse.data.response && paymentsResponse.data.response.list) { const filteredList: PaymentItem[] = paymentsResponse.data.response.list.filter((item) => merchantUids.includes(item.merchant_uid) @@ -117,6 +120,7 @@ useEffect(() => { const DeleteList = (itemnum: string) => { const MyPay = localStorage.getItem("mypayment"); + if (MyPay && MyPay.includes(itemnum)) { const updatedList = MyPay.replace(itemnum, "").trim(); localStorage.setItem("mypayment", updatedList); @@ -124,8 +128,8 @@ const DeleteList = (itemnum: string) => { fetchData(); } - const onClickDelete = async (key:string) => { + if(confirm("주문을 취소 하시겠습니까?")){ const accessToken = await GetToken(); const data = { @@ -135,7 +139,7 @@ const onClickDelete = async (key:string) => { `/iamport/payments/cancel?_token=${accessToken}`, data) .then((res) => { if(res.status == 200){ - alert("삭제되었습니다."); + alert("주문이 취소 되었습니다"); DeleteList(key); } else { console.log(res.status) @@ -165,20 +169,22 @@ const getDate = function(param:any){
+
구매 내역
-
- {Object.keys(TopCategory).map(key => { - return - {TopCategory[key]} - - })} -
+
+ {Object.keys(TopCategory).map(key => { + return + {TopCategory[key]} + + })} +
{mydataList .filter((el: PageData) => el.gubun === 'buy') .map((item: PageData, index: number) => ( +
{item.merchant_uid.replace("mid_","")} {getDate(item.paid_at)} @@ -191,10 +197,12 @@ const getDate = function(param:any){
+ ))}
-
대여 내역
+ +
대여 내역
{Object.keys(TopCategory).map(key => { @@ -207,6 +215,7 @@ const getDate = function(param:any){ {mydataList .filter((el: PageData) => el.gubun === 'rent') .map((item: PageData, index: number) => ( +
{item.merchant_uid.replace("mid_","")} {getDate(item.paid_at)} @@ -216,13 +225,15 @@ const getDate = function(param:any){
{item.price}
- +
+ ))}
-
+ +
diff --git a/src/Components/Views/SearchPage/SearchPage.scss b/src/Components/Views/SearchPage/SearchPage.scss index e124f489..b8e054e3 100644 --- a/src/Components/Views/SearchPage/SearchPage.scss +++ b/src/Components/Views/SearchPage/SearchPage.scss @@ -71,13 +71,14 @@ button { border-radius: 5px; - margin: 8px; - width: 120px; - height: 40px; + margin: 5px; + width: 80px; + height: 45px; color: #fff; border: none; - font-size: 17px; + font-size: 15px; cursor: pointer; + font-family: 'SUITE-Regular'; } // 구매버튼 button:first-child { @@ -110,3 +111,5 @@ } } } + + diff --git a/src/Components/Views/SearchPage/SearchPage.tsx b/src/Components/Views/SearchPage/SearchPage.tsx index b6f7f31f..5c6c2838 100644 --- a/src/Components/Views/SearchPage/SearchPage.tsx +++ b/src/Components/Views/SearchPage/SearchPage.tsx @@ -1,7 +1,7 @@ import { useState, useEffect } from "react"; import "./SearchPage.scss"; import axios from "axios"; -import { useParams } from "react-router-dom"; +import { useParams,useNavigate } from "react-router-dom"; const { VITE_CLIENT_ID } = import.meta.env; const ajax = axios.create({ @@ -13,8 +13,25 @@ const ajax = axios.create({ }, }); +// interface DetailInfo { +// detail_image: string; +// product_name: string; +// retail_price: number; +// simple_description: string; +// summary_description: string; +// product_no: string; +// price: number; +// price_excluding_tax: string; +// selling: string; +// description: string; +// rentdate: number; +// gubun: string; +// } + + export default function SearchPage() { - // const [input, setInput] = useState(""); + + const navigate = useNavigate(); const [search, setSearch] = useState([] as Products); const [offset, setOffset] = useState(0); const [count, setCount] = useState(0); @@ -25,22 +42,20 @@ export default function SearchPage() { const res = await ajax.get("/products", { params: { product_name: product_name, + offset: offset * 10, }, }); + + + console.log(res.data.products) return res.data.products; + } catch (err) { console.log(err); } } - // useEffect(() => { - // window.scrollTo(0, 0); - // searchUpload(); - // }, [offset]); - - // const searchInputChange = (e: any) => { - // setInput(e.target.value); - // }; + useEffect(() => { (async () => { @@ -53,11 +68,34 @@ export default function SearchPage() { .then((res) => setCount(res.data.count)); const result = await SearchAPI(params.keyword); setSearch(result); + console.log(result); window.scrollTo(0, 0); })(); }, [params, offset]); + const BuyBook = (search: string, type: string) => { + console.log(search) + let Cart = JSON.parse(localStorage.getItem("cart") || "[]"); + + if (Cart.some((item) => item.product_no === search.product_no)) { + alert("이미 장바구니에 담으셨습니다."); + return false; + } + + if (type === "rent") { + search.rentdate = 7; + } + + search.gubun = type; + Cart.push(search); + Cart = Array.from(new Set(Cart)); + Cart = [...Cart]; + localStorage.setItem("cart", JSON.stringify(Cart)); + alert("장바구니에 담겼습니다."); + navigate("/cart"); + }; + return (
{search && @@ -81,8 +119,11 @@ export default function SearchPage() {
- - + +
@@ -93,7 +134,6 @@ export default function SearchPage() { onClick={(e) => { if (e.target instanceof HTMLLIElement) { setOffset(e.target.value); - // console.log("e:", e.target.value); } }} > diff --git a/src/routes/route.scss b/src/routes/route.scss new file mode 100644 index 00000000..2fe04208 --- /dev/null +++ b/src/routes/route.scss @@ -0,0 +1,5 @@ +.ALL-layout__background{ + width: 1300px; + background-color: aliceblue; + position: relative; +} \ No newline at end of file diff --git a/src/routes/routes.tsx b/src/routes/routes.tsx index 46566a59..7dccaeca 100644 --- a/src/routes/routes.tsx +++ b/src/routes/routes.tsx @@ -9,7 +9,7 @@ import PrivatePage from "./privateRoute"; import DetailPage from "@/Components/Views/DetailPage/DetailPage"; import UserInfo from "@/Components/Views/MyPage/UserInfo"; import SearchPage from "@/Components/Views/SearchPage/SearchPage"; - +import './route.scss'; import { Routes, BrowserRouter, Route, Outlet } from "react-router-dom"; const Layout = () => { @@ -18,7 +18,7 @@ const Layout = () => {
- + ); }; From 4d5bfa38154523b2a5f11d764d627ff27758f829 Mon Sep 17 00:00:00 2001 From: hahahaday12 Date: Fri, 30 Jun 2023 23:01:59 +0900 Subject: [PATCH 60/75] =?UTF-8?q?fix:=20=EC=98=A4=EB=A5=98=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20-=20api=20=EC=88=98=EC=A0=95=20-=20=EC=8A=A4?= =?UTF-8?q?=ED=83=80=EC=9D=BC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/_redirects | 4 + src/Apis/PaymentToken/paymentToken.ts | 17 +- src/Apis/Token/token.ts | 7 - src/Apis/productApi.ts | 19 ++ src/Apis/register.tsx | 21 ++- src/Common/Form/Login/login.scss | 5 - src/Common/Form/Login/login.tsx | 12 +- src/Common/Form/Signin/join.scss | 3 - src/Common/Form/Signin/join.tsx | 35 ++-- src/Common/Form/Validation .tsx | 5 - src/Common/Layout/Footer/footer.scss | 5 - src/Common/Layout/Footer/footer.tsx | 2 +- src/Common/Layout/Header/header.tsx | 32 +--- src/Common/Layout/Header/headers.scss | 11 -- .../Views/CartPage/CartItems/CartItems.scss | 7 - .../Views/CartPage/CartItems/CartItems.tsx | 9 - src/Components/Views/CartPage/CartPage.scss | 22 --- src/Components/Views/CartPage/CartPage.tsx | 25 +-- .../Views/CartPage/CartRent/CartRent.scss | 6 - .../Views/CartPage/CartRent/CartRent.tsx | 23 --- .../Views/CartPage/Payment/Payment.tsx | 4 +- .../Views/DetailPage/DetailPage.scss | 7 +- .../Views/DetailPage/DetailPage.tsx | 11 +- .../Views/MainPage/Component/Carousel.scss | 1 - .../Views/MainPage/Component/Genre.scss | 1 - .../Views/MainPage/Component/Genre.tsx | 1 - src/Components/Views/MainPage/MainPage.scss | 5 - src/Components/Views/MyPage/MyPage.scss | 38 +--- src/Components/Views/MyPage/MyPage.tsx | 17 +- src/Components/Views/MyPage/UserInfo.scss | 133 +++++++++----- src/Components/Views/MyPage/UserInfo.tsx | 107 +++++------ .../Views/MyPage/common/StyleCommon.scss | 4 +- .../MyPage/common/components/Category.scss | 15 +- .../MyPage/common/components/Category.tsx | 28 +-- .../Views/SearchPage/SearchPage.tsx | 168 +++++++++--------- src/bookcustom/bookcustom.scss | 12 -- src/main.tsx | 41 ++++- src/routes/privateRoute.tsx | 18 +- 38 files changed, 392 insertions(+), 489 deletions(-) create mode 100644 public/_redirects diff --git a/public/_redirects b/public/_redirects new file mode 100644 index 00000000..54378330 --- /dev/null +++ b/public/_redirects @@ -0,0 +1,4 @@ +/cafe24* https://teamwink.cafe24api.com/api/v2/:splat 200 +/iamport* https://api.iamport.kr/:splat 200 +/\* /index.html 200 +/\* /indext.html 404 \ No newline at end of file diff --git a/src/Apis/PaymentToken/paymentToken.ts b/src/Apis/PaymentToken/paymentToken.ts index 67192242..22bfdebc 100644 --- a/src/Apis/PaymentToken/paymentToken.ts +++ b/src/Apis/PaymentToken/paymentToken.ts @@ -1,16 +1,13 @@ import axios from "axios"; +const { VITE_IMP_KEY, VITE_IMP_SECERET } = import.meta.env; + export const ajax = axios({ - url: "/users/getToken", - // POST method - method: "post", - // "Content-Type": "application/json" - headers: { "Content-Type": "application/json" }, + url: '/users/getToken', + method: 'post', + headers: { 'Content-Type': 'application/json' }, data: { - // REST API키 - imp_key: "5758023681388354", - // REST API Secret - imp_secret: - "tCdwGmiflqhMA3It54n6aLBIeA7LCg0O3WYu5qI1SKpwQ85FKXtJsiHu8yUWTynhDx7fxCFY1wsA3KVc", + imp_key: VITE_IMP_KEY, + imp_secret: VITE_IMP_SECERET, }, }); diff --git a/src/Apis/Token/token.ts b/src/Apis/Token/token.ts index ffd6b061..24997532 100644 --- a/src/Apis/Token/token.ts +++ b/src/Apis/Token/token.ts @@ -1,5 +1,4 @@ import axios from 'axios'; -//import qs from 'qs'; const { VITE_ACCESS_TOKEN, VITE_REDIRECT_URI } = import.meta.env; @@ -41,7 +40,6 @@ export async function getToken() { token.access_token, token.expires_at, token.refresh_token - //token.refresh_token_expires_at ); } catch (err) { console.log(err); @@ -60,7 +58,6 @@ export async function refreshToken() { token.access_token, token.expires_at, token.refresh_token - //token.refresh_token_expires_at ); console.log('refresh', data); } catch (err) { @@ -72,13 +69,9 @@ function setCookie( accessToken: string, accessExpires: string, refreshToken: string - //refreshExpires: string ) { document.cookie = `accessToken=${accessToken}; path=/; expires=${new Date( accessExpires ).toUTCString()}`; localStorage.setItem('refreshToken', refreshToken); - // document.cookie = `refreshToken=${refreshToken}; path=/; expires=${new Date( - // refreshExpires - // ).toUTCString()}`; } diff --git a/src/Apis/productApi.ts b/src/Apis/productApi.ts index a44968d2..eb579c70 100644 --- a/src/Apis/productApi.ts +++ b/src/Apis/productApi.ts @@ -51,3 +51,22 @@ export async function getDetail(product_no: string) { console.log(err); } } + +export const GetImpToken = async () => { + try { + const response = await axios.post( + '/iamport/users/getToken', + { + imp_key: '5758023681388354', + imp_secret: 'tCdwGmiflqhMA3It54n6aLBIeA7LCg0O3WYu5qI1SKpwQ85FKXtJsiHu8yUWTynhDx7fxCFY1wsA3KVc', + }, + { + headers: { 'Content-Type': 'application/json' }, + } + ); + return response.data; + } catch (error) { + console.error(error); + throw error; + } +}; \ No newline at end of file diff --git a/src/Apis/register.tsx b/src/Apis/register.tsx index aa38daed..d246753f 100644 --- a/src/Apis/register.tsx +++ b/src/Apis/register.tsx @@ -1,9 +1,11 @@ import axios from 'axios'; +const { VITE_KDT5_API, VITE_KDT5_USER } = import.meta.env; + const headers = { 'Content-Type': 'application/json', - 'apikey': 'KDT5_nREmPe9B', - 'username': 'KDT5_TeamWink', + apikey: VITE_KDT5_API, + username: VITE_KDT5_USER, }; const axiosInstance = axios.create({ @@ -29,3 +31,18 @@ export const LogoutForm = async () => { const res = await axiosInstance.post(LOGOUTURL, {}, { headers: { ...headers, 'Authorization': `Bearer ${token}` } }); return res.data; }; + +export const TokenMe = async () => { + const AUTHME = '/me'; + const token = localStorage.getItem('token') as string; + const res = await axiosInstance.post(AUTHME, {}, { headers: { ...headers, 'Authorization': `Bearer ${token}` } }); + return res.data; +}; + + +export const InfoToken = async (displayName:string, profileImgBase64:string, oldPassword:string, newPassword:string) => { + const InfoMe = '/user'; + const token = localStorage.getItem('token') as string; + const res = await axiosInstance.put(InfoMe, {displayName, profileImgBase64, oldPassword, newPassword}, { headers: { ...headers, 'Authorization': `Bearer ${token}` } }); + return res.data; +}; diff --git a/src/Common/Form/Login/login.scss b/src/Common/Form/Login/login.scss index f34803c5..0c122136 100644 --- a/src/Common/Form/Login/login.scss +++ b/src/Common/Form/Login/login.scss @@ -9,7 +9,6 @@ .JoinTextContainer{ @include Textbox; - //background-color: pink; p { margin: auto; @@ -23,13 +22,11 @@ position: relative; top: 150px; margin: 0 auto; - //background-color: chartreuse; .formBox-inner{ width: 300px; height: 95px; margin: 0 auto; - //background-color: red; input { width:100%; @@ -39,7 +36,6 @@ padding: 10px 10px 10px 10px; border: 2px solid #F7E9D7; outline: none; - //font-family: 'Dovemayo_gothic'; font-family: 'SUITE-Regular'; } } @@ -59,7 +55,6 @@ height: 50px; color: black; background-color: #F7E9D7; - // border: solid 2px #F7E9D7; cursor: pointer; border-radius: 10px; } diff --git a/src/Common/Form/Login/login.tsx b/src/Common/Form/Login/login.tsx index 1486bf55..93eb1c32 100644 --- a/src/Common/Form/Login/login.tsx +++ b/src/Common/Form/Login/login.tsx @@ -1,6 +1,7 @@ import "./login.scss"; import { useNavigate, Link } from "react-router-dom"; import { FormEvent, useState, ChangeEvent } from "react"; +import { useEffect } from "react"; import { LoginForm } from "@/Apis/register"; function Login() { @@ -17,6 +18,14 @@ function Login() { setPassword(e.target.value); }; + useEffect(() => { + const token = localStorage.getItem("token"); + if (token) { + navigate("/"); + } + }, []); + + async function Signin(event: FormEvent) { event.preventDefault(); @@ -37,14 +46,13 @@ function Login() { if (data.accessToken) { alert("로그인 되었습니다!"); window.localStorage.setItem("token", data.accessToken); - //window.location.reload(); navigate("/"); } else { alert("로그인에 실패하였습니다. 다시 시도해주세요."); } } catch (error) { console.error(error); - alert("오류가 발생했습니다. 다시 시도해주세요."); + alert("아이디 또는 비밀번호가 일치하지 않습니다. "); } } diff --git a/src/Common/Form/Signin/join.scss b/src/Common/Form/Signin/join.scss index 6ae011f2..7d01ddf4 100644 --- a/src/Common/Form/Signin/join.scss +++ b/src/Common/Form/Signin/join.scss @@ -3,9 +3,7 @@ width: 1200px; height: 1000px; padding-bottom: 80px; - // background-color: aqua; position: relative; - // left: 300px; margin: 0 auto; } @@ -13,7 +11,6 @@ width: 500px; height: 730px; position: relative; - // border: solid 1px #c6c6c6; border-radius: 10px; top: 30px; margin: auto; diff --git a/src/Common/Form/Signin/join.tsx b/src/Common/Form/Signin/join.tsx index 4eb1908b..9a6802fd 100644 --- a/src/Common/Form/Signin/join.tsx +++ b/src/Common/Form/Signin/join.tsx @@ -1,4 +1,4 @@ -import { FormEvent, useState, useCallback, useRef } from "react"; +import { FormEvent, useState, useCallback } from "react"; import { useNavigate } from "react-router-dom"; import { PwCheck, emailCheck } from "../Validation "; import { JoinForm } from "@/Apis/register"; @@ -13,7 +13,7 @@ function Join() { const [password, setUserPassword] = useState(""); const [confirmPassword, setConfirmPassword] = useState(""); const [profileImgBase64, setProfileImgBase64] = useState(""); - const imgRef = useRef(); + //비밀번호 유효성 검사 const [isName, setIsName] = useState(false); @@ -118,24 +118,20 @@ function Join() { async function signUp(event: FormEvent) { event.preventDefault(); - if (email === undefined || email === "" || email === null) { - alert("이메일 입력해주세요."); + + if (!email) { + alert("이메일을 입력해주세요."); return false; } - - if ( - isEmail === false || - isPassword === false || - isPasswordConfirm === false - ) { - alert("값이 잘못 되었습니다. 다시 입력해주세요"); + + if (!isEmail || !isPassword || !isPasswordConfirm) { + alert("값이 잘못되었습니다. 다시 입력해주세요."); return false; } - try { - const res = await JoinForm(email, displayName, password,profileImgBase64 ); - + const res = await JoinForm(email, displayName, password, profileImgBase64); + if (res.accessToken) { alert("가입되었습니다."); navigate("/login"); @@ -143,7 +139,15 @@ function Join() { alert("가입에 실패했습니다. 다시 시도해주세요."); } } catch (error) { - alert("시스템 오류입니다. 문의해주세요."); + if (error instanceof Error) { + if (error.message === "401") { + alert("중복된 아이디입니다."); + } else { + console.error("오류가 발생했습니다:", error); + } + } else { + console.error("오류가 발생했습니다:", error); + } } } @@ -224,7 +228,6 @@ function Join() {
프로필 이미지 고르기🍒 { return emailExp.test(mail) ? true : false; } - -//패스워드 체크 여부 -// const PwExp = /^(?=.*[a-zA-z])(?=.*[0-9])(?=.*[A-Z])(?=.*[$`~!@$!%*#^?&\\(\\)\-_=+]).{8,}/; - - const PwExp = /^.{8,}$/; export const PwCheck = (password:string) => { return PwExp.test(password) ? true : false; diff --git a/src/Common/Layout/Footer/footer.scss b/src/Common/Layout/Footer/footer.scss index 1b27eded..cd53cad8 100644 --- a/src/Common/Layout/Footer/footer.scss +++ b/src/Common/Layout/Footer/footer.scss @@ -1,9 +1,6 @@ footer { - // position: fixed; bottom: 0; - //width: 1500px; width: 100%; - //max-width: 2000px; background-color: rgb(255, 255, 255); height: 100px; position: relative; @@ -42,8 +39,6 @@ footer { img{ - // width: 100px; - // height: 80px; width: 80px; top: 15px; position: absolute; diff --git a/src/Common/Layout/Footer/footer.tsx b/src/Common/Layout/Footer/footer.tsx index f6da4ad3..342b04b1 100644 --- a/src/Common/Layout/Footer/footer.tsx +++ b/src/Common/Layout/Footer/footer.tsx @@ -1,6 +1,6 @@ import "./footer.scss"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import { faGithub, faFacebook, faSquareInstagram } from "@fortawesome/free-brands-svg-icons"; +import { faGithub } from "@fortawesome/free-brands-svg-icons"; const Footer = () => { const Donguk = "https://github.com/foodeco"; diff --git a/src/Common/Layout/Header/header.tsx b/src/Common/Layout/Header/header.tsx index 10453a3e..b78bb08a 100644 --- a/src/Common/Layout/Header/header.tsx +++ b/src/Common/Layout/Header/header.tsx @@ -1,15 +1,13 @@ import { Link, useNavigate } from "react-router-dom"; -import axios from "axios"; import { useEffect, useState } from "react"; import { ChangeEvent } from "react"; import "./headers.scss"; -import { LogoutForm } from "@/Apis/register"; +import { LogoutForm,TokenMe } from "@/Apis/register"; import { getList } from "@/Apis/productApi"; - interface User { - displayName: string; // 사용자 표시 이름 - profileImg: string; // 사용자 프로필 이미지 URL + displayName: string; + profileImg: string; } interface Product { @@ -19,16 +17,13 @@ interface Product { price: string; } - function Header() { - const defaultProfileImgUrl = "/public/images/default-profile.jpg"; + const defaultProfileImgUrl = "/images/default-profile.jpg"; const [user, setUser] = useState({ displayName: "", profileImg: "" }); const [keyword, setKeyWord] = useState(""); const [filteredItems, setFilteredItems] = useState([]); const [product, setProductInfo] = useState([]); const [showInputButton, setShowInputButton] = useState(false); - - const navigate = useNavigate(); const handleInputChange = (e: ChangeEvent) => { @@ -44,7 +39,6 @@ function Header() { } }; - const logoutHandler = () => { LogoutForm() .then(() => { @@ -66,19 +60,7 @@ function Header() { useEffect(() => { const authenticate = async () => { try { - const response = await axios.post( - "https://asia-northeast3-heropy-api.cloudfunctions.net/api/auth/me", - {}, - { - headers: { - Authorization: `Bearer ${localStorage.getItem("token")}`, - "Content-Type": "application/json", - apikey: "KDT5_nREmPe9B", - username: "KDT5_TeamWink", - }, - } - ); - const userData = response.data; + const userData = await TokenMe(); // 사용자 정보를 업데이트하기 전에 profileImg가 존재하지 않을 경우에만 기본 프로필 이미지 URL을 사용 setUser((prevUser) => ({ @@ -134,7 +116,7 @@ function Header() {
- logo + logo
searchicon diff --git a/src/Common/Layout/Header/headers.scss b/src/Common/Layout/Header/headers.scss index 423beff5..21567985 100644 --- a/src/Common/Layout/Header/headers.scss +++ b/src/Common/Layout/Header/headers.scss @@ -11,7 +11,6 @@ z-index: 900; .itemsWrapper{ - // width: 80%; margin: 0 auto; left: 0; right: 0; @@ -55,10 +54,6 @@ outline: none; left: 0; right: 0; - &:focus { - // border: 2px solid rgb(202, 159, 18); - // box-shadow: 1px 1px 1px 0.3px rgb(202, 159, 18); - } } img { position: absolute; @@ -87,7 +82,6 @@ .Header-box__logout { width: inherit; - // padding: 15px 20px 0 0; } } @@ -98,10 +92,8 @@ height: 60px; bottom: 12px; left:40px; - // background-color: pink; .cartPhoto { - // background-color: olive; cursor: auto; box-sizing: border-box; position: absolute; @@ -131,12 +123,10 @@ margin: 0 auto; padding-bottom: 100px; margin-top: 10px; - //background-color: orange; .Input-Buttom__innerBox{ width: 340px; height: 160px; - //background-color: red; margin: 0 auto; cursor: pointer; margin-top: 12px; @@ -158,7 +148,6 @@ .Input-Buttom__title{ width: 210px; padding-bottom: 15px; - //background-color: yellowgreen; position: relative; left: 140px; bottom: 100px; diff --git a/src/Components/Views/CartPage/CartItems/CartItems.scss b/src/Components/Views/CartPage/CartItems/CartItems.scss index c4e02c46..bd68e3c9 100644 --- a/src/Components/Views/CartPage/CartItems/CartItems.scss +++ b/src/Components/Views/CartPage/CartItems/CartItems.scss @@ -1,6 +1,5 @@ @mixin CartNameStyle { height: auto; - //background-color: rgb(14, 133, 237); font-size: 20px; position: absolute; top: 10px; @@ -17,7 +16,6 @@ .LableBox { width: 40px; height: 40px; - //background-color: #e18b8b; margin-left: 50px; margin-top: 5px; position: absolute; @@ -50,7 +48,6 @@ width: 1300px; top: 50px; position: relative; - //background-color: #F8EDE3; max-height: 450px; /* 스크롤 영역의 최대 높이 설정 */ overflow-y: auto; /* 세로 스크롤 생성 */ @@ -71,14 +68,12 @@ .ImageBox{ width: 100px; - // height: 100px; position: relative; bottom: 10px; margin-left: 160px; background-color: rebeccapurple; img{ - //position: absolute; width: inherit; background-color: orange; height: auto; @@ -112,7 +107,6 @@ top: 50px; position: absolute; right: 370px; - // background-color: olivedrab; font-size: 15px; } @@ -121,7 +115,6 @@ position: absolute; top: 35px; right: 100px; - // background-color: burlywood; button{ display: block; diff --git a/src/Components/Views/CartPage/CartItems/CartItems.tsx b/src/Components/Views/CartPage/CartItems/CartItems.tsx index e092108d..abac1335 100644 --- a/src/Components/Views/CartPage/CartItems/CartItems.tsx +++ b/src/Components/Views/CartPage/CartItems/CartItems.tsx @@ -15,18 +15,10 @@ interface BuyItem { buyItem:number; } -interface CartItem { - product_no: number; - setItems:any; -} - interface CartItemsProps { check: number[]; - //pitem: string; - //setItems:React.Dispatch>; delete: (key: any) => void; datalist: any; - //setdata: React.Dispatch>; checkOne: any; checkTwo: any; } @@ -35,7 +27,6 @@ const CartItems = ({ check, delete: RemoveBuyItem, datalist, - //setItems, checkOne, checkTwo, }: CartItemsProps) => { diff --git a/src/Components/Views/CartPage/CartPage.scss b/src/Components/Views/CartPage/CartPage.scss index 44fae3c1..5daadd62 100644 --- a/src/Components/Views/CartPage/CartPage.scss +++ b/src/Components/Views/CartPage/CartPage.scss @@ -10,30 +10,16 @@ font-family: 'SUITE-Regular'; width: 1200px; height: 1500px; - // padding-bottom: 1400px; position: relative; margin: 0 auto; top: 80px; font-weight: 600; - // background-color: aquamarine; - - // .Layout{ - // font-family: 'SUITE-Regular'; - // width: 1200px; - // height: auto; - // padding-bottom: 200px; - // position: relative; - // margin: 0 auto; - // top: 80px; - // font-weight: 600; - // background-color: aquamarine; .ProductText { @include CartNameStyle; top: 10px; left: 45px; position: absolute; - // background-color: red; } .CartContainer { @@ -58,7 +44,6 @@ } .RentText { - // background-color: olive; position: absolute; font-size: 20px; top: 600px; @@ -77,7 +62,6 @@ } .BuyText { - // background-color: olive; position: absolute; height: 50px; font-size: 20px; @@ -88,7 +72,6 @@ .BuyContainer { position: absolute; width: inherit; - // padding-bottom: 200px; height: 200px; bottom: 100px; border-radius: 10px; @@ -113,7 +96,6 @@ .Pay-Container { width: inherit; - //height: 30px; background-color: rosybrown; display: flex; gap: 40px; @@ -126,14 +108,12 @@ width: 500px; position: absolute; height: 50px; - //background-color: rebeccapurple; top: 120px; left: 100px; .AllCount-Container__box { width: 300px; height: 30px; - //background-color: darkblue; display: flex; gap: 50px; margin: 0 auto; @@ -143,7 +123,6 @@ .Buy-ButtonBox { width: 300px; height: 55px; - // background-color: firebrick; position: relative; left: 650px; top: 70px; @@ -163,5 +142,4 @@ } } } -// } } diff --git a/src/Components/Views/CartPage/CartPage.tsx b/src/Components/Views/CartPage/CartPage.tsx index 3c81eab0..bbc67ae6 100644 --- a/src/Components/Views/CartPage/CartPage.tsx +++ b/src/Components/Views/CartPage/CartPage.tsx @@ -13,7 +13,7 @@ interface BuyItem { } function CartPage() { - const [CartItemsValue, setCartItemsValue] = useState([]); + const [CartItemsValue, ] = useState([]); const [selectedItem, setSelectedItem] = useState([]); const [Total, setTotal] = useState(0); const [ShowTotal, setShowTotal] = useState(false); @@ -29,18 +29,6 @@ function CartPage() { calculateTotal(); }, [selectedItem]); - // const checkOne = (event: React.ChangeEvent, buyItem: any[], gubun: string) => { - // const checkedValue = event.target.checked; - // const filteredItems = buyItem.filter((item) => item.gubun === gubun); - // const updatedSelectedItems = checkedValue ? [...filteredItems] : []; - // const unchekedSelectedItems = [...filteredItems]; - // const combinedItems = new Set([...selectedItem, ...updatedSelectedItems]); - // const checkitem = checkedValue ? Array.from(combinedItems): selectedItem.filter(item => !unchekedSelectedItems.some(updatedItem => updatedItem.product_no === item.product_no)); - // setSelectedItem(checkitem); - // const updatedCheckedItems = updatedSelectedItems.map((item, index) => index); - // return updatedCheckedItems; - // }; - const checkOne = (event: React.ChangeEvent, buyItem: any[], gubun: string) => { const checkedValue = event.target.checked; const filteredItems = buyItem.filter((item) => item.gubun === gubun); @@ -95,10 +83,6 @@ function CartPage() { console.log(key); const confirmation = window.confirm("삭제하시겠습니까?"); if (confirmation) { - // const updatedCartData = JSON.parse(localStorage.getItem("cart")); - // const datalist = JSON.stringify( - // updatedCartData.filter((item) => item.product_no !== key) - // ) const cartDataString = localStorage.getItem("cart"); if (cartDataString !== null) { @@ -118,15 +102,12 @@ function CartPage() { return ( <>
- {/*
*/} 구매
@@ -135,10 +116,8 @@ function CartPage() {
@@ -162,12 +141,10 @@ function CartPage() {
- {/* */}
- {/*
*/}
); diff --git a/src/Components/Views/CartPage/CartRent/CartRent.scss b/src/Components/Views/CartPage/CartRent/CartRent.scss index 8863a534..0d91e47b 100644 --- a/src/Components/Views/CartPage/CartRent/CartRent.scss +++ b/src/Components/Views/CartPage/CartRent/CartRent.scss @@ -1,6 +1,5 @@ @mixin CartNameStyle { height: auto; - //background-color: rgb(14, 133, 237); font-size: 20px; position: absolute; top: 10px; @@ -9,7 +8,6 @@ .RentPageTable{ width: inherit; height: 45px; - // background-color: #bff12b; background-color: #f6e4cc; position: absolute; border-radius: 10px 10px 0px 0px; @@ -17,7 +15,6 @@ .Rent-LableBox{ width: 40px; height: 40px; - //background-color: #e18b8b; margin-left: 50px; margin-top: 5px; position: absolute; @@ -51,7 +48,6 @@ top: 50px; position: relative; border-radius: 0px 0px 10px 10px; - //background-color: #d16f14; background-color: white; max-height: 450px; /* 스크롤 영역의 최대 높이 설정 */ overflow-y: auto; /* 세로 스크롤 생성 */ @@ -59,7 +55,6 @@ .Rental-ItemContainer { width: 1182px; padding-bottom: 5px; - //height: 90px; position: relative; margin-top: 20px; border-bottom: 2px solid rgb(208, 203, 185); @@ -120,7 +115,6 @@ position: absolute; top: 40px; right: 110px; - //background-color: burlywood; button{ display: block; diff --git a/src/Components/Views/CartPage/CartRent/CartRent.tsx b/src/Components/Views/CartPage/CartRent/CartRent.tsx index 9b9b5dc1..48fce65f 100644 --- a/src/Components/Views/CartPage/CartRent/CartRent.tsx +++ b/src/Components/Views/CartPage/CartRent/CartRent.tsx @@ -15,18 +15,11 @@ interface RentItem { name: string; rentdate: string; } - -interface CartItem { - product_no: number; -} interface CartItemsProps { check: number[]; - //pitem: string; - //setItems: React.Dispatch>; delete: (key: number) => void; datalist : any - //setdata : React.Dispatch>; checkOne : any; checkTwo : any; } @@ -37,7 +30,6 @@ interface CartItem { datalist, checkOne, checkTwo, - //setItems }: CartItemsProps) => { const [buyItem, setbuyItem] = useState([]); @@ -48,27 +40,12 @@ interface CartItem { setbuyItem(datalist) }, [datalist]); - - // useEffect(() => { - // BuyCart(); - // }, []); - - // const BuyCart = () => { - // const BuyItems = JSON.parse(localStorage.getItem("cart")) || []; - // setbuyItem(BuyItems); - // console.log(BuyItems) - // } - - const handleChange1 = (event: React.ChangeEvent) => { if(event.target.checked){ setCheckedItems(checkOne(event, buyItem, "rent")); setallCheck(true); }else{ setCheckedItems(checkOne(event, buyItem, "rent")); - // console.log('g'); - // setCheckedItems([]); - // setItems([]); setallCheck(false); } }; diff --git a/src/Components/Views/CartPage/Payment/Payment.tsx b/src/Components/Views/CartPage/Payment/Payment.tsx index 1c16e24d..c5229718 100644 --- a/src/Components/Views/CartPage/Payment/Payment.tsx +++ b/src/Components/Views/CartPage/Payment/Payment.tsx @@ -16,6 +16,8 @@ interface BuyItem { setdatalist: any; } +const { VITE_IMP_OWNER } = import.meta.env; + const Payment = ({ amount, productlists, setdatalist }: PaymentInfo) => { const orderNumber = `mid_${new Date().getTime()}`; console.log(orderNumber); @@ -40,7 +42,7 @@ const Payment = ({ amount, productlists, setdatalist }: PaymentInfo) => { console.log(itemName); const IMP = (window as any).IMP; - IMP.init("imp36252452"); + IMP.init(VITE_IMP_OWNER); const data = { pg: "html5_inicis", // PG사 html5_inicis: KG이니시스, kakaopay: 카카오페이, naverpay: 네이버페이, payco: 페이코 diff --git a/src/Components/Views/DetailPage/DetailPage.scss b/src/Components/Views/DetailPage/DetailPage.scss index fd05c80b..16e0eccc 100644 --- a/src/Components/Views/DetailPage/DetailPage.scss +++ b/src/Components/Views/DetailPage/DetailPage.scss @@ -187,8 +187,6 @@ width: 140px; position: absolute; padding-bottom: 10px; - //background-color: rgb(253, 248, 248); - //border-radius: 10px; padding: 10px; font-size: 23px; font-weight: bold; @@ -210,7 +208,7 @@ } .TopBox.slide-down { - transform: translateY(-1px); /* Apply the slide-down transform value */ + transform: translateY(-1px); } .TopContentBox { @@ -271,7 +269,6 @@ font-size: 20px; padding: 10px; font-size: 23px; - //font-weight: bold; border-radius: 10px; } @@ -290,7 +287,6 @@ .InnerContent { width: 900px; - //background-color: red; height: auto; display: block; margin: 0 auto; @@ -298,7 +294,6 @@ img { width: 900px; - //position: absolute; display: flex; margin: 0 auto; } diff --git a/src/Components/Views/DetailPage/DetailPage.tsx b/src/Components/Views/DetailPage/DetailPage.tsx index d6a3558a..b2a5483d 100644 --- a/src/Components/Views/DetailPage/DetailPage.tsx +++ b/src/Components/Views/DetailPage/DetailPage.tsx @@ -3,7 +3,6 @@ import { useEffect, useState } from "react"; import { useParams, useNavigate } from "react-router-dom"; import TopHeader from "./components/TopHeader"; import { getDetail } from "@/Apis/productApi"; -import { ChangeEvent } from "react"; import "./DetailPage.scss"; function DetailPage() { @@ -143,7 +142,6 @@ function DetailPage() {
판매가 - {" "} {Number(detail.price).toFixed(0)}원{" "}
@@ -158,14 +156,12 @@ function DetailPage() {
@@ -191,8 +187,7 @@ function DetailPage() {
+ onClick={disableLinkClick}>
diff --git a/src/Components/Views/MainPage/Component/Carousel.scss b/src/Components/Views/MainPage/Component/Carousel.scss index 9b2da427..5b96d711 100644 --- a/src/Components/Views/MainPage/Component/Carousel.scss +++ b/src/Components/Views/MainPage/Component/Carousel.scss @@ -29,7 +29,6 @@ top: 0; left: 0; object-fit: cover; - // background-color: red; } } .navigation { diff --git a/src/Components/Views/MainPage/Component/Genre.scss b/src/Components/Views/MainPage/Component/Genre.scss index b23fdabc..6c64ddc5 100644 --- a/src/Components/Views/MainPage/Component/Genre.scss +++ b/src/Components/Views/MainPage/Component/Genre.scss @@ -91,7 +91,6 @@ background-color: red; color: #fff; right: 10%; - //top: 40%; padding: 0 2px; overflow: hidden; z-index: 1; diff --git a/src/Components/Views/MainPage/Component/Genre.tsx b/src/Components/Views/MainPage/Component/Genre.tsx index 29dc419d..072a4272 100644 --- a/src/Components/Views/MainPage/Component/Genre.tsx +++ b/src/Components/Views/MainPage/Component/Genre.tsx @@ -12,7 +12,6 @@ export default function Genre({ category }: { category: Props }) { const [list, setList] = useState([] as Products); async function sortByCategory() { const data = await getList({ category: category.number }); - //console.log(category.number); setList(data); } useEffect(() => { diff --git a/src/Components/Views/MainPage/MainPage.scss b/src/Components/Views/MainPage/MainPage.scss index 3dce086b..102edc33 100644 --- a/src/Components/Views/MainPage/MainPage.scss +++ b/src/Components/Views/MainPage/MainPage.scss @@ -2,7 +2,6 @@ padding-top: 150px; max-width: 1200px; margin: auto; - // background-color: yellow; position: relative; } a { @@ -19,21 +18,17 @@ main { .Category-menu { position: sticky; top: 100px; - //height: 410px; height: 25rem; - // margin-left: 0; img { border-radius: 10px 10px 0 0; position: sticky; - //width: 120px; width: 7.5rem; } .Category-menu__text { width: 127px; position: absolute; - //bottom: 50px; top: 0; height: 360px; padding: 4px; diff --git a/src/Components/Views/MyPage/MyPage.scss b/src/Components/Views/MyPage/MyPage.scss index b7c33f38..62cd8e69 100644 --- a/src/Components/Views/MyPage/MyPage.scss +++ b/src/Components/Views/MyPage/MyPage.scss @@ -21,13 +21,11 @@ font-size: 25px; font-weight: bold; margin-left: 5rem; - // background-color: #F2E7D5; } .orderContainer{ position: relative; padding-bottom: 400px; - //background-color: rgb(148, 255, 124); top: 50px; @@ -37,14 +35,12 @@ position:relative; display: flex; height: 40px; - // left: 10px; background-color: #e8e0d6; gap: 120px; margin: 0 auto; .TopCategory-inner{ width: 70px; - //background-color: aqua; height: 20px; position: relative; margin-left: 25px; @@ -61,10 +57,9 @@ left: 0; right: 0; height: 400px; - //margin-top: 10px; max-height: 450px; /* 스크롤 영역의 최대 높이 설정 */ overflow-y: auto; - background-color: rgb(202, 172, 172); + background-color: #faf4ee; border-radius: 0px 0px 10px 10px; @@ -74,13 +69,11 @@ margin: 0 auto; margin-top: 20px; padding-bottom: 10px; - //background-color: red; padding: 10px; border-bottom: 2px solid rgb(208, 203, 185); .Buy-ButtonBox{ width: 30px; height: 20px; - //background-color: aqua; position: relative; top:50px; right: -500px; @@ -94,7 +87,6 @@ .orderList-priceBox{ width: auto; position: relative; - //background-color: rgb(239, 179, 191); left: 350px; top:50px; height: 20px; @@ -106,7 +98,6 @@ height: 140px; position: relative; left: 180px; - //background-color: aqua; img{ position: absolute; @@ -116,19 +107,15 @@ .orderList-ImageBox__text{ width: auto; - //background-color: crimson; position: relative; } } - - span:nth-child(1) { position: relative; left: 10px; top: 50px; - height: 20px; - //background-color: rgb(135, 100, 34); + height: 20px } span:nth-child(2) { @@ -136,7 +123,6 @@ top: 50px; left: 110px; height: 20px; - //background-color: rgb(31, 216, 114); } span:nth-child(3) { @@ -149,7 +135,7 @@ } } - .RentText{ + .RentContainer-text{ position: relative; left:10px; top: 100px; @@ -157,13 +143,11 @@ font-size: 25px; font-weight: bold; margin-left: 5rem; - // background-color: #F2E7D5; } .RentContainer{ position: relative; padding-bottom: 400px; - //background-color: rgb(148, 255, 124); top: 120px; .RentTop-Category{ @@ -172,14 +156,12 @@ position:relative; display: flex; height: 40px; - // left: 10px; background-color: #e8e0d6; gap: 120px; margin: 0 auto; .RentCategory-inner{ width: 70px; - //background-color: aqua; height: 20px; position: relative; margin-left: 25px; @@ -195,10 +177,9 @@ left: 0; right: 0; height: 400px; - //margin-top: 10px; - max-height: 450px; /* 스크롤 영역의 최대 높이 설정 */ + max-height: 450px; overflow-y: auto; - background-color: rgb(202, 172, 172); + background-color: #faf4ee; border-radius: 0px 0px 10px 10px; .RentList{ @@ -207,7 +188,6 @@ margin: 0 auto; margin-top: 20px; padding-bottom: 20px; - //background-color: red; padding: 10px; border-bottom: 2px solid rgb(208, 203, 185); .RentList-ImageBox{ @@ -215,7 +195,6 @@ height: 140px; position: relative; left: 180px; - //background-color: rgb(87, 188, 9); img{ position: absolute; @@ -228,8 +207,6 @@ left:120px; top: 60px; width: 150px; - //font-size: 20px; - //background-color: #F2E7D5; } } @@ -238,7 +215,6 @@ left: 10px; top: 60px; height: 20px; - //background-color: rgb(135, 100, 34); } span:nth-child(2) { @@ -246,7 +222,6 @@ top: 60px; left: 110px; height: 20px; - //background-color: rgb(31, 216, 114); } span:nth-child(3) { @@ -254,13 +229,11 @@ top: 60px; left: 110px; height: 20px; - //background-color: rgb(16, 123, 211); } .RentList-priceBox{ width: auto; position: relative; - //background-color: rgb(239, 179, 191); left: 350px; top:60px; height: 20px; @@ -269,7 +242,6 @@ .Rent-ButtonBox{ width: 30px; position: relative; - //background-color: rgb(239, 179, 191); left: 528px; top:60px; height: 20px; diff --git a/src/Components/Views/MyPage/MyPage.tsx b/src/Components/Views/MyPage/MyPage.tsx index cc1e3751..5b7b396e 100644 --- a/src/Components/Views/MyPage/MyPage.tsx +++ b/src/Components/Views/MyPage/MyPage.tsx @@ -1,6 +1,7 @@ import { useState, useEffect } from "react"; import axios,{ AxiosResponse } from "axios"; import Category from "./common/components/Category"; +import { GetImpToken } from "@/Apis/productApi"; import "./MyPage.scss"; interface PaymentItem { @@ -45,16 +46,8 @@ const [mydataList, setMydataList] = useState([]); const GetToken = async () => { try{ - const response = await axios.post('/iamport/users/getToken', - { - imp_key: '5758023681388354', - imp_secret: 'tCdwGmiflqhMA3It54n6aLBIeA7LCg0O3WYu5qI1SKpwQ85FKXtJsiHu8yUWTynhDx7fxCFY1wsA3KVc', - }, - { - headers: { 'Content-Type': 'application/json' }, - } - ); - const accessToken = response.data.response.access_token; + const tokenData = await GetImpToken(); + const accessToken = tokenData.data.response.access_token; return accessToken; } catch (error) { console.log(error); @@ -110,7 +103,6 @@ useEffect(() => { ...data, paid_at: item.paid_at, merchant_uid: item.merchant_uid, - // Add more properties as needed })); setMydataList((prevDataList) => [...prevDataList, ...parsedData]); } @@ -202,7 +194,7 @@ const getDate = function(param:any){
-
대여 내역
+
대여내역
{Object.keys(TopCategory).map(key => { @@ -232,7 +224,6 @@ const getDate = function(param:any){ ))}
-
diff --git a/src/Components/Views/MyPage/UserInfo.scss b/src/Components/Views/MyPage/UserInfo.scss index f3db508f..aca2894e 100644 --- a/src/Components/Views/MyPage/UserInfo.scss +++ b/src/Components/Views/MyPage/UserInfo.scss @@ -17,15 +17,12 @@ .infoContainer{ position: relative; top: 3rem; - // margin: 0 auto; - margin-left: 3rem; + padding-bottom: 50px; + margin-left: 4rem; height: 90%; - // border: solid 1px rgb(221,221,221); - // background-color: rgb(124, 255, 255); .info{ position: relative; - // background-color: rgb(224, 57, 57); top: 2rem; @@ -35,7 +32,6 @@ .infoText{ position: relative; left:2rem; - // border: solid 1px black; font-size: 24px; font-weight: 900; color:black; @@ -47,15 +43,84 @@ .infoBox{ position: relative; margin: 2rem 4rem 0 4rem; - // background-color: cadetblue; - // border: dotted 1px black; width: auto; height: 30rem; - // display: flex; + + .infoImage-container{ + display: flex; + padding: 1.5rem 1.2rem; + + .infoImage-container__text{ + width: 8rem; + padding-top: 10px; + text-align: center; + font-weight: bold; + } + + .infoImageUpload{ + position: relative; + bottom: -2px; + height: 60px; + left: 105px; + font-size: 13px; + + span{ + padding-top: 5px; + } + + .custom-file-input { + width: inherit; + height: 40px; + display: inline-block; + border: 1px solid #ccc; + padding: 9px 12px 0px 25px; + cursor: pointer; + background-color: #f1f1f1; + color: #333; + border-radius: 4px; + } + + .custom-file-input input[type="file"] { + display: none; + } + } + + .fileMB{ + position: relative; + bottom: -59px; + height: 20px; + left: -33px; + font-size: 13px; + } + + .preview-container{ + width: 200px; + height: 200px; + position: relative; + background-color: #F5F5F5; + border-radius: 10px; + left: 52px; + bottom:26px; + + span{ + position: relative; + width: 50px; + margin-left: 50px; + top: 81px; + } + + img{ + width: inherit; + padding: 8px; + margin: 0 auto; + height: inherit; + z-index: 100px; + } + } + } .infoList{ display:flex; - // background-color: rgb(245, 242, 97); padding: 1.5rem 1.2rem; .infoTitle{ @@ -69,51 +134,37 @@ .infoItemForm{ padding: 15px; margin-left: 15px; - width:500px; + width:300px; background-color: white; border: solid 1px rgb(221, 221, 221); border-radius: .5rem; } - - .btn-upload { - padding: 15px; - margin-left: 15px; - width:200px; - color:rgb(123, 123, 123); - background-color: white; - border: solid 1px rgb(221, 221, 221); - border-radius: .5rem; - cursor: pointer; - display: flex; - justify-content: center; - &:hover { - background: rgb(77,77,77); - color: #fff; - } - } - - #file { - display: none; - } - + span{ + width: 100px; + height: 30px; + background-color: yellow; + } } .infoFix{ - background-color:rgb(53, 197, 240); - border-radius: .5rem; + background-color:#C8B6A6; + border-radius: 10px; margin-left: 10rem; padding: 15px; - width: 15rem; - color:white; + width: 12rem; + border: none; + color:#ffff; font-weight: 700; - font-size: 18px; + font-size: 15px; + position: absolute; + bottom: -103px; + left: 77px; cursor: pointer; &:hover { - background-color:rgb(96, 203, 235); - color: black; + background-color:#c3b6ab; } - } + } } } } diff --git a/src/Components/Views/MyPage/UserInfo.tsx b/src/Components/Views/MyPage/UserInfo.tsx index 8abd1ecf..34569b3f 100644 --- a/src/Components/Views/MyPage/UserInfo.tsx +++ b/src/Components/Views/MyPage/UserInfo.tsx @@ -1,39 +1,26 @@ -import { FormEvent, useState, useEffect, ChangeEvent, useCallback, useRef } from "react"; -import axios from "axios"; -import { Link, useNavigate } from "react-router-dom"; +import { useState } from "react"; import "./UserInfo.scss"; +import { InfoToken } from "@/Apis/register"; import Category from "./common/components/Category"; function UserInfo() { - const navigate = useNavigate(); - // 이름 , 프로필사진 , 구 비밀번호 , 새 비밀번호 - - const [displayName, setDisplayName] = useState(); // {} as User - const [profileImgBase64, setProfileImgBase64] = useState(""); + const [displayName, setDisplayName] = useState(""); const [oldPassword, setOldPassword] = useState(""); const [newPassword, setNewPassword] = useState(""); - + const [selectedImage, setSelectedImage] = useState(null); async function submit(e: any) { e.preventDefault(); try { - const res = await axios.put("https://asia-northeast3-heropy-api.cloudfunctions.net/api/auth/user", { - displayName: displayName, // 새로운 표시 이름 - profileImgBase64: profileImgBase64, // 사용자 프로필 이미지(base64) - jpg, jpeg, webp, png, gif, svg - oldPassword: oldPassword, // 기존 비밀번호 - newPassword: newPassword, // 새로운 비밀번호 - },{ - headers: { - Authorization: `Bearer ${localStorage.getItem("token")}`, - "Content-Type": "application/json", - apikey: "KDT5_nREmPe9B", - username: "KDT5_TeamWink", - }, - }, - ); - alert("수정완료"); + if (!displayName || !selectedImage || !oldPassword || !newPassword) { + alert("모든 필드를 입력해주세요."); + return; + } + + await InfoToken(displayName, selectedImage, oldPassword, newPassword) + alert("수정 완료"); window.location.reload(); } catch (err) { console.error("error"); @@ -42,16 +29,25 @@ function UserInfo() { } } - function uploadImage(event: Event){ - const files = (event.target as HTMLInputElement).files as FileList - for (const file of files) { - const reader = new FileReader() - reader.readAsDataURL(file) // 파일을 base64형식으로 읽음 - reader.addEventListener('load', e => { - setProfileImgBase64((e.target as FileReader).result as string) - }) + const handleImageChange = (event: React.ChangeEvent) => { + const files = event.target.files; + if (files && files.length > 0) { + const file = files[0]; + const fileSizeInBytes = file.size; + const maxSizeInBytes = 1 * 1024 * 1024; + + if (fileSizeInBytes > maxSizeInBytes) { + alert("파일 용량은 1MB를 초과할 수 없습니다."); + return; + } + + const reader = new FileReader(); + reader.onload = (e) => { + setSelectedImage(e.target?.result as string); + }; + reader.readAsDataURL(file); } - } + }; return ( <> @@ -60,8 +56,6 @@ function UserInfo() {
- -
@@ -112,31 +106,40 @@ function UserInfo() { />
-
-
프로필 이미지
-
- - +
프로필 이미지
+
+ +
+ 파일 용량은 1MB를 초과할 수 없습니다. + +
+ {selectedImage ? ( + Preview + ) : ( + 이미지 미리보기 + )}
+
-
-
- + +
+
+ +
-
diff --git a/src/Components/Views/MyPage/common/StyleCommon.scss b/src/Components/Views/MyPage/common/StyleCommon.scss index 25d5c58a..8e464144 100644 --- a/src/Components/Views/MyPage/common/StyleCommon.scss +++ b/src/Components/Views/MyPage/common/StyleCommon.scss @@ -17,7 +17,7 @@ @mixin LeftContainerStyle { width: 250px; - background-color: #F2E7D5; + background-color: rgb(227 213 197); border-radius: 10px 0px 0px 10px; } @@ -25,6 +25,6 @@ width: 1500px; border-radius: 0px 10px 10px 0px; padding-bottom: 178px; - background-color: rgb(227 213 197); + background-color: #F2E7D5; } diff --git a/src/Components/Views/MyPage/common/components/Category.scss b/src/Components/Views/MyPage/common/components/Category.scss index 42ce0785..32237999 100644 --- a/src/Components/Views/MyPage/common/components/Category.scss +++ b/src/Components/Views/MyPage/common/components/Category.scss @@ -7,7 +7,6 @@ position: relative; top:22px; height: 250px; - background-color: bisque; text-align: center; .LeftContainer-profile__Photo{ @@ -16,8 +15,6 @@ top: 30px; width: 120px; height: 120px; - // margin-left: auto; - // margin-right: auto; border: solid 1px rgb(243, 214, 172); border-radius: 50%; box-shadow: 2px 5px 5px rgb(0,0,0,.3); @@ -31,14 +28,12 @@ .LeftContainer-profile__box{ position: relative; margin-top: 2.5rem; - // color:rgb(192, 138, 138); text-align: center; - // background-color: yellow; .LeftContainer-profile__text{ padding-top: 1rem; font-size: 1.5rem; - font-weight: bold; // 1000 + font-weight: bold; } } } @@ -48,11 +43,11 @@ position: relative; height: 290px; width: 200px; - top:30px; + bottom:10px; margin: auto; .active{ - background-color: rgb(243, 214, 172); + background-color: #F9F5EB; } a { @@ -62,14 +57,13 @@ } .LeftContainer-category__order { - width: 190px; + width: 170px; margin: 0 auto; font-weight: bold; position: relative; padding: 15px; color: black; border-radius: 40px; - //border-bottom: solid 2px rgb(239, 211, 174); text-align: center; top: 20px; } @@ -81,7 +75,6 @@ position: relative; padding: 15px; color: black; - //border-bottom: solid 2px rgb(239, 211, 174); text-align: center; border-radius: 40px; top: 40px; diff --git a/src/Components/Views/MyPage/common/components/Category.tsx b/src/Components/Views/MyPage/common/components/Category.tsx index 45372db0..18261a8f 100644 --- a/src/Components/Views/MyPage/common/components/Category.tsx +++ b/src/Components/Views/MyPage/common/components/Category.tsx @@ -1,37 +1,22 @@ import './Category.scss' import { Link } from "react-router-dom"; import { useState, useEffect } from 'react'; -import axios from "axios"; +import { TokenMe } from "@/Apis/register"; interface User { - displayName: string; // 사용자 표시 이름 - profileImg: string; // 사용자 프로필 이미지 URL + displayName: string; + profileImg: string; } const Category = () => { -// 기본 프로필 이미지 URL -const defaultProfileImgUrl = "/public/images/default-profile.jpg"; +const defaultProfileImgUrl = "/images/default-profile.jpg"; const [user, setUser] = useState({ displayName: "", profileImg: defaultProfileImgUrl }); useEffect(() => { const authenticate = async () => { try { - const response = await axios.post( - "https://asia-northeast3-heropy-api.cloudfunctions.net/api/auth/me", - {}, - { - headers: { - Authorization: `Bearer ${localStorage.getItem("token")}`, - "Content-Type": "application/json", - apikey: "KDT5_nREmPe9B", - username: "KDT5_TeamWink", - }, - } - ); - const userData = response.data; - - // 사용자 정보를 업데이트하기 전에 profileImg가 존재하지 않을 경우에만 기본 프로필 이미지 URL을 사용 + const userData = await TokenMe(); setUser((prevUser) => ({ ...prevUser, displayName: userData.displayName, @@ -39,7 +24,6 @@ useEffect(() => { })); } catch (error) { console.error(error); - // 오류 처리 } }; @@ -79,7 +63,7 @@ useEffect(() => {
- 회원정보 수정 + 회원정보 수정
diff --git a/src/Components/Views/SearchPage/SearchPage.tsx b/src/Components/Views/SearchPage/SearchPage.tsx index 5c6c2838..6ea3fd22 100644 --- a/src/Components/Views/SearchPage/SearchPage.tsx +++ b/src/Components/Views/SearchPage/SearchPage.tsx @@ -13,85 +13,85 @@ const ajax = axios.create({ }, }); -// interface DetailInfo { -// detail_image: string; -// product_name: string; -// retail_price: number; -// simple_description: string; -// summary_description: string; -// product_no: string; -// price: number; -// price_excluding_tax: string; -// selling: string; -// description: string; -// rentdate: number; -// gubun: string; -// } +interface Product { + detail_image: string; + product_name: string; + retail_price: number; + simple_description: string; + summary_description: string; + product_no: string; + price: number; + price_excluding_tax: string; + selling: string; + description: string; + rentdate: number; + gubun: string; +} +interface SearchItem { + rentdate?: number; + gubun: string; + product_no: string; +} export default function SearchPage() { const navigate = useNavigate(); - const [search, setSearch] = useState([] as Products); + const [search, setSearch] = useState(); const [offset, setOffset] = useState(0); const [count, setCount] = useState(0); - const params = useParams(); + const params = useParams<{ keyword?: string }>(); async function SearchAPI(product_name: string) { try { const res = await ajax.get("/products", { params: { - product_name: product_name, - + product_name, offset: offset * 10, }, }); - - - console.log(res.data.products) - return res.data.products; - + return res.data.products as Product[]; } catch (err) { console.log(err); + return [] as Product[] } } - useEffect(() => { (async () => { - await ajax - .get("/products/count", { - params: { - product_name: params.keyword, - }, - }) - .then((res) => setCount(res.data.count)); - const result = await SearchAPI(params.keyword); - setSearch(result); - - console.log(result); - window.scrollTo(0, 0); + if (params.keyword) { + await ajax + .get("/products/count", { + params: { + product_name: params.keyword, + }, + }) + .then((res) => setCount(res.data.count)); + const result = await SearchAPI(params.keyword); + setSearch(result); + + console.log(result); + window.scrollTo(0, 0); + } })(); }, [params, offset]); - const BuyBook = (search: string, type: string) => { - console.log(search) - let Cart = JSON.parse(localStorage.getItem("cart") || "[]"); + + const BuyBook = (search: SearchItem, type: string) => { + console.log(search); + const cart: SearchItem[] = JSON.parse(localStorage.getItem("cart") || "[]"); - if (Cart.some((item) => item.product_no === search.product_no)) { + if (cart.some((item) => item.product_no === search.product_no)) { alert("이미 장바구니에 담으셨습니다."); return false; } - if (type === "rent") { - search.rentdate = 7; - } + const searchItem: SearchItem = type === "rent" ? { ...search, rentdate: 7, gubun: type } : { ...search, gubun: type }; + cart.push(searchItem); + + const updatedCart = Array.from(new Set(cart)); + localStorage.setItem("cart", JSON.stringify(updatedCart)); - search.gubun = type; - Cart.push(search); - Cart = Array.from(new Set(Cart)); - Cart = [...Cart]; - localStorage.setItem("cart", JSON.stringify(Cart)); alert("장바구니에 담겼습니다."); navigate("/cart"); }; @@ -99,54 +99,48 @@ export default function SearchPage() { return (
{search && - search.map((v) => { - return ( - <> -
-
- 책표지 -
+ search.map((item:any) => { + return ( + <> +
+
+ 책표지 +
-
-

{v.product_name}

-
-

{v.summary_description}

-

{v.product_tag}

-
-
-

{v.price.slice(0, -3)}원

-

{v.retail_price.slice(0, -3)}원

-
-
-
- - -
+
+

{item.product_name}

+
+

{item.summary_description}

+

{item.product_tag}

+
+
+

{item.price.slice(0, -3)}원

+

{item.retail_price.slice(0, -3)}원

- - ); - })} +
+
+ + +
+
+ + ); + })}
-
    { +
      { if (e.target instanceof HTMLLIElement) { - setOffset(e.target.value); - } - }} - > + setOffset(e.target.value);} + }}> {Array(parseInt(((count - 0.1) / 10 + 1).toString())) .fill(0) - .map((i, index) => ( + .map((index) => (
    • diff --git a/src/bookcustom/bookcustom.scss b/src/bookcustom/bookcustom.scss index 08cd496a..ad459a4d 100644 --- a/src/bookcustom/bookcustom.scss +++ b/src/bookcustom/bookcustom.scss @@ -49,18 +49,6 @@ position: relative; } - // .open-book:before { - // background-color: #8B4513; - // border-radius: 0.25em; - // bottom: -1em; - // content: ''; - // left: -1em; - // position: absolute; - // right: -1em; - // top: -1em; - // z-index: -1; - // } - .open-book:after { background: linear-gradient(to right, transparent 0%,rgba(0,0,0,0.2) 46%,rgba(0,0,0,0.5) 49%,rgba(0,0,0,0.6) 50%,rgba(0,0,0,0.5) 51%,rgba(0,0,0,0.2) 52%,transparent 100%); bottom: 0.5em; diff --git a/src/main.tsx b/src/main.tsx index 95644085..ae30bed5 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -1,15 +1,42 @@ -import React from "react"; import ReactDOM from "react-dom/client"; import App from "./App"; +import axios from 'axios'; import "./index.scss"; -//import ReduxThunk from 'redux-thunk'; -// import thunk from 'redux-thunk'; -// import { createStore, applyMiddleware } from 'redux'; -// import reducer from '_reducers/user_reducer.tsx'; +const token = localStorage.getItem("token"); -//const createStoreWithMiddleware = applyMiddleware(promiseMiddleware, ReduxThunk)(createStore); -//const store = createStore(reducer, applyMiddleware(thunk)); +// 토큰을 저장하는 함수 +const saveTokenToLocalStorage = (token:string) => { + localStorage.setItem("token", token); +}; + +// 토큰을 제거하는 함수 +const removeTokenFromLocalStorage = () => { + localStorage.removeItem("token"); +}; + +if (token) { + saveTokenToLocalStorage(token); +} else { + removeTokenFromLocalStorage(); +} + +// 토큰 갱신 인터셉터 +axios.interceptors.response.use( + response => { + // 응답 처리 + return response; + }, + error => { + if (error.response.status === 401) { + console.log("401 에러 발생: 토큰 제거하지 않음"); + alert("401 에러 발생"); + // 401 에러 발생 시 토큰을 제거하는 로직 추가 + removeTokenFromLocalStorage(); + } + return Promise.reject(error); + } +); ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render( diff --git a/src/routes/privateRoute.tsx b/src/routes/privateRoute.tsx index 9730da17..92a2a92e 100644 --- a/src/routes/privateRoute.tsx +++ b/src/routes/privateRoute.tsx @@ -1,7 +1,11 @@ import { Navigate } from 'react-router-dom'; +interface PrivatePageProps { + component: any; + status: string; +} -function PrivatePage({component:Component, status:Status}) { +function PrivatePage({component:Component, status:Status}: PrivatePageProps) { const token = localStorage.getItem("token") @@ -12,11 +16,19 @@ function PrivatePage({component:Component, status:Status}) { tokenCheck = true; } + if(tokenCheck){ result = Component; } else { - !Status ? result = : result = Status; + if (!Status) { + alert("접근할수 없는 페이지 입니다"); + result = ; + } else { + result = Status; + } } return result; } -export default PrivatePage \ No newline at end of file +export default PrivatePage + + From 502a9686e3cbc62a19decc393458ce6b15de345c Mon Sep 17 00:00:00 2001 From: hahahaday12 Date: Fri, 30 Jun 2023 23:03:04 +0900 Subject: [PATCH 61/75] =?UTF-8?q?fix:=20=ED=99=98=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/.env b/.env index d768f6b9..f0441eb9 100644 --- a/.env +++ b/.env @@ -4,4 +4,11 @@ VITE_ACCESS_TOKEN=blFKQmd4UHBIRk5sRUFHZko5bW8xQjpmcUhuMUU4blFTeGU2c21nZkpVVWNS VITE_CLIENT_ID=nQJBgxPpHFNlEAGfJ9mo1B VITE_REDIRECT_URI=https://teamwink.com:5173/ -VITE_API_VERSION=2023-03-01 \ No newline at end of file +VITE_API_VERSION=2023-03-01 + +VITE_IMP_KEY=5758023681388354 +VITE_IMP_SECRET=tCdwGmiflqhMA3It54n6aLBIeA7LCg0O3WYu5qI1SKpwQ85FKXtJsiHu8yUWTynhDx7fxCFY1wsA3KVc +VITE_IMP_OWNER=imp36252452 + +VITE_KDT5_API=KDT5_nREmPe9B +VITE_KDT5_USER=KDT5_TeamWink \ No newline at end of file From 4753562f3cebf7fa35400c641d39ce6907c1b9c5 Mon Sep 17 00:00:00 2001 From: saeyeon Date: Fri, 30 Jun 2023 23:03:18 +0900 Subject: [PATCH 62/75] fix: searchpage-css --- package-lock.json | 15 + package.json | 1 + src/App.scss | 8 +- src/Common/Form/Login/login.tsx | 17 +- src/Common/Form/Signin/join.tsx | 63 ++-- src/Common/Layout/Header/header.tsx | 30 +- src/Components/Views/CartPage/CartPage.tsx | 190 +++++----- .../Views/CartPage/Payment/Payment.tsx | 45 ++- .../Views/DetailPage/DetailPage.tsx | 46 +-- src/Components/Views/MyPage/MyPage.tsx | 339 ++++++++++-------- src/Components/Views/MyPage/UserInfo.tsx | 162 +++++---- .../Views/SearchPage/SearchPage.scss | 93 +++-- .../Views/SearchPage/SearchPage.tsx | 158 ++++---- src/main.tsx | 41 ++- 14 files changed, 696 insertions(+), 512 deletions(-) diff --git a/package-lock.json b/package-lock.json index d0186ad0..65cb1881 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27,6 +27,7 @@ "redux-promise": "^0.6.0", "redux-thunk": "^2.4.2", "sass": "^1.62.1", + "sweetalert2": "^11.7.12", "use-history": "^1.4.1", "vite-plugin-mkcert": "^1.15.0", "vite-plugin-sass-dts": "^1.3.5" @@ -3738,6 +3739,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/sweetalert2": { + "version": "11.7.12", + "resolved": "https://registry.npmjs.org/sweetalert2/-/sweetalert2-11.7.12.tgz", + "integrity": "sha512-TQJy8mQymJLzqWPQOMQErd81Zd/rSYr0UL4pEc7bqEihtjS+zt7LWJXLhfPp93e+Hf3Z2FHMB6QGNskAMCsdTg==", + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/limonte" + } + }, "node_modules/symbol-observable": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", @@ -6470,6 +6480,11 @@ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" }, + "sweetalert2": { + "version": "11.7.12", + "resolved": "https://registry.npmjs.org/sweetalert2/-/sweetalert2-11.7.12.tgz", + "integrity": "sha512-TQJy8mQymJLzqWPQOMQErd81Zd/rSYr0UL4pEc7bqEihtjS+zt7LWJXLhfPp93e+Hf3Z2FHMB6QGNskAMCsdTg==" + }, "symbol-observable": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", diff --git a/package.json b/package.json index fe7fb0ba..ced14204 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,7 @@ "redux-promise": "^0.6.0", "redux-thunk": "^2.4.2", "sass": "^1.62.1", + "sweetalert2": "^11.7.12", "use-history": "^1.4.1", "vite-plugin-mkcert": "^1.15.0", "vite-plugin-sass-dts": "^1.3.5" diff --git a/src/App.scss b/src/App.scss index 9af29d03..c55d2909 100644 --- a/src/App.scss +++ b/src/App.scss @@ -7,7 +7,7 @@ body { margin: 0; background-color: #f8ede3; - font-family: 'SUITE-Regular'; + font-family: "SUITE-Regular"; width: 100%; // padding: 0 20px; } @@ -17,9 +17,9 @@ a { } @font-face { - font-family: 'SUITE-Regular'; - src: url('https://cdn.jsdelivr.net/gh/projectnoonnu/noonfonts_2304-2@1.0/SUITE-Regular.woff2') - format('woff2'); + font-family: "SUITE-Regular"; + src: url("https://cdn.jsdelivr.net/gh/projectnoonnu/noonfonts_2304-2@1.0/SUITE-Regular.woff2") + format("woff2"); font-weight: 400; font-style: normal; } diff --git a/src/Common/Form/Login/login.tsx b/src/Common/Form/Login/login.tsx index 1486bf55..af1ddd3c 100644 --- a/src/Common/Form/Login/login.tsx +++ b/src/Common/Form/Login/login.tsx @@ -2,12 +2,12 @@ import "./login.scss"; import { useNavigate, Link } from "react-router-dom"; import { FormEvent, useState, ChangeEvent } from "react"; import { LoginForm } from "@/Apis/register"; +import Swal from "sweetalert2"; function Login() { const navigate = useNavigate(); const [email, setEmail] = useState(""); const [password, setPassword] = useState(""); - const onChangeEmail = (e: ChangeEvent) => { setEmail(e.target.value); @@ -21,12 +21,12 @@ function Login() { event.preventDefault(); if (email === undefined || email === "" || email === null) { - alert("이메일을 입력해주세요."); + Swal.fire("이메일을 입력해주세요!", "", "warning"); return false; } if (password === undefined || password === "" || password === null) { - alert("비밀번호를 입력해주세요."); + Swal.fire("비밀번호를 입력해주세요!", "", "warning"); return false; } @@ -35,16 +35,14 @@ function Login() { console.log(data); if (data.accessToken) { - alert("로그인 되었습니다!"); window.localStorage.setItem("token", data.accessToken); - //window.location.reload(); - navigate("/"); - } else { - alert("로그인에 실패하였습니다. 다시 시도해주세요."); + Swal.fire("로그인 되었습니다!", "반갑습니다:)", "success").then(() => { + navigate("/"); + }); } } catch (error) { console.error(error); - alert("오류가 발생했습니다. 다시 시도해주세요."); + Swal.fire("로그인에 실패하였습니다:(", "다시 시도해주세요!", "error"); } } @@ -100,7 +98,6 @@ function Login() {

      회원가입 하러 가기!

-
); diff --git a/src/Common/Form/Signin/join.tsx b/src/Common/Form/Signin/join.tsx index 4eb1908b..9d011f02 100644 --- a/src/Common/Form/Signin/join.tsx +++ b/src/Common/Form/Signin/join.tsx @@ -3,6 +3,7 @@ import { useNavigate } from "react-router-dom"; import { PwCheck, emailCheck } from "../Validation "; import { JoinForm } from "@/Apis/register"; import "./join.scss"; +import Swal from "sweetalert2"; function Join() { const navigate = useNavigate(); @@ -23,7 +24,7 @@ function Join() { //오류 메세지 저장 const [nameMessage, setNameMessage] = useState(""); - const [emailMessage, setEmailMessage] = useState(""); + const [emailMessage, setEmailMessage] = useState(""); const [passwordMessage, setPasswordMessage] = useState(""); const [passwordConfirmMessage, setPasswordConfirmMessage] = useState(""); @@ -98,28 +99,27 @@ function Join() { [password] ); - const UploadImage = (event: React.ChangeEvent) => { + const UploadImage = (event: React.ChangeEvent) => { const file = (event.target as HTMLInputElement).files?.[0]; if (!file) { return; } const reader = new FileReader(); - + reader.onloadend = () => { const base64Data = reader.result as string; setProfileImgBase64(base64Data); }; - + if (file) { reader.readAsDataURL(file); } - } - + }; async function signUp(event: FormEvent) { event.preventDefault(); if (email === undefined || email === "" || email === null) { - alert("이메일 입력해주세요."); + Swal.fire("이메일을 입력해주세요!", "", "warning"); return false; } @@ -128,22 +128,29 @@ function Join() { isPassword === false || isPasswordConfirm === false ) { - alert("값이 잘못 되었습니다. 다시 입력해주세요"); + Swal.fire("값이 잘못 되었습니다.", "다시 입력해주세요", "warning"); return false; } - try { - const res = await JoinForm(email, displayName, password,profileImgBase64 ); + const res = await JoinForm( + email, + displayName, + password, + profileImgBase64 + ); if (res.accessToken) { - alert("가입되었습니다."); - navigate("/login"); + Swal.fire("가입되었습니다!", "찾아주셔서 감사합니다:)", "success").then( + () => { + navigate("/login"); + } + ); } else { - alert("가입에 실패했습니다. 다시 시도해주세요."); + Swal.fire("가입에 실패했습니다.", "다시 시도해주세요", "error"); } } catch (error) { - alert("시스템 오류입니다. 문의해주세요."); + Swal.fire("시스템 오류입니다:(", "문의해주세요.", "warning"); } } @@ -220,26 +227,28 @@ function Join() { )}
-
-
- 프로필 이미지 고르기🍒 - -
+
+
+ 프로필 이미지 고르기🍒 +
+
diff --git a/src/Common/Layout/Header/header.tsx b/src/Common/Layout/Header/header.tsx index 0faa9270..d003971a 100644 --- a/src/Common/Layout/Header/header.tsx +++ b/src/Common/Layout/Header/header.tsx @@ -5,6 +5,7 @@ import { ChangeEvent } from "react"; import "./headers.scss"; import { LogoutForm } from "@/Apis/register"; import { getList } from "@/Apis/productApi"; +import Swal from "sweetalert2"; interface User { displayName: string; // 사용자 표시 이름 @@ -33,19 +34,11 @@ function Header() { setShowInputButton(e.target.value.trim() !== ""); }; - const handleInputButtonClick = () => { - if (keyword === "") { - alert("검색어를 입력해주세요"); - } else { - onSubmit(); - } - }; - const logoutHandler = () => { LogoutForm() .then(() => { localStorage.removeItem("token"); - alert("로그아웃 되셨습니다"); + Swal.fire("로그아웃 되었습니다!", "다음에 또 만나요!", "success"); navigate("/"); }) .catch((error: string) => { @@ -55,6 +48,7 @@ function Header() { const onSubmit = async () => { navigate("/search/" + keyword); + setShowInputButton(false); }; const token = localStorage.getItem("token"); @@ -92,9 +86,18 @@ function Header() { }, [token]); const OnKeyPress = (e: any) => { + if (e.key === "Enter") { + if (keyword === "") { + Swal.fire("검색어를 입력해주세요!", "", "warning"); + } else { + onSubmit(); // Enter 입력이 되면 클릭 이벤트 실행 + } + } + }; + const handleInputButtonClick = () => { if (keyword === "") { - alert("검색어를 입력해주세요"); - } else if (e.key === "Enter") { + Swal.fire("검색어를 입력해주세요!", "", "warning"); + } else { onSubmit(); } }; @@ -115,7 +118,7 @@ function Header() { limit: 100, }; const data = await getList(cate); - console.log(data); + // console.log(data); setProductInfo(data); } @@ -138,6 +141,9 @@ function Header() { placeholder="검색" onChange={handleInputChange} onKeyPress={OnKeyPress} + onBlur={() => { + setShowInputButton(false); + }} /> { calculateTotal(); }, [selectedItem]); @@ -41,36 +42,53 @@ function CartPage() { // return updatedCheckedItems; // }; - const checkOne = (event: React.ChangeEvent, buyItem: any[], gubun: string) => { + const checkOne = ( + event: React.ChangeEvent, + buyItem: any[], + gubun: string + ) => { const checkedValue = event.target.checked; const filteredItems = buyItem.filter((item) => item.gubun === gubun); - if(checkedValue) { + if (checkedValue) { const combinedItems = new Set([...selectedItem, ...filteredItems]); setSelectedItem(Array.from(combinedItems)); } else { - const remainingItems = selectedItem.filter(item => !filteredItems.some(filteredItem => filteredItem.product_no === item.product_no)); + const remainingItems = selectedItem.filter( + (item) => + !filteredItems.some( + (filteredItem) => filteredItem.product_no === item.product_no + ) + ); setSelectedItem(remainingItems); } // Reset filteredItems indices if unchecked - const updatedCheckedItems = checkedValue ? filteredItems.map((_, index) => index) : []; - + const updatedCheckedItems = checkedValue + ? filteredItems.map((_, index) => index) + : []; + return updatedCheckedItems; }; - const checkTwo = (event: React.ChangeEvent, checkedItems:number[], el:any) => { + const checkTwo = ( + event: React.ChangeEvent, + checkedItems: number[], + el: any + ) => { const itemId = parseInt(event.target.name); - let updatedCheckedItems: number[] = []; - let updatedItems: any[] = []; - if (event.target.checked) { - updatedCheckedItems = [...checkedItems, itemId]; - updatedItems = [...selectedItem, el]; - } else { - updatedCheckedItems = checkedItems.filter((id) => id !== itemId); - updatedItems = selectedItem.filter((item) => item.product_no !== el.product_no); - } - setSelectedItem(updatedItems); - return updatedCheckedItems; + let updatedCheckedItems: number[] = []; + let updatedItems: any[] = []; + if (event.target.checked) { + updatedCheckedItems = [...checkedItems, itemId]; + updatedItems = [...selectedItem, el]; + } else { + updatedCheckedItems = checkedItems.filter((id) => id !== itemId); + updatedItems = selectedItem.filter( + (item) => item.product_no !== el.product_no + ); + } + setSelectedItem(updatedItems); + return updatedCheckedItems; }; const calculateTotal = () => { @@ -84,7 +102,7 @@ function CartPage() { total += itemPrice; } }); - }else{ + } else { total = 0; } setTotal(total); @@ -93,84 +111,96 @@ function CartPage() { const RemoveBuyItem = (key: any) => { console.log(key); - const confirmation = window.confirm("삭제하시겠습니까?"); - if (confirmation) { - // const updatedCartData = JSON.parse(localStorage.getItem("cart")); - // const datalist = JSON.stringify( - // updatedCartData.filter((item) => item.product_no !== key) - // ) - const cartDataString = localStorage.getItem("cart"); - - if (cartDataString !== null) { - const updatedCartData: BuyItem[] = JSON.parse(cartDataString); - const datalist = JSON.stringify( updatedCartData.filter((item) => item.product_no !== key)) - localStorage.setItem("cart",datalist); - setbuyItem(JSON.parse(datalist)); - alert("삭제되었습니다."); + Swal.fire({ + title: "정말 삭제하시겠습니까?", + text: "", + icon: "warning", + showCancelButton: true, + confirmButtonColor: "#df307f", + cancelButtonColor: "#e24457", + confirmButtonText: "네", + cancelButtonText: "아니오", + }).then((result) => { + if (result.isConfirmed) { + const cartDataString = localStorage.getItem("cart"); + + if (cartDataString !== null) { + const updatedCartData: BuyItem[] = JSON.parse(cartDataString); + const datalist = JSON.stringify( + updatedCartData.filter((item) => item.product_no !== key) + ); + localStorage.setItem("cart", datalist); + setbuyItem(JSON.parse(datalist)); + Swal.fire("삭제되었습니다!", "", "success"); + } else { + console.log("cart data not found"); + } } else { - console.log("cart data not found"); + Swal.fire("취소되었습니다!!", "", "success"); } - } else { - alert("취소되었습니다."); - } + }); }; return ( <>
{/*
*/} - 구매 -
- -
- 대여 -
- -
+ 구매 +
+ +
+ 대여 +
+ +
- 결제 -
-
-
-
- 총 상품 가격 - {ShowTotal &&

${Total}원

} -
+ 결제 +
+
+
+
+ 총 상품 가격 + {ShowTotal &&

${Total}원

}
+
-
-
- 총 결제 예상 금액 - ${Total} -
+
+
+ 총 결제 예상 금액 + ${Total}
+
-
- {/* */} - -
+
+ {/* */} +
+
{/*
*/}
); } -export default CartPage; \ No newline at end of file +export default CartPage; diff --git a/src/Components/Views/CartPage/Payment/Payment.tsx b/src/Components/Views/CartPage/Payment/Payment.tsx index 1c16e24d..c2928834 100644 --- a/src/Components/Views/CartPage/Payment/Payment.tsx +++ b/src/Components/Views/CartPage/Payment/Payment.tsx @@ -1,4 +1,6 @@ import { useEffect } from "react"; +import { useNavigate } from "react-router-dom"; +import Swal from "sweetalert2"; interface PaymentInfo { amount: number; @@ -19,6 +21,7 @@ interface BuyItem { const Payment = ({ amount, productlists, setdatalist }: PaymentInfo) => { const orderNumber = `mid_${new Date().getTime()}`; console.log(orderNumber); + const navigate = useNavigate(); useEffect(() => { const jquery = document.createElement("script"); @@ -35,8 +38,9 @@ const Payment = ({ amount, productlists, setdatalist }: PaymentInfo) => { const onClickPayment = () => { console.log(productlists); - const itemName = productlists.map((obj: { product_name: any; }) => obj.product_name).join(","); - + const itemName = productlists + .map((obj: { product_name: any }) => obj.product_name) + .join(","); console.log(itemName); const IMP = (window as any).IMP; @@ -45,40 +49,49 @@ const Payment = ({ amount, productlists, setdatalist }: PaymentInfo) => { const data = { pg: "html5_inicis", // PG사 html5_inicis: KG이니시스, kakaopay: 카카오페이, naverpay: 네이버페이, payco: 페이코 pay_method: "card", // 결제수단 - merchant_uid: orderNumber, + merchant_uid: orderNumber, amount: amount, // 결제금액 name: `${itemName}`, // 주문명 buyer_name: "", // 구매자 이름 - buyer_email: "", - - custom_data:productlists + buyer_email: "", + custom_data: productlists, }; IMP.request_pay(data, callback); }; - function callback(response: any) { const { success, error_msg } = response; if (success) { - alert("결제 성공"); - const mypayarray: string | null = window.localStorage.getItem("mypayment"); - const combinedArray: string[] | null = mypayarray ? JSON.parse(mypayarray) : null; + Swal.fire("결제 성공!", "", "success").then(() => { + navigate("/mypage"); + }); + const mypayarray: string | null = + window.localStorage.getItem("mypayment"); + const combinedArray: string[] | null = mypayarray + ? JSON.parse(mypayarray) + : null; if (!combinedArray) { window.localStorage.setItem("mypayment", JSON.stringify([orderNumber])); } else { combinedArray.push(orderNumber); window.localStorage.setItem("mypayment", JSON.stringify(combinedArray)); } - - const productItemlist = productlists.map((obj: { product_no: any; }) => obj.product_no).join(","); - const cartlist: BuyItem[] = JSON.parse(window.localStorage.getItem("cart") || "[]"); - - const updatedArray = cartlist.filter((item) => !productItemlist.includes(item.product_no)); + + const productItemlist = productlists + .map((obj: { product_no: any }) => obj.product_no) + .join(","); + const cartlist: BuyItem[] = JSON.parse( + window.localStorage.getItem("cart") || "[]" + ); + + const updatedArray = cartlist.filter( + (item) => !productItemlist.includes(item.product_no) + ); window.localStorage.setItem("cart", JSON.stringify(updatedArray)); setdatalist(updatedArray); } else { - alert(`결제 실패: ${error_msg}`); + Swal.fire(`결제 실패: ${error_msg}`, "", "error"); } } return ( diff --git a/src/Components/Views/DetailPage/DetailPage.tsx b/src/Components/Views/DetailPage/DetailPage.tsx index d6a3558a..48d12a5b 100644 --- a/src/Components/Views/DetailPage/DetailPage.tsx +++ b/src/Components/Views/DetailPage/DetailPage.tsx @@ -5,6 +5,7 @@ import TopHeader from "./components/TopHeader"; import { getDetail } from "@/Apis/productApi"; import { ChangeEvent } from "react"; import "./DetailPage.scss"; +import Swal from "sweetalert2"; function DetailPage() { interface DetailInfo { @@ -31,7 +32,7 @@ function DetailPage() { try { const data = await getDetail(productNo as string); setDetail(data.product); - console.log(data.product) + console.log(data.product); } catch (err) { console.log(err); } @@ -67,25 +68,31 @@ function DetailPage() { })(); }, []); - const BuyBook = (detail: DetailInfo, type: string) => { - let Cart: DetailInfo[] = JSON.parse(localStorage.getItem("cart") || "[]"); - - - if (Cart.some((item) => item.product_no === detail.product_no)) { - alert("이미 장바구니에 담으셨습니다."); - return false; - } + let token = localStorage.getItem("token"); - if (type === "rent") { - detail.rentdate = 7; + const BuyBook = (detail: DetailInfo, type: string) => { + let Cart: DetailInfo[] = JSON.parse(localStorage.getItem("cart") || "[]"); + if (token) { + if (Cart.some((item) => item.product_no === detail.product_no)) { + Swal.fire("이미 장바구니에 담으셨습니다!", "", "warning"); + return false; + } + + if (type === "rent") { + detail.rentdate = 7; + } + detail.gubun = type; + Cart.push(detail); + Cart = Array.from(new Set(Cart)); + Cart = [...Cart]; + localStorage.setItem("cart", JSON.stringify(Cart)); + Swal.fire("장바구니에 담겼습니다!", "", "success"); + navigate("/cart"); + } else { + Swal.fire("로그인 후 이용해주세요!", "", "warning").then(() => { + navigate("/login"); + }); } - detail.gubun = type; - Cart.push(detail); - Cart = Array.from(new Set(Cart)); - Cart = [...Cart]; - localStorage.setItem("cart", JSON.stringify(Cart)); - alert("장바구니에 담겼습니다."); - navigate("/cart"); }; // html 안에 a 링크 이벤트를 막기 위한 함수 @@ -192,8 +199,7 @@ function DetailPage() { className="InnerContent" dangerouslySetInnerHTML={{ __html: modifiedDescription }} onClick={disableLinkClick} - > -
+ >
); diff --git a/src/Components/Views/MyPage/MyPage.tsx b/src/Components/Views/MyPage/MyPage.tsx index cc1e3751..d52acdca 100644 --- a/src/Components/Views/MyPage/MyPage.tsx +++ b/src/Components/Views/MyPage/MyPage.tsx @@ -1,13 +1,13 @@ import { useState, useEffect } from "react"; -import axios,{ AxiosResponse } from "axios"; +import axios, { AxiosResponse } from "axios"; import Category from "./common/components/Category"; import "./MyPage.scss"; +import Swal from "sweetalert2"; interface PaymentItem { merchant_uid: string; - custom_data:string; + custom_data: string; paid_at: string; - } interface PaymentsResponse { @@ -26,213 +26,246 @@ interface PageData { small_image: string; product_name: string; price: number; - custom_data:string; + custom_data: string; paid_at: string; } function MyPage() { - const TopCategory: CategoryMap = { - orderId:'주문번호', - orderDate:'주문날짜', - productname:'상품이름', - price:'상품가격', - cancel:'구매취소' + orderId: "주문번호", + orderDate: "주문날짜", + productname: "상품이름", + price: "상품가격", + cancel: "구매취소", } as const; -const [itemList, setItemList] = useState([]); -const [mydataList, setMydataList] = useState([]); - -const GetToken = async () => { - try{ - const response = await axios.post('/iamport/users/getToken', - { - imp_key: '5758023681388354', - imp_secret: 'tCdwGmiflqhMA3It54n6aLBIeA7LCg0O3WYu5qI1SKpwQ85FKXtJsiHu8yUWTynhDx7fxCFY1wsA3KVc', - }, - { - headers: { 'Content-Type': 'application/json' }, - } - ); - const accessToken = response.data.response.access_token; - return accessToken; - } catch (error) { - console.log(error); - throw error; - } -} + const [itemList, setItemList] = useState([]); + const [mydataList, setMydataList] = useState([]); + const GetToken = async () => { + try { + const response = await axios.post( + "/iamport/users/getToken", + { + imp_key: "5758023681388354", + imp_secret: + "tCdwGmiflqhMA3It54n6aLBIeA7LCg0O3WYu5qI1SKpwQ85FKXtJsiHu8yUWTynhDx7fxCFY1wsA3KVc", + }, + { + headers: { "Content-Type": "application/json" }, + } + ); + const accessToken = response.data.response.access_token; + return accessToken; + } catch (error) { + console.log(error); + throw error; + } + }; -const fetchData = async (): Promise => { - try { - const paynumber: string | null = window.localStorage.getItem('mypayment'); + const fetchData = async (): Promise => { + try { + const paynumber: string | null = window.localStorage.getItem("mypayment"); - if (paynumber) { - const merchantUids = JSON.parse(paynumber); - const accessToken = await GetToken(); - const paymentsResponse: AxiosResponse = await axios.get( - `/iamport/payments/status/paid?limit=20&sorting=paid&_token=${accessToken}` - ); + if (paynumber) { + const merchantUids = JSON.parse(paynumber); + const accessToken = await GetToken(); + const paymentsResponse: AxiosResponse = + await axios.get( + `/iamport/payments/status/paid?limit=20&sorting=paid&_token=${accessToken}` + ); - if (paymentsResponse.data && paymentsResponse.data.response && paymentsResponse.data.response.list) { - const filteredList: PaymentItem[] = paymentsResponse.data.response.list.filter((item) => - merchantUids.includes(item.merchant_uid) - ); - if(filteredList){ - setItemList(filteredList); - }else{ + if ( + paymentsResponse.data && + paymentsResponse.data.response && + paymentsResponse.data.response.list + ) { + const filteredList: PaymentItem[] = + paymentsResponse.data.response.list.filter((item) => + merchantUids.includes(item.merchant_uid) + ); + if (filteredList) { + setItemList(filteredList); + } else { + setItemList([]); + } + } else { + console.log("Invalid response format"); setItemList([]); } - } else { - console.log('Invalid response format'); - setItemList([]); } + } catch (error) { + console.log("Error occurred:", error); } - } catch (error) { - console.log('Error occurred:', error); - } -}; - -useEffect(() => { - fetchData(); -}, []); - -useEffect(() => { - setMydataList([]); - if (itemList.length === 0) { - return; - } - const useData = itemList.filter((item) => item.custom_data); - useData.forEach((item) => { - if (item.custom_data) { - let parsedData: PageData[] = JSON.parse(item.custom_data); - parsedData = parsedData.map((data) => ({ - ...data, - paid_at: item.paid_at, - merchant_uid: item.merchant_uid, - // Add more properties as needed - })); - setMydataList((prevDataList) => [...prevDataList, ...parsedData]); + }; + + useEffect(() => { + fetchData(); + }, []); + + useEffect(() => { + setMydataList([]); + if (itemList.length === 0) { + return; } - }); -}, [itemList]); - - -const DeleteList = (itemnum: string) => { - const MyPay = localStorage.getItem("mypayment"); - - if (MyPay && MyPay.includes(itemnum)) { - const updatedList = MyPay.replace(itemnum, "").trim(); - localStorage.setItem("mypayment", updatedList); - } - fetchData(); -} + const useData = itemList.filter((item) => item.custom_data); + useData.forEach((item) => { + if (item.custom_data) { + let parsedData: PageData[] = JSON.parse(item.custom_data); + parsedData = parsedData.map((data) => ({ + ...data, + paid_at: item.paid_at, + merchant_uid: item.merchant_uid, + // Add more properties as needed + })); + setMydataList((prevDataList) => [...prevDataList, ...parsedData]); + } + }); + }, [itemList]); -const onClickDelete = async (key:string) => { - - if(confirm("주문을 취소 하시겠습니까?")){ - const accessToken = await GetToken(); - const data = { - merchant_uid : key - } - await axios.post( - `/iamport/payments/cancel?_token=${accessToken}`, data) - .then((res) => { - if(res.status == 200){ - alert("주문이 취소 되었습니다"); - DeleteList(key); - } else { - console.log(res.status) + const DeleteList = (itemnum: string) => { + const MyPay = localStorage.getItem("mypayment"); + + if (MyPay && MyPay.includes(itemnum)) { + const updatedList = MyPay.replace(itemnum, "").trim(); + localStorage.setItem("mypayment", updatedList); + } + fetchData(); + }; + // Swal.fire( + // 'Deleted!', + // 'Your file has been deleted.', + // 'success' + // ) + + const onClickDelete = (key: string) => { + Swal.fire({ + title: "정말 환불하시겠습니까?", + text: "돌이킬 수 없습니다:(", + icon: "warning", + showCancelButton: true, + confirmButtonColor: "#df307f", + cancelButtonColor: "#e24457", + confirmButtonText: "네", + cancelButtonText: "아니오", + }).then(async (result) => { + if (result.isConfirmed) { + const accessToken = await GetToken(); + const data = { + merchant_uid: key, + }; + await axios + .post(`/iamport/payments/cancel?_token=${accessToken}`, data) + .then((res) => { + if (res.status == 200) { + Swal.fire("주문이 취소되었습니다!", "", "success"); + DeleteList(key); + } else { + console.log(res.status); + } + }); } }); - } else { - alert("취소되었습니다.") - } -}; + // if (confirm("주문을 취소 하시겠습니까?")) { + // } else { + // Swal.fire("요청이 취소되었습니다!", "", "success"); + // } + }; -const getDate = function(param:any){ - const date = new Date(param * 1000); - const koreaTime = date.toLocaleString("ko-KR", { + const getDate = function (param: any) { + const date = new Date(param * 1000); + const koreaTime = date.toLocaleString("ko-KR", { timeZone: "Asia/Seoul", year: "numeric", month: "2-digit", day: "2-digit", }); - return koreaTime; -} + return koreaTime; + }; return ( <>
- +
구매 내역
- {Object.keys(TopCategory).map(key => { - return + {Object.keys(TopCategory).map((key) => { + return ( + {TopCategory[key]} - })} + ); + })}
{mydataList - .filter((el: PageData) => el.gubun === 'buy') - .map((item: PageData, index: number) => ( - -
- {item.merchant_uid.replace("mid_","")} + .filter((el: PageData) => el.gubun === "buy") + .map((item: PageData, index: number) => ( +
+ {item.merchant_uid.replace("mid_", "")} {getDate(item.paid_at)} -
- 책이미지 - {item.product_name} -
- {item.price} +
+ 책이미지 + + {item.product_name} + +
+ {item.price}
- +
-
- - ))} +
+ ))}
대여 내역
-
-
- {Object.keys(TopCategory).map(key => { - return +
+
+ {Object.keys(TopCategory).map((key) => { + return ( + {TopCategory[key]} - })} -
-
+ ); + })} +
+
{mydataList - .filter((el: PageData) => el.gubun === 'rent') - .map((item: PageData, index: number) => ( - -
- {item.merchant_uid.replace("mid_","")} + .filter((el: PageData) => el.gubun === "rent") + .map((item: PageData, index: number) => ( +
+ {item.merchant_uid.replace("mid_", "")} {getDate(item.paid_at)} -
- 책이미지 - {item.product_name} -
- {item.price} +
+ 책이미지 + + {item.product_name} + +
+ {item.price}
- +
-
- - ))} -
+
+ ))}
- +
diff --git a/src/Components/Views/MyPage/UserInfo.tsx b/src/Components/Views/MyPage/UserInfo.tsx index 8abd1ecf..7c6d230c 100644 --- a/src/Components/Views/MyPage/UserInfo.tsx +++ b/src/Components/Views/MyPage/UserInfo.tsx @@ -1,9 +1,16 @@ -import { FormEvent, useState, useEffect, ChangeEvent, useCallback, useRef } from "react"; +import { + FormEvent, + useState, + useEffect, + ChangeEvent, + useCallback, + useRef, +} from "react"; import axios from "axios"; import { Link, useNavigate } from "react-router-dom"; import "./UserInfo.scss"; import Category from "./common/components/Category"; - +import Swal from "sweetalert2"; function UserInfo() { const navigate = useNavigate(); @@ -15,41 +22,43 @@ function UserInfo() { const [oldPassword, setOldPassword] = useState(""); const [newPassword, setNewPassword] = useState(""); - async function submit(e: any) { e.preventDefault(); try { - const res = await axios.put("https://asia-northeast3-heropy-api.cloudfunctions.net/api/auth/user", { + const res = await axios.put( + "https://asia-northeast3-heropy-api.cloudfunctions.net/api/auth/user", + { displayName: displayName, // 새로운 표시 이름 profileImgBase64: profileImgBase64, // 사용자 프로필 이미지(base64) - jpg, jpeg, webp, png, gif, svg oldPassword: oldPassword, // 기존 비밀번호 newPassword: newPassword, // 새로운 비밀번호 - },{ + }, + { headers: { Authorization: `Bearer ${localStorage.getItem("token")}`, "Content-Type": "application/json", apikey: "KDT5_nREmPe9B", username: "KDT5_TeamWink", }, - }, + } ); - alert("수정완료"); + Swal.fire("수정 완료!", "", "success"); window.location.reload(); } catch (err) { console.error("error"); - alert("수정 실패"); - window.location.reload(); + Swal.fire("수정 실패!", "", "error"); + window.location.reload(); } } - function uploadImage(event: Event){ - const files = (event.target as HTMLInputElement).files as FileList + function uploadImage(event: Event) { + const files = (event.target as HTMLInputElement).files as FileList; for (const file of files) { - const reader = new FileReader() - reader.readAsDataURL(file) // 파일을 base64형식으로 읽음 - reader.addEventListener('load', e => { - setProfileImgBase64((e.target as FileReader).result as string) - }) + const reader = new FileReader(); + reader.readAsDataURL(file); // 파일을 base64형식으로 읽음 + reader.addEventListener("load", (e) => { + setProfileImgBase64((e.target as FileReader).result as string); + }); } } @@ -58,12 +67,11 @@ function UserInfo() {
- +
-
-
+
회원정보 수정
@@ -71,69 +79,68 @@ function UserInfo() {
-
기존 비밀번호
-
- setOldPassword(e.target.value)} - required - /> -
+
기존 비밀번호
+
+ setOldPassword(e.target.value)} + required + />
-
-
새 비밀번호
-
- setNewPassword(e.target.value)} - required - /> -
+
+
+
새 비밀번호
+
+ setNewPassword(e.target.value)} + required + />
-
-
닉네임 변경
-
- setDisplayName(e.target.value)} - required - /> -
+
+
+
닉네임 변경
+
+ setDisplayName(e.target.value)} + required + />
-
-
프로필 이미지
-
- - -
+
+
+
프로필 이미지
+
+ +
+
-
@@ -142,10 +149,7 @@ function UserInfo() {
-
- -
); diff --git a/src/Components/Views/SearchPage/SearchPage.scss b/src/Components/Views/SearchPage/SearchPage.scss index d1ad3f48..be488248 100644 --- a/src/Components/Views/SearchPage/SearchPage.scss +++ b/src/Components/Views/SearchPage/SearchPage.scss @@ -1,13 +1,29 @@ +.count { + margin: 10px 0; + width: 100%; + padding: 0 50px; + font-weight: bold; + color: #4b2300; +} +hr { + width: 1200px; + background-color: #ca9f12; + height: 2px; + border: none; + margin-bottom: 15px; +} .Search-wrapper { width: 1200px; margin: auto; min-height: 100vh; - padding-top: 60px; + padding-top: 100px; } .SearchPage { display: flex; - padding: 40px 0; border-bottom: 2px solid #ca9f12; + width: 100%; + height: 250px; + margin-bottom: 15px; } // 책 표지 @@ -15,10 +31,11 @@ display: flex; justify-content: center; width: 270px; + height: 250px; img { - height: 200px; - aspect-ratio: auto; + height: 95%; + box-shadow: 3px 3px 3px 1px gray; } } @@ -28,33 +45,36 @@ flex-direction: column; flex-grow: 1; width: 500px; - gap: 30px; + gap: 20px; + position: relative; // 책 제목 h1 { - font-size: 34px; - margin-top: 10px; - width: 70%; + font-size: 26px; + width: 100%; } .SearchPage__Item { // 줄거리 p:nth-child(1) { - font-size: 19px; - width: 70%; + font-size: 16px; + width: 100%; color: #595959; } // 태그 p:nth-child(2) { font-size: 15px; margin-top: 10px; - width: 70%; + width: 100%; } } } .SearchPage__Price { + position: absolute; + bottom: 10px; // 판매가 p:nth-child(1) { color: red; - font-size: 22px; + font-size: 20px; + font-weight: bold; margin-bottom: 10px; } // 정가 @@ -66,10 +86,10 @@ // 구매,대여 공통 .SearchPage__ButtonBox { - position: relative; display: flex; flex-direction: column; justify-content: flex-end; + margin-bottom: 5px; button { border-radius: 5px; @@ -80,8 +100,10 @@ border: none; font-size: 15px; cursor: pointer; - font-family: 'SUITE-Regular'; + font-family: "SUITE-Regular"; + box-shadow: 3px 3px 3px gray; } + // 구매버튼 button:first-child { background-color: #df307f; @@ -91,6 +113,17 @@ background-color: #e24457; } } +.no_content { + width: 1200px; + margin: auto; + min-height: 100vh; + display: flex; + justify-content: center; + align-items: center; + p { + font-size: 24px; + } +} // 페이지네이션 .pagination { ul { @@ -100,18 +133,28 @@ li { list-style: none; + } - button { - width: 30px; - height: 30px; - background-color: #ca9f12; - border: none; - border-radius: 50%; - margin: 0 5px; - color: #fff; - } + .button_1 { + width: 30px; + height: 30px; + background-color: #ca9f12; + border: none; + border-radius: 50%; + margin: 0 5px; + color: #fff; + cursor: pointer; + } + .button_2 { + width: 30px; + height: 30px; + background-color: #f0c741; + border: 2px solid #ca9f12; + border-radius: 50%; + margin: 0 5px; + color: #fff; + cursor: pointer; + box-shadow: 2px 2px 1.5px gray; } } } - - diff --git a/src/Components/Views/SearchPage/SearchPage.tsx b/src/Components/Views/SearchPage/SearchPage.tsx index 398c600d..70332162 100644 --- a/src/Components/Views/SearchPage/SearchPage.tsx +++ b/src/Components/Views/SearchPage/SearchPage.tsx @@ -3,6 +3,7 @@ import "./SearchPage.scss"; import axios from "axios"; import { useParams, useNavigate, Link } from "react-router-dom"; const { VITE_CLIENT_ID } = import.meta.env; +import Swal from "sweetalert2"; const ajax = axios.create({ baseURL: "/cafe24", @@ -13,21 +14,6 @@ const ajax = axios.create({ }, }); -// interface DetailInfo { -// detail_image: string; -// product_name: string; -// retail_price: number; -// simple_description: string; -// summary_description: string; -// product_no: string; -// price: number; -// price_excluding_tax: string; -// selling: string; -// description: string; -// rentdate: number; -// gubun: string; -// } - export default function SearchPage() { const navigate = useNavigate(); const [search, setSearch] = useState([] as Products); @@ -40,12 +26,10 @@ export default function SearchPage() { const res = await ajax.get("/products", { params: { product_name: product_name, - offset: offset * 10, }, }); - - console.log(res.data.products); + // console.log(res.data.products); return res.data.products; } catch (err) { console.log(err); @@ -63,19 +47,18 @@ export default function SearchPage() { .then((res) => setCount(res.data.count)); const result = await SearchAPI(params.keyword); setSearch(result); - - console.log(result); + // console.log(result); window.scrollTo(0, 0); })(); }, [params, offset]); - console.log("search:", search); + console.log("search:", search.length); const BuyBook = (search: string, type: string) => { console.log(search); let Cart = JSON.parse(localStorage.getItem("cart") || "[]"); if (Cart.some((item) => item.product_no === search.product_no)) { - alert("이미 장바구니에 담으셨습니다."); + Swal.fire("이미 장바구니에 담으셨습니다.", "", "warning"); return false; } @@ -88,69 +71,86 @@ export default function SearchPage() { Cart = Array.from(new Set(Cart)); Cart = [...Cart]; localStorage.setItem("cart", JSON.stringify(Cart)); - alert("장바구니에 담겼습니다."); + Swal.fire("장바구니에 담겼습니다!", "", "success"); navigate("/cart"); }; return ( -
- {search && - search.map((v) => { - return ( - <> -
- -
- 책표지 -
- + <> + {search.length === 0 ? ( +
+

검색결과가 존재하지 않습니다! 😊

+
+ ) : ( +
+
+ 😶‍🌫️ "{params.keyword}"에 대한 검색결과가 총 {count}개 있습니다. +
+
+ {search && + search.map((v) => { + return ( + <> +
+ +
+ 책표지 +
+ -
- -

{v.product_name}

- +
+ +

{v.product_name}

+ -
-

{v.summary_description}

-

{v.product_tag}

-
-
-

{v.price.slice(0, -3)}원

-

{v.retail_price.slice(0, -3)}원

+
+

{v.summary_description}

+

{v.product_tag}

+
+
+

{v.price.slice(0, -3)}원

+

{v.retail_price.slice(0, -3)}원

+
+
+
+ + +
-
-
- - -
-
- - ); - })} -
-
    { - if (e.target instanceof HTMLLIElement) { - setOffset(e.target.value); - } - }} - > - {Array(parseInt(((count - 0.1) / 10 + 1).toString())) - .fill(0) - .map((i, index) => ( -
  • - -
  • - ))} -
-
-
+ + ); + })} +
+
    { + if (e.target instanceof HTMLLIElement) { + setOffset(e.target.value); + } + }} + > + {Array(parseInt(((count - 0.1) / 10 + 1).toString())) + .fill(0) + .map((i, index) => ( +
  • + +
  • + ))} +
+
+
+ )} + ); } diff --git a/src/main.tsx b/src/main.tsx index 95644085..5b73de6f 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -1,15 +1,42 @@ -import React from "react"; import ReactDOM from "react-dom/client"; import App from "./App"; import "./index.scss"; +import axios from "axios"; -//import ReduxThunk from 'redux-thunk'; -// import thunk from 'redux-thunk'; -// import { createStore, applyMiddleware } from 'redux'; -// import reducer from '_reducers/user_reducer.tsx'; +const token = localStorage.getItem("token"); -//const createStoreWithMiddleware = applyMiddleware(promiseMiddleware, ReduxThunk)(createStore); -//const store = createStore(reducer, applyMiddleware(thunk)); +// 토큰을 저장하는 함수 +const saveTokenToLocalStorage = (token: string) => { + localStorage.setItem("token", token); +}; + +// 토큰을 제거하는 함수 +const removeTokenFromLocalStorage = () => { + localStorage.removeItem("token"); +}; + +if (token) { + saveTokenToLocalStorage(token); +} else { + removeTokenFromLocalStorage(); +} + +// 토큰 갱신 인터셉터 +axios.interceptors.response.use( + (response) => { + // 응답 처리 + return response; + }, + (error) => { + if (error.response.status === 401) { + console.log("401 에러 발생: 토큰 제거하지 않음"); + alert("401 에러 발생"); + // 401 에러 발생 시 토큰을 제거하는 로직 추가 + removeTokenFromLocalStorage(); + } + return Promise.reject(error); + } +); ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render( From ef096b53c67306f1498773325bd6e5302a74a9fe Mon Sep 17 00:00:00 2001 From: hahahaday12 Date: Fri, 30 Jun 2023 23:08:06 +0900 Subject: [PATCH 63/75] =?UTF-8?q?fix:=20=EB=B3=80=EA=B2=BD=EC=82=AC?= =?UTF-8?q?=ED=95=AD=20=EC=97=85=EB=A1=9C=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env | 14 -------------- src/Components/Views/MyPage/UserInfo.tsx | 11 +---------- 2 files changed, 1 insertion(+), 24 deletions(-) delete mode 100644 .env diff --git a/.env b/.env deleted file mode 100644 index f0441eb9..00000000 --- a/.env +++ /dev/null @@ -1,14 +0,0 @@ -VITE_CAFE24_URL=/cafe24/admin - -VITE_ACCESS_TOKEN=blFKQmd4UHBIRk5sRUFHZko5bW8xQjpmcUhuMUU4blFTeGU2c21nZkpVVWNS - -VITE_CLIENT_ID=nQJBgxPpHFNlEAGfJ9mo1B -VITE_REDIRECT_URI=https://teamwink.com:5173/ -VITE_API_VERSION=2023-03-01 - -VITE_IMP_KEY=5758023681388354 -VITE_IMP_SECRET=tCdwGmiflqhMA3It54n6aLBIeA7LCg0O3WYu5qI1SKpwQ85FKXtJsiHu8yUWTynhDx7fxCFY1wsA3KVc -VITE_IMP_OWNER=imp36252452 - -VITE_KDT5_API=KDT5_nREmPe9B -VITE_KDT5_USER=KDT5_TeamWink \ No newline at end of file diff --git a/src/Components/Views/MyPage/UserInfo.tsx b/src/Components/Views/MyPage/UserInfo.tsx index 34569b3f..9bc21c35 100644 --- a/src/Components/Views/MyPage/UserInfo.tsx +++ b/src/Components/Views/MyPage/UserInfo.tsx @@ -120,16 +120,7 @@ function UserInfo() { />
- 파일 용량은 1MB를 초과할 수 없습니다. - -
- {selectedImage ? ( - Preview - ) : ( - 이미지 미리보기 - )} -
- + 파일 용량은 1MB를 초과할 수 없습니다.
From dc31ee0484356b05ad9f156f35d264a2daaa1772 Mon Sep 17 00:00:00 2001 From: hahahaday12 Date: Fri, 30 Jun 2023 23:12:09 +0900 Subject: [PATCH 64/75] =?UTF-8?q?fix:=20=EB=B3=80=EA=B2=BD=EC=82=AC?= =?UTF-8?q?=ED=95=AD=20=EC=97=85=EB=A1=9C=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index e34b4700..f4ea5f2c 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,12 +1,10 @@ import "./App.scss"; import RoutesPage from "./routes/routes"; -import SearchPage from "./Components/Views/SearchPage/SearchPage"; function App() { return ( <> - {/* */} ); } From 5d247a73518882f5f16d3cd99d8b1d0ea8ceda40 Mon Sep 17 00:00:00 2001 From: Seo Donguk Date: Fri, 30 Jun 2023 23:13:39 +0900 Subject: [PATCH 65/75] =?UTF-8?q?fix:=20=ED=99=98=EA=B2=BD=EB=B3=80?= =?UTF-8?q?=EC=88=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env | 9 +- src/Apis/PaymentToken/paymentToken.ts | 15 +- src/Apis/Token/token.ts | 19 +- src/Apis/register.tsx | 26 +- src/App.tsx | 6 +- src/Common/Layout/Header/header.tsx | 147 ++++---- .../Views/CartPage/Payment/Payment.tsx | 65 ++-- .../Views/MainPage/Component/Genre.tsx | 1 - src/Components/Views/MyPage/MyPage.tsx | 340 +++++++++--------- .../MyPage/common/components/Category.tsx | 135 ++++--- src/main.tsx | 49 ++- 11 files changed, 439 insertions(+), 373 deletions(-) diff --git a/.env b/.env index d768f6b9..f0441eb9 100644 --- a/.env +++ b/.env @@ -4,4 +4,11 @@ VITE_ACCESS_TOKEN=blFKQmd4UHBIRk5sRUFHZko5bW8xQjpmcUhuMUU4blFTeGU2c21nZkpVVWNS VITE_CLIENT_ID=nQJBgxPpHFNlEAGfJ9mo1B VITE_REDIRECT_URI=https://teamwink.com:5173/ -VITE_API_VERSION=2023-03-01 \ No newline at end of file +VITE_API_VERSION=2023-03-01 + +VITE_IMP_KEY=5758023681388354 +VITE_IMP_SECRET=tCdwGmiflqhMA3It54n6aLBIeA7LCg0O3WYu5qI1SKpwQ85FKXtJsiHu8yUWTynhDx7fxCFY1wsA3KVc +VITE_IMP_OWNER=imp36252452 + +VITE_KDT5_API=KDT5_nREmPe9B +VITE_KDT5_USER=KDT5_TeamWink \ No newline at end of file diff --git a/src/Apis/PaymentToken/paymentToken.ts b/src/Apis/PaymentToken/paymentToken.ts index 67192242..195f7ad0 100644 --- a/src/Apis/PaymentToken/paymentToken.ts +++ b/src/Apis/PaymentToken/paymentToken.ts @@ -1,16 +1,17 @@ -import axios from "axios"; +import axios from 'axios'; + +const { VITE_IMP_KEY, VITE_IMP_SECRET } = import.meta.env; export const ajax = axios({ - url: "/users/getToken", + url: '/users/getToken', // POST method - method: "post", + method: 'post', // "Content-Type": "application/json" - headers: { "Content-Type": "application/json" }, + headers: { 'Content-Type': 'application/json' }, data: { // REST API키 - imp_key: "5758023681388354", + imp_key: VITE_IMP_KEY, // REST API Secret - imp_secret: - "tCdwGmiflqhMA3It54n6aLBIeA7LCg0O3WYu5qI1SKpwQ85FKXtJsiHu8yUWTynhDx7fxCFY1wsA3KVc", + imp_secret: VITE_IMP_SECRET, }, }); diff --git a/src/Apis/Token/token.ts b/src/Apis/Token/token.ts index ffd6b061..de6ffe6f 100644 --- a/src/Apis/Token/token.ts +++ b/src/Apis/Token/token.ts @@ -1,5 +1,4 @@ import axios from 'axios'; -//import qs from 'qs'; const { VITE_ACCESS_TOKEN, VITE_REDIRECT_URI } = import.meta.env; @@ -37,12 +36,7 @@ export async function getToken() { }); token = data; console.log('request', data); - setCookie( - token.access_token, - token.expires_at, - token.refresh_token - //token.refresh_token_expires_at - ); + setCookie(token.access_token, token.expires_at, token.refresh_token); } catch (err) { console.log(err); } @@ -56,12 +50,7 @@ export async function refreshToken() { refresh_token: localStorage.getItem('refreshToken'), }); token = data; - setCookie( - token.access_token, - token.expires_at, - token.refresh_token - //token.refresh_token_expires_at - ); + setCookie(token.access_token, token.expires_at, token.refresh_token); console.log('refresh', data); } catch (err) { console.log(err); @@ -72,13 +61,9 @@ function setCookie( accessToken: string, accessExpires: string, refreshToken: string - //refreshExpires: string ) { document.cookie = `accessToken=${accessToken}; path=/; expires=${new Date( accessExpires ).toUTCString()}`; localStorage.setItem('refreshToken', refreshToken); - // document.cookie = `refreshToken=${refreshToken}; path=/; expires=${new Date( - // refreshExpires - // ).toUTCString()}`; } diff --git a/src/Apis/register.tsx b/src/Apis/register.tsx index aa38daed..5a9d7467 100644 --- a/src/Apis/register.tsx +++ b/src/Apis/register.tsx @@ -1,9 +1,11 @@ import axios from 'axios'; +const { VITE_KDT5_API, VITE_KDT5_USER } = import.meta.env; + const headers = { 'Content-Type': 'application/json', - 'apikey': 'KDT5_nREmPe9B', - 'username': 'KDT5_TeamWink', + apikey: VITE_KDT5_API, + username: VITE_KDT5_USER, }; const axiosInstance = axios.create({ @@ -11,9 +13,19 @@ const axiosInstance = axios.create({ headers, }); -export const JoinForm = async (email: string, displayName: string, password: string, profileImgBase64:string) => { +export const JoinForm = async ( + email: string, + displayName: string, + password: string, + profileImgBase64: string +) => { const URL = '/signup'; - const res = await axiosInstance.post(URL, { email, displayName, password, profileImgBase64 }); + const res = await axiosInstance.post(URL, { + email, + displayName, + password, + profileImgBase64, + }); return res.data; }; @@ -26,6 +38,10 @@ export const LoginForm = async (email: string, password: string) => { export const LogoutForm = async () => { const LOGOUTURL = '/logout'; const token = localStorage.getItem('token') as string; - const res = await axiosInstance.post(LOGOUTURL, {}, { headers: { ...headers, 'Authorization': `Bearer ${token}` } }); + const res = await axiosInstance.post( + LOGOUTURL, + {}, + { headers: { ...headers, Authorization: `Bearer ${token}` } } + ); return res.data; }; diff --git a/src/App.tsx b/src/App.tsx index e34b4700..9c11872e 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,12 +1,10 @@ -import "./App.scss"; -import RoutesPage from "./routes/routes"; -import SearchPage from "./Components/Views/SearchPage/SearchPage"; +import './App.scss'; +import RoutesPage from './routes/routes'; function App() { return ( <> - {/* */} ); } diff --git a/src/Common/Layout/Header/header.tsx b/src/Common/Layout/Header/header.tsx index 10453a3e..c6f04213 100644 --- a/src/Common/Layout/Header/header.tsx +++ b/src/Common/Layout/Header/header.tsx @@ -1,11 +1,10 @@ -import { Link, useNavigate } from "react-router-dom"; -import axios from "axios"; -import { useEffect, useState } from "react"; -import { ChangeEvent } from "react"; -import "./headers.scss"; -import { LogoutForm } from "@/Apis/register"; -import { getList } from "@/Apis/productApi"; - +import { Link, useNavigate } from 'react-router-dom'; +import axios from 'axios'; +import { useEffect, useState } from 'react'; +import { ChangeEvent } from 'react'; +import './headers.scss'; +import { LogoutForm } from '@/Apis/register'; +import { getList } from '@/Apis/productApi'; interface User { displayName: string; // 사용자 표시 이름 @@ -19,67 +18,66 @@ interface Product { price: string; } +const { VITE_KDT5_API, VITE_KDT5_USER } = import.meta.env; function Header() { - const defaultProfileImgUrl = "/public/images/default-profile.jpg"; - const [user, setUser] = useState({ displayName: "", profileImg: "" }); - const [keyword, setKeyWord] = useState(""); + const defaultProfileImgUrl = '/public/images/default-profile.jpg'; + const [user, setUser] = useState({ displayName: '', profileImg: '' }); + const [keyword, setKeyWord] = useState(''); const [filteredItems, setFilteredItems] = useState([]); const [product, setProductInfo] = useState([]); const [showInputButton, setShowInputButton] = useState(false); - const navigate = useNavigate(); - + const handleInputChange = (e: ChangeEvent) => { setKeyWord(e.target.value); - setShowInputButton(e.target.value.trim() !== ""); + setShowInputButton(e.target.value.trim() !== ''); }; const handleInputButtonClick = () => { - if (keyword === "") { - alert("검색어를 입력해주세요"); + if (keyword === '') { + alert('검색어를 입력해주세요'); } else { onSubmit(); } }; - const logoutHandler = () => { LogoutForm() .then(() => { - localStorage.removeItem("token"); - alert("로그아웃 되셨습니다"); - navigate("/"); + localStorage.removeItem('token'); + alert('로그아웃 되셨습니다'); + navigate('/'); }) .catch((error: string) => { - console.log("Logout failed:", error); + console.log('Logout failed:', error); }); }; const onSubmit = async () => { - navigate("/search/" + keyword); + navigate('/search/' + keyword); }; - const token = localStorage.getItem("token"); + const token = localStorage.getItem('token'); useEffect(() => { const authenticate = async () => { try { const response = await axios.post( - "https://asia-northeast3-heropy-api.cloudfunctions.net/api/auth/me", + 'https://asia-northeast3-heropy-api.cloudfunctions.net/api/auth/me', {}, { headers: { - Authorization: `Bearer ${localStorage.getItem("token")}`, - "Content-Type": "application/json", - apikey: "KDT5_nREmPe9B", - username: "KDT5_TeamWink", + Authorization: `Bearer ${localStorage.getItem('token')}`, + 'Content-Type': 'application/json', + apikey: VITE_KDT5_API, + username: VITE_KDT5_USER, }, } ); const userData = response.data; - + // 사용자 정보를 업데이트하기 전에 profileImg가 존재하지 않을 경우에만 기본 프로필 이미지 URL을 사용 setUser((prevUser) => ({ ...prevUser, @@ -94,11 +92,11 @@ function Header() { authenticate(); } }, [token]); - + const OnKeyPress = (e: any) => { - if (keyword === "") { - alert("검색어를 입력해주세요"); - } else if (e.key === "Enter") { + if (keyword === '') { + alert('검색어를 입력해주세요'); + } else if (e.key === 'Enter') { onSubmit(); } }; @@ -109,15 +107,15 @@ function Header() { ); setFilteredItems(filtered); }; - + useEffect(() => { filterItems(keyword); - }, [keyword, product]); + }, [keyword, product]); async function getItem() { const cate = { - limit : 100 - } + limit: 100, + }; const data = await getList(cate); console.log(data); setProductInfo(data); @@ -149,39 +147,36 @@ function Header() { onClick={handleInputButtonClick} /> - {showInputButton && keyword &&( -
-
- {keyword && - filteredItems.map((v: Product) => { - if (v.product_name.trim() !== "") { - return ( - -
- searchbookimage -
- -
- {v.product_name} - {v.price.slice(0, -3)}원 -
- - ); - } else { - return null; - } - })} -
+ {showInputButton && keyword && ( +
+
+ {keyword && + filteredItems.map((v: Product) => { + if (v.product_name.trim() !== '') { + return ( + +
+ searchbookimage +
+ +
+ {v.product_name} + {v.price.slice(0, -3)}원 +
+ + ); + } else { + return null; + } + })} +
+
+ )}
- )} -
- - -
@@ -196,11 +191,9 @@ function Header() { 로그아웃
- -
-
+ +
+
) : ( <> @@ -213,12 +206,8 @@ function Header() { )}
- - - - ); } -export default Header; \ No newline at end of file +export default Header; diff --git a/src/Components/Views/CartPage/Payment/Payment.tsx b/src/Components/Views/CartPage/Payment/Payment.tsx index 1c16e24d..32b69038 100644 --- a/src/Components/Views/CartPage/Payment/Payment.tsx +++ b/src/Components/Views/CartPage/Payment/Payment.tsx @@ -1,4 +1,4 @@ -import { useEffect } from "react"; +import { useEffect } from 'react'; interface PaymentInfo { amount: number; @@ -16,15 +16,17 @@ interface BuyItem { setdatalist: any; } +const { VITE_IMP_OWNER } = import.meta.env; + const Payment = ({ amount, productlists, setdatalist }: PaymentInfo) => { const orderNumber = `mid_${new Date().getTime()}`; console.log(orderNumber); useEffect(() => { - const jquery = document.createElement("script"); - jquery.src = "https://code.jquery.com/jquery-1.12.4.min.js"; - const iamport = document.createElement("script"); - iamport.src = "https://cdn.iamport.kr/js/iamport.payment-1.1.7.js"; + const jquery = document.createElement('script'); + jquery.src = 'https://code.jquery.com/jquery-1.12.4.min.js'; + const iamport = document.createElement('script'); + iamport.src = 'https://cdn.iamport.kr/js/iamport.payment-1.1.7.js'; document.head.appendChild(jquery); document.head.appendChild(iamport); return () => { @@ -35,47 +37,56 @@ const Payment = ({ amount, productlists, setdatalist }: PaymentInfo) => { const onClickPayment = () => { console.log(productlists); - const itemName = productlists.map((obj: { product_name: any; }) => obj.product_name).join(","); - + const itemName = productlists + .map((obj: { product_name: any }) => obj.product_name) + .join(','); console.log(itemName); const IMP = (window as any).IMP; - IMP.init("imp36252452"); + IMP.init(VITE_IMP_OWNER); const data = { - pg: "html5_inicis", // PG사 html5_inicis: KG이니시스, kakaopay: 카카오페이, naverpay: 네이버페이, payco: 페이코 - pay_method: "card", // 결제수단 - merchant_uid: orderNumber, + pg: 'html5_inicis', // PG사 html5_inicis: KG이니시스, kakaopay: 카카오페이, naverpay: 네이버페이, payco: 페이코 + pay_method: 'card', // 결제수단 + merchant_uid: orderNumber, amount: amount, // 결제금액 name: `${itemName}`, // 주문명 - buyer_name: "", // 구매자 이름 - buyer_email: "", - - custom_data:productlists + buyer_name: '', // 구매자 이름 + buyer_email: '', + + custom_data: productlists, }; IMP.request_pay(data, callback); }; - function callback(response: any) { const { success, error_msg } = response; if (success) { - alert("결제 성공"); - const mypayarray: string | null = window.localStorage.getItem("mypayment"); - const combinedArray: string[] | null = mypayarray ? JSON.parse(mypayarray) : null; + alert('결제 성공'); + const mypayarray: string | null = + window.localStorage.getItem('mypayment'); + const combinedArray: string[] | null = mypayarray + ? JSON.parse(mypayarray) + : null; if (!combinedArray) { - window.localStorage.setItem("mypayment", JSON.stringify([orderNumber])); + window.localStorage.setItem('mypayment', JSON.stringify([orderNumber])); } else { combinedArray.push(orderNumber); - window.localStorage.setItem("mypayment", JSON.stringify(combinedArray)); + window.localStorage.setItem('mypayment', JSON.stringify(combinedArray)); } - - const productItemlist = productlists.map((obj: { product_no: any; }) => obj.product_no).join(","); - const cartlist: BuyItem[] = JSON.parse(window.localStorage.getItem("cart") || "[]"); - - const updatedArray = cartlist.filter((item) => !productItemlist.includes(item.product_no)); - window.localStorage.setItem("cart", JSON.stringify(updatedArray)); + + const productItemlist = productlists + .map((obj: { product_no: any }) => obj.product_no) + .join(','); + const cartlist: BuyItem[] = JSON.parse( + window.localStorage.getItem('cart') || '[]' + ); + + const updatedArray = cartlist.filter( + (item) => !productItemlist.includes(item.product_no) + ); + window.localStorage.setItem('cart', JSON.stringify(updatedArray)); setdatalist(updatedArray); } else { alert(`결제 실패: ${error_msg}`); diff --git a/src/Components/Views/MainPage/Component/Genre.tsx b/src/Components/Views/MainPage/Component/Genre.tsx index 29dc419d..072a4272 100644 --- a/src/Components/Views/MainPage/Component/Genre.tsx +++ b/src/Components/Views/MainPage/Component/Genre.tsx @@ -12,7 +12,6 @@ export default function Genre({ category }: { category: Props }) { const [list, setList] = useState([] as Products); async function sortByCategory() { const data = await getList({ category: category.number }); - //console.log(category.number); setList(data); } useEffect(() => { diff --git a/src/Components/Views/MyPage/MyPage.tsx b/src/Components/Views/MyPage/MyPage.tsx index cc1e3751..e6b8772d 100644 --- a/src/Components/Views/MyPage/MyPage.tsx +++ b/src/Components/Views/MyPage/MyPage.tsx @@ -1,13 +1,12 @@ -import { useState, useEffect } from "react"; -import axios,{ AxiosResponse } from "axios"; -import Category from "./common/components/Category"; -import "./MyPage.scss"; +import { useState, useEffect } from 'react'; +import axios, { AxiosResponse } from 'axios'; +import Category from './common/components/Category'; +import './MyPage.scss'; interface PaymentItem { merchant_uid: string; - custom_data:string; + custom_data: string; paid_at: string; - } interface PaymentsResponse { @@ -26,213 +25,228 @@ interface PageData { small_image: string; product_name: string; price: number; - custom_data:string; + custom_data: string; paid_at: string; } -function MyPage() { +const { VITE_IMP_KEY, VITE_IMP_SECRET } = import.meta.env; +function MyPage() { const TopCategory: CategoryMap = { - orderId:'주문번호', - orderDate:'주문날짜', - productname:'상품이름', - price:'상품가격', - cancel:'구매취소' + orderId: '주문번호', + orderDate: '주문날짜', + productname: '상품이름', + price: '상품가격', + cancel: '구매취소', } as const; -const [itemList, setItemList] = useState([]); -const [mydataList, setMydataList] = useState([]); - -const GetToken = async () => { - try{ - const response = await axios.post('/iamport/users/getToken', - { - imp_key: '5758023681388354', - imp_secret: 'tCdwGmiflqhMA3It54n6aLBIeA7LCg0O3WYu5qI1SKpwQ85FKXtJsiHu8yUWTynhDx7fxCFY1wsA3KVc', - }, - { - headers: { 'Content-Type': 'application/json' }, - } - ); - const accessToken = response.data.response.access_token; - return accessToken; - } catch (error) { - console.log(error); - throw error; - } -} + const [itemList, setItemList] = useState([]); + const [mydataList, setMydataList] = useState([]); + const GetToken = async () => { + try { + const response = await axios.post( + '/iamport/users/getToken', + { + imp_key: VITE_IMP_KEY, + imp_secret: VITE_IMP_SECRET, + }, + { + headers: { 'Content-Type': 'application/json' }, + } + ); + const accessToken = response.data.response.access_token; + return accessToken; + } catch (error) { + console.log(error); + throw error; + } + }; -const fetchData = async (): Promise => { - try { - const paynumber: string | null = window.localStorage.getItem('mypayment'); + const fetchData = async (): Promise => { + try { + const paynumber: string | null = window.localStorage.getItem('mypayment'); - if (paynumber) { - const merchantUids = JSON.parse(paynumber); - const accessToken = await GetToken(); - const paymentsResponse: AxiosResponse = await axios.get( - `/iamport/payments/status/paid?limit=20&sorting=paid&_token=${accessToken}` - ); + if (paynumber) { + const merchantUids = JSON.parse(paynumber); + const accessToken = await GetToken(); + const paymentsResponse: AxiosResponse = + await axios.get( + `/iamport/payments/status/paid?limit=20&sorting=paid&_token=${accessToken}` + ); - if (paymentsResponse.data && paymentsResponse.data.response && paymentsResponse.data.response.list) { - const filteredList: PaymentItem[] = paymentsResponse.data.response.list.filter((item) => - merchantUids.includes(item.merchant_uid) - ); - if(filteredList){ - setItemList(filteredList); - }else{ + if ( + paymentsResponse.data && + paymentsResponse.data.response && + paymentsResponse.data.response.list + ) { + const filteredList: PaymentItem[] = + paymentsResponse.data.response.list.filter((item) => + merchantUids.includes(item.merchant_uid) + ); + if (filteredList) { + setItemList(filteredList); + } else { + setItemList([]); + } + } else { + console.log('Invalid response format'); setItemList([]); } - } else { - console.log('Invalid response format'); - setItemList([]); } + } catch (error) { + console.log('Error occurred:', error); } - } catch (error) { - console.log('Error occurred:', error); - } -}; - -useEffect(() => { - fetchData(); -}, []); - -useEffect(() => { - setMydataList([]); - if (itemList.length === 0) { - return; - } - const useData = itemList.filter((item) => item.custom_data); - useData.forEach((item) => { - if (item.custom_data) { - let parsedData: PageData[] = JSON.parse(item.custom_data); - parsedData = parsedData.map((data) => ({ - ...data, - paid_at: item.paid_at, - merchant_uid: item.merchant_uid, - // Add more properties as needed - })); - setMydataList((prevDataList) => [...prevDataList, ...parsedData]); - } - }); -}, [itemList]); - - -const DeleteList = (itemnum: string) => { - const MyPay = localStorage.getItem("mypayment"); - - if (MyPay && MyPay.includes(itemnum)) { - const updatedList = MyPay.replace(itemnum, "").trim(); - localStorage.setItem("mypayment", updatedList); - } - fetchData(); -} + }; + + useEffect(() => { + fetchData(); + }, []); -const onClickDelete = async (key:string) => { - - if(confirm("주문을 취소 하시겠습니까?")){ - const accessToken = await GetToken(); - const data = { - merchant_uid : key - } - await axios.post( - `/iamport/payments/cancel?_token=${accessToken}`, data) - .then((res) => { - if(res.status == 200){ - alert("주문이 취소 되었습니다"); - DeleteList(key); - } else { - console.log(res.status) + useEffect(() => { + setMydataList([]); + if (itemList.length === 0) { + return; + } + const useData = itemList.filter((item) => item.custom_data); + useData.forEach((item) => { + if (item.custom_data) { + let parsedData: PageData[] = JSON.parse(item.custom_data); + parsedData = parsedData.map((data) => ({ + ...data, + paid_at: item.paid_at, + merchant_uid: item.merchant_uid, + // Add more properties as needed + })); + setMydataList((prevDataList) => [...prevDataList, ...parsedData]); } }); - } else { - alert("취소되었습니다.") - } -}; - - -const getDate = function(param:any){ - const date = new Date(param * 1000); - const koreaTime = date.toLocaleString("ko-KR", { - timeZone: "Asia/Seoul", - year: "numeric", - month: "2-digit", - day: "2-digit", + }, [itemList]); + + const DeleteList = (itemnum: string) => { + const MyPay = localStorage.getItem('mypayment'); + + if (MyPay && MyPay.includes(itemnum)) { + const updatedList = MyPay.replace(itemnum, '').trim(); + localStorage.setItem('mypayment', updatedList); + } + fetchData(); + }; + + const onClickDelete = async (key: string) => { + if (confirm('주문을 취소 하시겠습니까?')) { + const accessToken = await GetToken(); + const data = { + merchant_uid: key, + }; + await axios + .post(`/iamport/payments/cancel?_token=${accessToken}`, data) + .then((res) => { + if (res.status == 200) { + alert('주문이 취소 되었습니다'); + DeleteList(key); + } else { + console.log(res.status); + } + }); + } else { + alert('취소되었습니다.'); + } + }; + + const getDate = function (param: any) { + const date = new Date(param * 1000); + const koreaTime = date.toLocaleString('ko-KR', { + timeZone: 'Asia/Seoul', + year: 'numeric', + month: '2-digit', + day: '2-digit', }); - return koreaTime; -} + return koreaTime; + }; return ( <>
- +
구매 내역
- {Object.keys(TopCategory).map(key => { - return + {Object.keys(TopCategory).map((key) => { + return ( + {TopCategory[key]} - })} + ); + })}
{mydataList - .filter((el: PageData) => el.gubun === 'buy') - .map((item: PageData, index: number) => ( - -
- {item.merchant_uid.replace("mid_","")} + .filter((el: PageData) => el.gubun === 'buy') + .map((item: PageData, index: number) => ( +
+ {item.merchant_uid.replace('mid_', '')} {getDate(item.paid_at)} -
- 책이미지 - {item.product_name} -
- {item.price} +
+ 책이미지 + + {item.product_name} + +
+ {item.price}
- +
-
- - ))} +
+ ))}
대여 내역
-
-
- {Object.keys(TopCategory).map(key => { - return +
+
+ {Object.keys(TopCategory).map((key) => { + return ( + {TopCategory[key]} - })} -
-
+ ); + })} +
+
{mydataList - .filter((el: PageData) => el.gubun === 'rent') - .map((item: PageData, index: number) => ( - -
- {item.merchant_uid.replace("mid_","")} + .filter((el: PageData) => el.gubun === 'rent') + .map((item: PageData, index: number) => ( +
+ {item.merchant_uid.replace('mid_', '')} {getDate(item.paid_at)} -
- 책이미지 - {item.product_name} -
- {item.price} +
+ 책이미지 + + {item.product_name} + +
+ {item.price}
- +
-
- - ))} -
+
+ ))}
- +
diff --git a/src/Components/Views/MyPage/common/components/Category.tsx b/src/Components/Views/MyPage/common/components/Category.tsx index 45372db0..fd048c52 100644 --- a/src/Components/Views/MyPage/common/components/Category.tsx +++ b/src/Components/Views/MyPage/common/components/Category.tsx @@ -1,68 +1,80 @@ -import './Category.scss' -import { Link } from "react-router-dom"; +import './Category.scss'; +import { Link } from 'react-router-dom'; import { useState, useEffect } from 'react'; -import axios from "axios"; +import axios from 'axios'; interface User { displayName: string; // 사용자 표시 이름 profileImg: string; // 사용자 프로필 이미지 URL } +const { VITE_KDT5_API, VITE_KDT5_USER } = import.meta.env; + const Category = () => { + // 기본 프로필 이미지 URL + const defaultProfileImgUrl = '/public/images/default-profile.jpg'; + const [user, setUser] = useState({ + displayName: '', + profileImg: defaultProfileImgUrl, + }); -// 기본 프로필 이미지 URL -const defaultProfileImgUrl = "/public/images/default-profile.jpg"; -const [user, setUser] = useState({ displayName: "", profileImg: defaultProfileImgUrl }); + useEffect(() => { + const authenticate = async () => { + try { + const response = await axios.post( + 'https://asia-northeast3-heropy-api.cloudfunctions.net/api/auth/me', + {}, + { + headers: { + Authorization: `Bearer ${localStorage.getItem('token')}`, + 'Content-Type': 'application/json', + apikey: VITE_KDT5_API, + username: VITE_KDT5_USER, + }, + } + ); + const userData = response.data; -useEffect(() => { - const authenticate = async () => { - try { - const response = await axios.post( - "https://asia-northeast3-heropy-api.cloudfunctions.net/api/auth/me", - {}, - { - headers: { - Authorization: `Bearer ${localStorage.getItem("token")}`, - "Content-Type": "application/json", - apikey: "KDT5_nREmPe9B", - username: "KDT5_TeamWink", - }, - } - ); - const userData = response.data; + // 사용자 정보를 업데이트하기 전에 profileImg가 존재하지 않을 경우에만 기본 프로필 이미지 URL을 사용 + setUser((prevUser) => ({ + ...prevUser, + displayName: userData.displayName, + profileImg: userData.profileImg || defaultProfileImgUrl, + })); + } catch (error) { + console.error(error); + // 오류 처리 + } + }; - // 사용자 정보를 업데이트하기 전에 profileImg가 존재하지 않을 경우에만 기본 프로필 이미지 URL을 사용 - setUser((prevUser) => ({ - ...prevUser, - displayName: userData.displayName, - profileImg: userData.profileImg || defaultProfileImgUrl, - })); - } catch (error) { - console.error(error); - // 오류 처리 - } - }; - - authenticate(); -}, []); + authenticate(); + }, []); useEffect(() => { - if (location.pathname === "/mypage") { - document.querySelector(".LeftContainer-category__order")?.classList.add("active"); - document.querySelector(".LeftContainer-category__infoTap")?.classList.remove("active"); - } else if (location.pathname === "/mypage/userinfo") { - document.querySelector(".LeftContainer-category__order")?.classList.remove("active"); - document.querySelector(".LeftContainer-category__infoTap")?.classList.add("active"); - } + if (location.pathname === '/mypage') { + document + .querySelector('.LeftContainer-category__order') + ?.classList.add('active'); + document + .querySelector('.LeftContainer-category__infoTap') + ?.classList.remove('active'); + } else if (location.pathname === '/mypage/userinfo') { + document + .querySelector('.LeftContainer-category__order') + ?.classList.remove('active'); + document + .querySelector('.LeftContainer-category__infoTap') + ?.classList.add('active'); + } }, [location]); return ( <>
- 프로필사진
@@ -71,20 +83,27 @@ useEffect(() => {
- -
- 주문내역조회 -
- - - -
- 회원정보 수정 + +
+ 주문내역조회 +
+ + +
+ 회원정보 수정 +
+
- -
); }; -export default Category; \ No newline at end of file +export default Category; diff --git a/src/main.tsx b/src/main.tsx index 95644085..7cf6ee3b 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -1,16 +1,43 @@ -import React from "react"; -import ReactDOM from "react-dom/client"; -import App from "./App"; -import "./index.scss"; +import ReactDOM from 'react-dom/client'; +import App from './App'; +import './index.scss'; +import axios from 'axios'; -//import ReduxThunk from 'redux-thunk'; -// import thunk from 'redux-thunk'; -// import { createStore, applyMiddleware } from 'redux'; -// import reducer from '_reducers/user_reducer.tsx'; +const token = localStorage.getItem('token'); -//const createStoreWithMiddleware = applyMiddleware(promiseMiddleware, ReduxThunk)(createStore); -//const store = createStore(reducer, applyMiddleware(thunk)); +// 토큰을 저장하는 함수 +const saveTokenToLocalStorage = (token: string) => { + localStorage.setItem('token', token); +}; -ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render( +// 토큰을 제거하는 함수 +const removeTokenFromLocalStorage = () => { + localStorage.removeItem('token'); +}; + +if (token) { + saveTokenToLocalStorage(token); +} else { + removeTokenFromLocalStorage(); +} + +// 토큰 갱신 인터셉터 +axios.interceptors.response.use( + (response) => { + // 응답 처리 + return response; + }, + (error) => { + if (error.response.status === 401) { + console.log('401 에러 발생: 토큰 제거하지 않음'); + alert('401 에러 발생'); + // 401 에러 발생 시 토큰을 제거하는 로직 추가 + removeTokenFromLocalStorage(); + } + return Promise.reject(error); + } +); + +ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render( ); From fbd5b1f76411ad9069dce1ba47b67952b02fa5d4 Mon Sep 17 00:00:00 2001 From: saeyeon Date: Sat, 1 Jul 2023 00:00:07 +0900 Subject: [PATCH 66/75] style: css fix --- .../Views/CartPage/CartItems/CartItems.scss | 162 +++++++++--------- .../Views/CartPage/CartRent/CartRent.scss | 160 ++++++++--------- .../Views/DetailPage/DetailPage.tsx | 5 +- .../Views/SearchPage/SearchPage.tsx | 2 +- src/main.tsx | 1 - 5 files changed, 171 insertions(+), 159 deletions(-) diff --git a/src/Components/Views/CartPage/CartItems/CartItems.scss b/src/Components/Views/CartPage/CartItems/CartItems.scss index bd68e3c9..38c45c10 100644 --- a/src/Components/Views/CartPage/CartItems/CartItems.scss +++ b/src/Components/Views/CartPage/CartItems/CartItems.scss @@ -5,7 +5,6 @@ top: 10px; } - .CartPageTable__Buy { width: inherit; height: 45px; @@ -23,105 +22,112 @@ } } - .ProductNameBox { - @include CartNameStyle; - width: 60px; - left: 400px; - } +.ProductNameBox { + @include CartNameStyle; + width: 60px; + left: 400px; +} - .PriceNameBox{ - @include CartNameStyle; - right: 400px; - } +.PriceNameBox { + @include CartNameStyle; + right: 400px; +} - .NumberBox{ - @include CartNameStyle; - right: 280px; - } +.NumberBox { + @include CartNameStyle; + right: 280px; +} - .DeleteNameBox{ - @include CartNameStyle; - right: 120px; - } +.DeleteNameBox { + @include CartNameStyle; + right: 120px; +} - .ItemsContainer { - width: 1300px; - top: 50px; +.ItemsContainer { + width: 1300px; + top: 50px; + position: relative; + max-height: 450px; /* 스크롤 영역의 최대 높이 설정 */ + overflow-y: auto; /* 세로 스크롤 생성 */ + + .ItemContainer { + width: 1182px; + padding-bottom: 5px; position: relative; - max-height: 450px; /* 스크롤 영역의 최대 높이 설정 */ - overflow-y: auto; /* 세로 스크롤 생성 */ + margin-top: 20px; + border-bottom: 2px solid rgb(208, 203, 185); + + .CheckContainer { + width: 60px; + height: 40px; + position: absolute; + top: 40px; + left: 30px; + } - .ItemContainer { - width: 1182px; - padding-bottom: 5px; + .ImageBox { + width: 100px; position: relative; - margin-top: 20px; - border-bottom: 2px solid rgb(208, 203, 185); - - .CheckContainer{ - width: 60px; - height: 40px; - position: absolute; - top: 40px; - left: 30px; + bottom: 10px; + margin-left: 160px; + background-color: rebeccapurple; + + img { + width: inherit; + background-color: orange; + height: auto; } - - .ImageBox{ - width: 100px; - position: relative; - bottom: 10px; - margin-left: 160px; - background-color: rebeccapurple; - - img{ - width: inherit; - background-color: orange; - height: auto; - } + } + + .TextInner { + width: 450px; + padding-bottom: 30px; + position: absolute; + top: 50px; + left: 200px; + text-align: center; + + span:nth-child(1) { + font-size: 20px; } - .TextInner { - width: 450px; - padding-bottom: 30px; + span:nth-child(2) { + width: 200px; + height: 30px; position: absolute; - top: 50px; - left: 200px; - text-align: center; - - span:nth-child(1) { - font-size: 20px; - } - - span:nth-child(2) { - width: 200px; - height: 30px; - position: absolute; - margin-top: 35px; - font-size: 15px; - } + margin-top: 35px; + font-size: 15px; } + } - .PriceInner{ - width: auto; - padding-bottom: 10px; - top: 50px; - position: absolute; - right: 370px; - font-size: 15px; + .PriceInner { + width: auto; + padding-bottom: 10px; + top: 50px; + position: absolute; + right: 370px; + font-size: 15px; } - .CartButtonBox{ + .CartButtonBox { width: 60px; position: absolute; top: 35px; right: 100px; - - button{ + + button { display: block; - width: 50px; + width: 60px; height: 30px; margin-top: 10px; + background-color: rgb(227, 165, 117); + color: #ffffff; + border: none; + border-radius: 5px; + font-weight: bold; + letter-spacing: 1px; + font-size: 14px; } } } -} \ No newline at end of file +} diff --git a/src/Components/Views/CartPage/CartRent/CartRent.scss b/src/Components/Views/CartPage/CartRent/CartRent.scss index 0d91e47b..357f0550 100644 --- a/src/Components/Views/CartPage/CartRent/CartRent.scss +++ b/src/Components/Views/CartPage/CartRent/CartRent.scss @@ -5,14 +5,14 @@ top: 10px; } -.RentPageTable{ +.RentPageTable { width: inherit; height: 45px; background-color: #f6e4cc; position: absolute; border-radius: 10px 10px 0px 0px; - .Rent-LableBox{ + .Rent-LableBox { width: 40px; height: 40px; margin-left: 50px; @@ -21,107 +21,113 @@ font-size: 30px; } - .Rental-Namebox{ + .Rental-Namebox { @include CartNameStyle; left: 160px; } - .Renatal-Price{ + .Renatal-Price { @include CartNameStyle; left: 400px; } - .RentDay{ + .RentDay { @include CartNameStyle; right: 400px; } - - .DeleteDay{ + + .DeleteDay { @include CartNameStyle; right: 150px; } - } .Rental-ItemsContainer { - width: 1300px; - top: 50px; + width: 1300px; + top: 50px; + position: relative; + border-radius: 0px 0px 10px 10px; + background-color: white; + max-height: 450px; /* 스크롤 영역의 최대 높이 설정 */ + overflow-y: auto; /* 세로 스크롤 생성 */ + + .Rental-ItemContainer { + width: 1182px; + padding-bottom: 5px; position: relative; - border-radius: 0px 0px 10px 10px; - background-color: white; - max-height: 450px; /* 스크롤 영역의 최대 높이 설정 */ - overflow-y: auto; /* 세로 스크롤 생성 */ - - .Rental-ItemContainer { - width: 1182px; - padding-bottom: 5px; + margin-top: 20px; + border-bottom: 2px solid rgb(208, 203, 185); + .Rental-CheckContainer { + width: 60px; + height: 40px; + position: absolute; + top: 45px; + left: 30px; + } + + .ImageBox { + width: 100px; position: relative; - margin-top: 20px; - border-bottom: 2px solid rgb(208, 203, 185); - .Rental-CheckContainer{ - width: 60px; - height: 40px; - position: absolute; - top: 45px; - left: 30px; - } - - .ImageBox{ - width: 100px; - position: relative; - bottom: 10px; - margin-left: 120px; - background-color: rebeccapurple; - - img{ - width: inherit; - background-color: orange; - height: auto; - } - } + bottom: 10px; + margin-left: 120px; + background-color: rebeccapurple; - .Rental-TextInner { - width: 400px; - height: 100px; - position: absolute; - top: 1px; - left: 260px; - font-size: 20px; + img { + width: inherit; + background-color: orange; + height: auto; } + } - .Rental-PriceInner{ - width: 100px; - height: 30px; - position: absolute; - top: 50px; - left: 420px; - font-size: 18px; - } + .Rental-TextInner { + width: 400px; + height: 100px; + position: absolute; + top: 1px; + left: 260px; + font-size: 20px; + } + + .Rental-PriceInner { + width: 100px; + height: 30px; + position: absolute; + top: 50px; + left: 420px; + font-size: 18px; + } - .Rental-RentDay{ - width: 50px; - position: absolute; - top: 50px; - right: 420px; - font-size: 18px; + .Rental-RentDay { + width: 50px; + position: absolute; + top: 50px; + right: 420px; + font-size: 18px; - span{ - width: auto; - } + span { + width: auto; } + } - .RentButtonBox{ + .RentButtonBox { + width: 60px; + position: absolute; + top: 40px; + right: 110px; + + button { + display: block; width: 60px; - position: absolute; - top: 40px; - right: 110px; - - button{ - display: block; - width: 50px; - height: 30px; - margin-top: 10px; - } + height: 30px; + margin-top: 10px; + background-color: rgb(227, 165, 117); + color: #ffffff; + border: none; + border-radius: 5px; + font-weight: bold; + letter-spacing: 1px; + font-size: 14px; } + } } -} \ No newline at end of file +} diff --git a/src/Components/Views/DetailPage/DetailPage.tsx b/src/Components/Views/DetailPage/DetailPage.tsx index ff2f6bbd..4cfaa369 100644 --- a/src/Components/Views/DetailPage/DetailPage.tsx +++ b/src/Components/Views/DetailPage/DetailPage.tsx @@ -85,8 +85,9 @@ function DetailPage() { Cart = Array.from(new Set(Cart)); Cart = [...Cart]; localStorage.setItem("cart", JSON.stringify(Cart)); - Swal.fire("장바구니에 담겼습니다!", "", "success"); - navigate("/cart"); + Swal.fire("장바구니에 담겼습니다!", "", "success").then(() => { + navigate("/cart"); + }); } else { Swal.fire("로그인 후 이용해주세요!", "", "warning").then(() => { navigate("/login"); diff --git a/src/Components/Views/SearchPage/SearchPage.tsx b/src/Components/Views/SearchPage/SearchPage.tsx index ca560bb5..1cc38cd6 100644 --- a/src/Components/Views/SearchPage/SearchPage.tsx +++ b/src/Components/Views/SearchPage/SearchPage.tsx @@ -157,7 +157,7 @@ export default function SearchPage() { > {Array(parseInt(((count - 0.1) / 10 + 1).toString())) .fill(0) - .map((i, index) => ( + .map((index) => (
  • +
    + +
    + +
    + +
  • -
    - + -
    -

    아이디가 없으신가요?

    - -

    회원가입 하러 가기!

    - +
    +

    아이디가 없으신가요?

    + +

    회원가입 하러 가기!

    + +
    diff --git a/src/Common/Form/Signin/join.scss b/src/Common/Form/Signin/join.scss index 7d01ddf4..163bb6b1 100644 --- a/src/Common/Form/Signin/join.scss +++ b/src/Common/Form/Signin/join.scss @@ -1,7 +1,6 @@ @mixin Container { padding-top: 80px; - width: 1200px; - height: 1000px; + max-width: 1200px; padding-bottom: 80px; position: relative; margin: 0 auto; @@ -12,6 +11,8 @@ height: 730px; position: relative; border-radius: 10px; + padding-top: 50px; + top: 30px; margin: auto; background-color: white; @@ -21,102 +22,86 @@ @mixin Textbox { width: 200px; height: 50px; - position: absolute; display: flex; - margin: 0 auto; - left: 0; - right: 0; - top: 60px; + margin: 0 auto 30px; } - .joinContainer { - @include Container; - font-family: 'SUITE-Regular'; - - .joinContainer-inner { - @include FormContainerStyle; - - .textContainer { - @include Textbox; - p { - margin: auto; - font-size: 30px; - } + @include Container; + font-family: 'SUITE-Regular'; + + .joinContainer-inner { + @include FormContainerStyle; + + .textContainer { + @include Textbox; + p { + margin: auto; + font-size: 30px; } + } + + .formBox { + width: 400px; + margin: 0 auto; - .formBox { - width: 400px; - height: 450px; - position: relative; - top: 130px; + .formBox-inner { + width: 300px; + height: 95px; margin: 0 auto; - .formBox-inner { - width: 300px; - height: 95px; - margin: 0 auto; - - input { - width:100%; - height: 50px; - margin-top: 10px; - border-radius: 10px; - padding: 10px 10px 10px 10px; - border: 2px solid #F7E9D7; - outline: none; - font-family: ''; - } - - span { - width: 260px; - position: relative; - margin: 0 auto; - top:10px; - left: 0; - right: 0; - display: flex; - } - } - - .buttonContainer { - width: 210px; - height: 50px; - position: absolute; - bottom: -100px; - left: 0; - right: 0; - margin: 0 auto; - } - - .buttonBox { - width: 200px; - height: 50px; - color: black; - background-color: #F7E9D7; - border-radius: 10px; - cursor: pointer; - } + input { + width: 100%; + height: 50px; + margin-top: 10px; + border-radius: 10px; + padding: 10px 10px 10px 10px; + border: 2px solid #f7e9d7; + outline: none; + font-family: ''; + } + + span { + width: 260px; + margin: 0 auto; + display: flex; + } } - .uploadFilebox{ - width: 200px; - padding-bottom: 20px; - position: relative; + .buttonContainer { + width: 210px; + height: 50px; margin: 0 auto; + } - .uploadFilebox-inner{ - width: 200px; - padding-bottom: 10px; + .buttonBox { + width: 200px; + height: 50px; + color: black; + background-color: #f7e9d7; + border-radius: 10px; + cursor: pointer; + } + } - span { - margin-left: 20px; - } + .uploadFilebox { + width: 200px; + padding-bottom: 20px; + position: relative; + margin: 0 auto; + + .uploadFilebox-inner { + width: 200px; + padding-bottom: 10px; + + span { + margin-left: 20px; + } - input { - margin-top: 20px; - } + input { + margin-top: 20px; } } } + } } diff --git a/src/Common/Layout/Footer/footer.scss b/src/Common/Layout/Footer/footer.scss index e32690b8..2b3f7ff2 100644 --- a/src/Common/Layout/Footer/footer.scss +++ b/src/Common/Layout/Footer/footer.scss @@ -1,49 +1,62 @@ footer { - bottom: 0; + display: flex; + flex-wrap: wrap; width: 100%; background-color: rgb(255, 255, 255); height: 100px; position: relative; border-top: solid 2px rgb(202, 159, 18); z-index: 9999; +} + +.footerContainer { + position: relative; + width: 100%; + max-width: 100%; + margin: 0 auto; + height: 100%; + display: flex; + align-items: center; + justify-content: space-around; + padding: 0 20px; +} - .Footer-inner { +.Logo-box { + display: flex; + align-items: center; + + img { + width: 80px; + height: 80px; + } +} + +.Footer-inner { + display: flex; + align-items: center; + gap: 20px; + + .wrap { display: flex; flex-direction: column; position: relative; justify-content: center; align-items: center; - margin-top: 20px; + padding: 0 10px; &:hover { cursor: pointer; } + p { font-size: 12px; margin-top: 5px; } } } -.Logo-box { - position: absolute; - left: 170px; - img { - width: 80px; - top: 15px; - position: absolute; - margin: 0 auto; - left: 0; - right: 0; - } -} .title { - position: absolute; - font-size: 25px; - width: 400px; - height: 40px; - margin: 0 auto; - left: 0; - right: 0; - margin-top: 30px; + font-size: 20px; + text-align: center; + margin: 0; } diff --git a/src/Common/Layout/Footer/footer.tsx b/src/Common/Layout/Footer/footer.tsx index 342b04b1..5ce7e04b 100644 --- a/src/Common/Layout/Footer/footer.tsx +++ b/src/Common/Layout/Footer/footer.tsx @@ -1,79 +1,91 @@ -import "./footer.scss"; -import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import { faGithub } from "@fortawesome/free-brands-svg-icons"; +import './footer.scss'; +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; +import { + faGithub, + faFacebook, + faSquareInstagram, +} from '@fortawesome/free-brands-svg-icons'; const Footer = () => { - const Donguk = "https://github.com/foodeco"; - const Haeun = "https://github.com/hahahaday12"; - const Saeyeon = "https://github.com/saeyeonKim"; - const Daehyun = "https://github.com/dhmoon11"; - const Jinyoung = "https://github.com/jinyoungpark231"; - const Twinkle = "https://github.com/KDT5TeamWink"; + const Donguk = 'https://github.com/foodeco'; + const Haeun = 'https://github.com/hahahaday12'; + const Saeyeon = 'https://github.com/saeyeonKim'; + const Daehyun = 'https://github.com/dhmoon11'; + const Jinyoung = 'https://github.com/jinyoungpark231'; + const Twinkle = 'https://github.com/KDT5TeamWink'; return (
    -
    -
    - { - window.open(Twinkle); - }} - /> -

    Twinkle

    +
    +
    + logo_image
    -
    - { - window.open(Donguk); - }} - /> -

    서동욱

    +

    ToyProject ©️ 5기 7조 Twinkle

    +
    +
    + { + window.open(Twinkle); + }} + /> +

    Twinkle

    +
    +
    + { + window.open(Donguk); + }} + /> +

    서동욱

    +
    +
    + { + window.open(Haeun); + }} + /> +

    김하은

    +
    +
    + { + window.open(Saeyeon); + }} + /> +

    김세연

    +
    +
    + { + window.open(Daehyun); + }} + /> +

    문대현

    +
    +
    + { + window.open(Jinyoung); + }} + /> +

    박진영

    +
    -
    - { - window.open(Haeun); - }} - /> -

    김하은

    -
    -
    - { - window.open(Saeyeon); - }} - /> -

    김세연

    -
    -
    - { - window.open(Daehyun); - }} - /> -

    문대현

    -
    -
    - { - window.open(Jinyoung); - }} - /> -

    박진영

    -
    -
    -
    - logo_image
    -

    toyproject ©️ 5기 7조 twinkle

    ); }; -export default Footer; \ No newline at end of file +export default Footer; diff --git a/src/Common/Layout/Header/headers.scss b/src/Common/Layout/Header/headers.scss index 21567985..485c6df7 100644 --- a/src/Common/Layout/Header/headers.scss +++ b/src/Common/Layout/Header/headers.scss @@ -1,4 +1,4 @@ -.headerContainer{ +.headerContainer { position: fixed; width: 100%; max-width: 100%; @@ -6,20 +6,20 @@ height: 80px; background-color: rgb(255, 255, 255); border-bottom: 2px solid rgb(202, 159, 18); - background-size: 100% 100%; // 배경 이미지의 크기를 100%로 설정 + background-size: 100% 100%; // 배경 이미지의 크기를 100%로 설정 padding: 0 20px; z-index: 900; - .itemsWrapper{ - margin: 0 auto; - left: 0; - right: 0; - display: flex; - position: absolute; - justify-content: space-evenly; - align-items: center; - width: 100%; - } + .itemsWrapper { + margin: 0 auto; + left: 0; + right: 0; + display: flex; + position: absolute; + justify-content: space-evenly; + align-items: center; + width: 100%; + } .logoBox { width: 150px; @@ -85,35 +85,34 @@ } } - - .cart { - position: relative; - width: 60px; - height: 60px; - bottom: 12px; - left:40px; - - .cartPhoto { - cursor: auto; - box-sizing: border-box; - position: absolute; - width: 50px; - height: 50px; - border-radius: 50%; - background-position: center; - background-size: contain; - background-repeat: no-repeat; - } + .cart { + position: relative; + width: 60px; + height: 60px; + bottom: 12px; + left: 40px; + + .cartPhoto { + cursor: auto; + box-sizing: border-box; + position: absolute; + width: 50px; + height: 50px; + border-radius: 50%; + background-position: center; + background-size: contain; + background-repeat: no-repeat; } + } } - .Input-Buttom{ + .Input-Buttom { width: 400px; padding-bottom: 80px; background-color: #ffff; position: absolute; margin-top: 45px; - max-height: 200px; + max-height: 200px; overflow-y: auto; display: flex; border: 1px solid black; @@ -124,7 +123,7 @@ padding-bottom: 100px; margin-top: 10px; - .Input-Buttom__innerBox{ + .Input-Buttom__innerBox { width: 340px; height: 160px; margin: 0 auto; @@ -132,20 +131,20 @@ margin-top: 12px; border-bottom: 1px solid black; - .Input-Buttom__ImageBox{ + .Input-Buttom__ImageBox { width: 100px; padding-bottom: 150px; margin-left: 20px; position: relative; background-color: saddlebrown; - img{ + img { width: 100px; height: auto; } } - .Input-Buttom__title{ + .Input-Buttom__title { width: 210px; padding-bottom: 15px; position: relative; @@ -153,11 +152,11 @@ bottom: 100px; display: flex; } - span:nth-child(1){ + span:nth-child(1) { width: 150px; } - span:nth-child(2){ + span:nth-child(2) { position: relative; width: 100px; top: 13px; diff --git a/src/Components/Views/DetailPage/DetailPage.tsx b/src/Components/Views/DetailPage/DetailPage.tsx index 4cfaa369..fcb66198 100644 --- a/src/Components/Views/DetailPage/DetailPage.tsx +++ b/src/Components/Views/DetailPage/DetailPage.tsx @@ -1,10 +1,10 @@ -import BookCustom from "../../../bookcustom/bookcustom"; -import { useEffect, useState } from "react"; -import { useParams, useNavigate } from "react-router-dom"; -import TopHeader from "./components/TopHeader"; -import { getDetail } from "@/Apis/productApi"; -import "./DetailPage.scss"; -import Swal from "sweetalert2"; +import BookCustom from '../../../bookcustom/bookcustom'; +import { useEffect, useState } from 'react'; +import { useParams, useNavigate } from 'react-router-dom'; +import TopHeader from './components/TopHeader'; +import { getDetail } from '@/Apis/productApi'; +import './DetailPage.scss'; +import Swal from 'sweetalert2'; function DetailPage() { interface DetailInfo { @@ -52,11 +52,11 @@ function DetailPage() { useEffect(() => { function scrollListener() { - window.addEventListener("scroll", handleScroll); + window.addEventListener('scroll', handleScroll); } // window 에서 스크롤을 감시 시작 scrollListener(); // window 에서 스크롤을 감시 return () => { - window.removeEventListener("scroll", handleScroll); + window.removeEventListener('scroll', handleScroll); }; // window 에서 스크롤을 감시를 종료 }); @@ -67,30 +67,30 @@ function DetailPage() { })(); }, []); - let token = localStorage.getItem("token"); + const token = localStorage.getItem('token'); const BuyBook = (detail: DetailInfo, type: string) => { - let Cart: DetailInfo[] = JSON.parse(localStorage.getItem("cart") || "[]"); + let Cart: DetailInfo[] = JSON.parse(localStorage.getItem('cart') || '[]'); if (token) { if (Cart.some((item) => item.product_no === detail.product_no)) { - Swal.fire("이미 장바구니에 담으셨습니다!", "", "warning"); + Swal.fire('이미 장바구니에 담으셨습니다!', '', 'warning'); return false; } - if (type === "rent") { + if (type === 'rent') { detail.rentdate = 7; } detail.gubun = type; Cart.push(detail); Cart = Array.from(new Set(Cart)); Cart = [...Cart]; - localStorage.setItem("cart", JSON.stringify(Cart)); - Swal.fire("장바구니에 담겼습니다!", "", "success").then(() => { - navigate("/cart"); + localStorage.setItem('cart', JSON.stringify(Cart)); + Swal.fire('장바구니에 담겼습니다!', '', 'success').then(() => { + navigate('/cart'); }); } else { - Swal.fire("로그인 후 이용해주세요!", "", "warning").then(() => { - navigate("/login"); + Swal.fire('로그인 후 이용해주세요!', '', 'warning').then(() => { + navigate('/login'); }); } }; @@ -102,15 +102,15 @@ function DetailPage() { const modifiedDescription = detail.description ? detail.description.replace(/]*>/gi, (match) => - match.replace("href", "data-disabled-href") + match.replace('href', 'data-disabled-href') ) - : ""; + : ''; const renderCardPriceItems = () => { const cardPriceItems = { - "카드/간편결제할인": "", - "무이자 할부": "", - 소득공제300원: "", + '카드/간편결제할인': '', + '무이자 할부': '', + 소득공제300원: '', }; return Object.entries(cardPriceItems).map(([key]) => ( @@ -150,7 +150,7 @@ function DetailPage() {
    판매가 - {Number(detail.price).toFixed(0)}원{" "} + {Number(detail.price).toFixed(0)}원{' '}
    @@ -164,13 +164,13 @@ function DetailPage() {
    @@ -183,14 +183,14 @@ function DetailPage() { 출판사 제공
    책소개 -
    +
    {isScrolled ? ( ) : ( - "" + '' )}
    diff --git a/src/Components/Views/MyPage/MyPage.scss b/src/Components/Views/MyPage/MyPage.scss index 62cd8e69..f81b9561 100644 --- a/src/Components/Views/MyPage/MyPage.scss +++ b/src/Components/Views/MyPage/MyPage.scss @@ -3,260 +3,163 @@ .MyPage-AllLayout { @include AllLayoutStyle; - .MyPage-AllLayout__center{ + .MyPage-AllLayout__center { @include LayoutCenterStyle; - - .LeftContainer{ + + .LeftContainer { @include LeftContainerStyle; } - .RightContainer{ - @include RightContainerStyle; - - .orderText{ - position: relative; - left:10px; - top: 30px; - width: 100px; - font-size: 25px; - font-weight: bold; - margin-left: 5rem; - } + .RightContainer { + @include RightContainerStyle; + + .orderText { + position: relative; + //left:10px; + top: 30px; + width: 100px; + font-size: 25px; + font-weight: bold; + margin-left: 5rem; + } - .orderContainer{ - position: relative; - padding-bottom: 400px; - top: 50px; - + .orderContainer { + margin-top: 50px; - .TopCategory{ - width: 980px; - border-radius: 10px 10px 0px 0px; - position:relative; - display: flex; - height: 40px; - background-color: #e8e0d6; - gap: 120px; - margin: 0 auto; - - .TopCategory-inner{ - width: 70px; - height: 20px; - position: relative; - margin-left: 25px; - margin-top: 10px; - - } - } + .TopCategory { + width: 100%; + border-radius: 10px 10px 0px 0px; + display: grid; + grid-template-columns: 1fr 1fr 3fr 1fr 1fr; + height: 40px; + background-color: #e8e0d6; + align-items: center; + text-align: center; - .orderBox{ - position: absolute; - padding-bottom: 10px; - width: 980px; - margin: 0 auto; - left: 0; - right: 0; - height: 400px; - max-height: 450px; /* 스크롤 영역의 최대 높이 설정 */ - overflow-y: auto; - background-color: #faf4ee; - border-radius: 0px 0px 10px 10px; + margin: 0 auto; - - .orderList { - display: flex; - width: 960px; - margin: 0 auto; - margin-top: 20px; - padding-bottom: 10px; - border-bottom: 2px solid rgb(208, 203, 185); - - .Buy-ButtonBox{ - width: 30px; - height: 20px; - position: relative; - top:50px; - right: -500px; + .TopCategory-inner { + } + } - button{ - width:inherit; - position: absolute; - } - } + .orderBox { + padding-bottom: 10px; + width: 100%; + margin: 0 auto; + height: 400px; + max-height: 450px; /* 스크롤 영역의 최대 높이 설정 */ + overflow-y: auto; + background-color: #faf4ee; + border-radius: 0px 0px 10px 10px; + + .orderList { + display: grid; + grid-template-columns: 1fr 1fr 3fr 1fr 1fr; + align-items: center; + text-align: center; + width: 100%; + margin: 0 auto; + margin-top: 20px; + padding-bottom: 10px; + border-bottom: 2px solid rgb(208, 203, 185); - .orderList-priceBox{ - width: auto; - position: relative; - left: 350px; - top:50px; - height: 20px; - } + .Buy-ButtonBox { + button { + width: 30px; } + } - .orderList-ImageBox{ - width: 100px; - height: 140px; - position: relative; - left: 180px; - - img{ - position: absolute; - width: 100px; - height: auto; - } - - .orderList-ImageBox__text{ - width: auto; - position: relative; - } - } - - span:nth-child(1) { - position: relative; - left: 10px; - top: 50px; - height: 20px - } + .orderList-priceBox { + } + } - span:nth-child(2) { - position: relative; - top: 50px; - left: 110px; - height: 20px; - } + .orderList-ImageBox { + height: 140px; + display: flex; + align-items: center; + gap: 10px; + padding-right: 10px; - span:nth-child(3) { - position: relative; - top: 50px; - left: 110px; - height: 20px; - background-color: rgb(16, 123, 211); - } + img { + width: 100px; } - } - .RentContainer-text{ - position: relative; - left:10px; - top: 100px; - width: 100px; - font-size: 25px; - font-weight: bold; - margin-left: 5rem; + .orderList-ImageBox__text { + width: 200px; + } + } } + } - .RentContainer{ - position: relative; - padding-bottom: 400px; - top: 120px; - - .RentTop-Category{ - width: 980px; - border-radius: 10px 10px 0px 0px; - position:relative; - display: flex; - height: 40px; - background-color: #e8e0d6; - gap: 120px; - margin: 0 auto; + .RentContainer-text { + margin: 30px 0; + width: 100px; + font-size: 25px; + font-weight: bold; + margin-left: 5rem; + } - .RentCategory-inner{ - width: 70px; - height: 20px; - position: relative; - margin-left: 25px; - margin-top: 10px; - } + .RentContainer { + .RentTop-Category { + width: 100%; + border-radius: 10px 10px 0px 0px; + display: grid; + grid-template-columns: 1fr 1fr 3fr 1fr 1fr; + height: 40px; + background-color: #e8e0d6; + margin: 0 auto; + align-items: center; + text-align: center; + + .RentCategory-inner { } + } - .RentBox{ - position: absolute; - padding-bottom: 10px; - width: 980px; - margin: 0 auto; - left: 0; - right: 0; - height: 400px; - max-height: 450px; - overflow-y: auto; - background-color: #faf4ee; - border-radius: 0px 0px 10px 10px; - - .RentList{ + .RentBox { + padding-bottom: 10px; + width: 100%; + margin: 0 auto; + height: 400px; + max-height: 450px; + overflow-y: auto; + background-color: #faf4ee; + border-radius: 0px 0px 10px 10px; + + .RentList { + display: grid; + align-items: center; + text-align: center; + grid-template-columns: 1fr 1fr 3fr 1fr 1fr; + width: 100%; + margin-top: 20px; + padding-bottom: 20px; + border-bottom: 2px solid rgb(208, 203, 185); + + .RentList-ImageBox { + height: 140px; display: flex; - width: 960px; - margin: 0 auto; - margin-top: 20px; - padding-bottom: 20px; - border-bottom: 2px solid rgb(208, 203, 185); - - .RentList-ImageBox{ - width: 100px; - height: 140px; - position: relative; - left: 180px; - - img{ - position: absolute; - width: 100px; - height: auto; - } - - .RentList-ImageBox__text{ - position: relative; - left:120px; - top: 60px; - width: 150px; - } - } + align-items: center; + gap: 10px; + padding-right: 10px; - span:nth-child(1) { - position: relative; - left: 10px; - top: 60px; - height: 20px; - } - - span:nth-child(2) { - position: relative; - top: 60px; - left: 110px; - height: 20px; + img { + width: 100px; } - span:nth-child(3) { + .RentList-ImageBox__text { position: relative; - top: 60px; - left: 110px; - height: 20px; - } - - .RentList-priceBox{ - width: auto; - position: relative; - left: 350px; - top:60px; - height: 20px; + width: 200px; + height: min-content; } - - .Rent-ButtonBox{ + } + .Rent-ButtonBox { + button { width: 30px; - position: relative; - left: 528px; - top:60px; - height: 20px; - - button{ - width:30px; - position: absolute; - } } - } } - } - } + } } -} \ No newline at end of file +} diff --git a/src/Components/Views/MyPage/MyPage.tsx b/src/Components/Views/MyPage/MyPage.tsx index ed5bbf43..57a52765 100644 --- a/src/Components/Views/MyPage/MyPage.tsx +++ b/src/Components/Views/MyPage/MyPage.tsx @@ -1,26 +1,22 @@ import { useState, useEffect } from 'react'; import axios, { AxiosResponse } from 'axios'; import Category from './common/components/Category'; -import { GetImpToken } from '@/Apis/productApi'; +//import { GetImpToken } from "@/Apis/productApi"; import './MyPage.scss'; import Swal from 'sweetalert2'; - interface PaymentItem { merchant_uid: string; custom_data: string; paid_at: string; } - interface PaymentsResponse { response: { list: PaymentItem[]; }; } - interface CategoryMap { readonly [key: string]: string; } - interface PageData { gubun: string; merchant_uid: string; @@ -30,7 +26,6 @@ interface PageData { custom_data: string; paid_at: string; } - function MyPage() { const TopCategory: CategoryMap = { orderId: '주문번호', @@ -39,25 +34,31 @@ function MyPage() { price: '상품가격', cancel: '구매취소', } as const; - const [itemList, setItemList] = useState([]); const [mydataList, setMydataList] = useState([]); - const GetToken = async () => { try { - const tokenData = await GetImpToken(); - const accessToken = tokenData.data.response.access_token; + const response = await axios.post( + '/iamport/users/getToken', + { + imp_key: '5758023681388354', + imp_secret: + 'tCdwGmiflqhMA3It54n6aLBIeA7LCg0O3WYu5qI1SKpwQ85FKXtJsiHu8yUWTynhDx7fxCFY1wsA3KVc', + }, + { + headers: { 'Content-Type': 'application/json' }, + } + ); + const accessToken = response.data.response.access_token; return accessToken; } catch (error) { console.log(error); throw error; } }; - const fetchData = async (): Promise => { try { const paynumber: string | null = window.localStorage.getItem('mypayment'); - if (paynumber) { const merchantUids = JSON.parse(paynumber); const accessToken = await GetToken(); @@ -65,7 +66,6 @@ function MyPage() { await axios.get( `/iamport/payments/status/paid?limit=20&sorting=paid&_token=${accessToken}` ); - if ( paymentsResponse.data && paymentsResponse.data.response && @@ -89,11 +89,9 @@ function MyPage() { console.log('Error occurred:', error); } }; - useEffect(() => { fetchData(); }, []); - useEffect(() => { setMydataList([]); if (itemList.length === 0) { @@ -112,17 +110,14 @@ function MyPage() { } }); }, [itemList]); - const DeleteList = (itemnum: string) => { const MyPay = localStorage.getItem('mypayment'); - if (MyPay && MyPay.includes(itemnum)) { const updatedList = MyPay.replace(itemnum, '').trim(); localStorage.setItem('mypayment', updatedList); } fetchData(); }; - const onClickDelete = (key: string) => { Swal.fire({ title: '정말 환불하시겠습니까?', @@ -152,12 +147,10 @@ function MyPage() { } }); // if (confirm("주문을 취소 하시겠습니까?")) { - // } else { // Swal.fire("요청이 취소되었습니다!", "", "success"); // } }; - const getDate = function (param: any) { const date = new Date(param * 1000); const koreaTime = date.toLocaleString('ko-KR', { @@ -168,7 +161,6 @@ function MyPage() { }); return koreaTime; }; - return ( <>
    @@ -176,7 +168,7 @@ function MyPage() {
    - + ​
    구매 내역
    @@ -202,7 +194,9 @@ function MyPage() { {item.product_name}
    - {item.price} + + {item.price.toLocaleString()}원 +
    - -
    대여내역
    + ​
    대여내역
    {Object.keys(TopCategory).map((key) => { @@ -257,5 +250,4 @@ function MyPage() { ); } - export default MyPage; diff --git a/src/Components/Views/MyPage/common/StyleCommon.scss b/src/Components/Views/MyPage/common/StyleCommon.scss index 8e464144..5b905716 100644 --- a/src/Components/Views/MyPage/common/StyleCommon.scss +++ b/src/Components/Views/MyPage/common/StyleCommon.scss @@ -1,17 +1,17 @@ @mixin AllLayoutStyle { - width: 1600px; + max-width: 1600px; height: 1300px; position: relative; margin: 0 auto; } @mixin LayoutCenterStyle { - width: 1300px; - position: absolute; + max-width: 1300px; + //position: absolute; display: flex; margin: 0 auto; - left: 0; - right: 0; + //left: 0; + //right: 0; padding-top: 120px; } @@ -22,9 +22,10 @@ } @mixin RightContainerStyle { - width: 1500px; + max-width: 1500px; + width: 80%; border-radius: 0px 10px 10px 0px; - padding-bottom: 178px; - background-color: #F2E7D5; + padding: 0 20px 30px; + //padding-bottom: 178px; + background-color: #f2e7d5; } - From e0fd4297078cfb4081b8df9f992f4d1c994f97c7 Mon Sep 17 00:00:00 2001 From: hahahaday12 Date: Sat, 1 Jul 2023 12:17:53 +0900 Subject: [PATCH 68/75] =?UTF-8?q?fix:=20=EB=B3=80=EA=B2=BD=EC=82=AC?= =?UTF-8?q?=ED=95=AD=20=EC=A0=80=EC=9E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Apis/productApi.ts | 36 ++--- src/Common/Layout/Footer/footer.scss | 61 +++++---- src/Common/Layout/Footer/footer.tsx | 128 ++++++++++-------- src/Common/Layout/Header/header.tsx | 3 + src/Components/Views/CartPage/CartPage.tsx | 16 --- .../Views/CartPage/CartRent/CartRent.scss | 7 +- .../Views/CartPage/CartRent/CartRent.tsx | 6 +- .../Views/DetailPage/DetailPage.tsx | 2 +- src/Components/Views/MyPage/MyPage.scss | 7 +- src/Components/Views/MyPage/MyPage.tsx | 70 +++++++--- ....timestamp-1687497662715-2af11b3632e8c.mjs | 1 + 11 files changed, 188 insertions(+), 149 deletions(-) diff --git a/src/Apis/productApi.ts b/src/Apis/productApi.ts index eb579c70..14e67edd 100644 --- a/src/Apis/productApi.ts +++ b/src/Apis/productApi.ts @@ -52,21 +52,21 @@ export async function getDetail(product_no: string) { } } -export const GetImpToken = async () => { - try { - const response = await axios.post( - '/iamport/users/getToken', - { - imp_key: '5758023681388354', - imp_secret: 'tCdwGmiflqhMA3It54n6aLBIeA7LCg0O3WYu5qI1SKpwQ85FKXtJsiHu8yUWTynhDx7fxCFY1wsA3KVc', - }, - { - headers: { 'Content-Type': 'application/json' }, - } - ); - return response.data; - } catch (error) { - console.error(error); - throw error; - } -}; \ No newline at end of file +// export const GetImpToken = async () => { +// try { +// const response = await axios.post( +// '/iamport/users/getToken', +// { +// imp_key: '5758023681388354', +// imp_secret: 'tCdwGmiflqhMA3It54n6aLBIeA7LCg0O3WYu5qI1SKpwQ85FKXtJsiHu8yUWTynhDx7fxCFY1wsA3KVc', +// }, +// { +// headers: { 'Content-Type': 'application/json' }, +// } +// ); +// return response.data; +// } catch (error) { +// console.error(error); +// throw error; +// } +// }; \ No newline at end of file diff --git a/src/Common/Layout/Footer/footer.scss b/src/Common/Layout/Footer/footer.scss index e32690b8..97d029ac 100644 --- a/src/Common/Layout/Footer/footer.scss +++ b/src/Common/Layout/Footer/footer.scss @@ -1,49 +1,62 @@ footer { - bottom: 0; + display: flex; + flex-wrap: wrap; width: 100%; background-color: rgb(255, 255, 255); height: 100px; position: relative; border-top: solid 2px rgb(202, 159, 18); z-index: 9999; +} + +.footerContainer { + position: relative; + width: 100%; + max-width: 100%; + margin: 0 auto; + height: 100%; + display: flex; + align-items: center; + justify-content: space-around; + padding: 0 20px; +} + +.Logo-box { + display: flex; + align-items: center; + + img { + width: 80px; + height: 80px; + } +} + +.Footer-inner { + display: flex; + align-items: center; + gap: 20px; - .Footer-inner { + .wrap { display: flex; flex-direction: column; position: relative; justify-content: center; align-items: center; - margin-top: 20px; + padding: 0 10px; &:hover { cursor: pointer; } + p { font-size: 12px; margin-top: 5px; } } } -.Logo-box { - position: absolute; - left: 170px; - img { - width: 80px; - top: 15px; - position: absolute; - margin: 0 auto; - left: 0; - right: 0; - } -} .title { - position: absolute; - font-size: 25px; - width: 400px; - height: 40px; - margin: 0 auto; - left: 0; - right: 0; - margin-top: 30px; -} + font-size: 20px; + text-align: center; + margin: 0; +} \ No newline at end of file diff --git a/src/Common/Layout/Footer/footer.tsx b/src/Common/Layout/Footer/footer.tsx index 342b04b1..040c19c7 100644 --- a/src/Common/Layout/Footer/footer.tsx +++ b/src/Common/Layout/Footer/footer.tsx @@ -10,70 +10,82 @@ const Footer = () => { const Jinyoung = "https://github.com/jinyoungpark231"; const Twinkle = "https://github.com/KDT5TeamWink"; + return (
    -
    -
    - { - window.open(Twinkle); - }} - /> -

    Twinkle

    -
    -
    - { - window.open(Donguk); - }} - /> -

    서동욱

    -
    -
    - { - window.open(Haeun); - }} - /> -

    김하은

    -
    -
    - { - window.open(Saeyeon); - }} - /> -

    김세연

    +
    +
    + logo_image
    -
    - { - window.open(Daehyun); - }} - /> -

    문대현

    +

    ToyProject ©️ 5기 7조 Twinkle

    +
    +
    + { + window.open(Twinkle); + }} + /> +

    Twinkle

    +
    +
    + { + window.open(Donguk); + }} + /> +

    서동욱

    +
    +
    + { + window.open(Haeun); + }} + /> +

    김하은

    +
    +
    + { + window.open(Saeyeon); + }} + /> +

    김세연

    +
    +
    + { + window.open(Daehyun); + }} + /> +

    문대현

    +
    +
    + { + window.open(Jinyoung); + }} + /> +

    박진영

    +
    -
    - { - window.open(Jinyoung); - }} - /> -

    박진영

    -
    -
    -
    - logo_image +
    -

    toyproject ©️ 5기 7조 twinkle

    ); + + }; export default Footer; \ No newline at end of file diff --git a/src/Common/Layout/Header/header.tsx b/src/Common/Layout/Header/header.tsx index 0ecf0353..45bce543 100644 --- a/src/Common/Layout/Header/header.tsx +++ b/src/Common/Layout/Header/header.tsx @@ -130,6 +130,9 @@ function Header() { onBlur={() => { setShowInputButton(false); }} + onFocus={() => { + setShowInputButton(true); + }} />
    - -
    -
    - 총 결제 예상 금액 - ${Total} -
    -
    - -
    - {/* */} - -
    diff --git a/src/Components/Views/CartPage/CartRent/CartRent.scss b/src/Components/Views/CartPage/CartRent/CartRent.scss index 357f0550..48334e7c 100644 --- a/src/Components/Views/CartPage/CartRent/CartRent.scss +++ b/src/Components/Views/CartPage/CartRent/CartRent.scss @@ -80,19 +80,20 @@ } .Rental-TextInner { - width: 400px; + width: 150px; height: 100px; position: absolute; top: 1px; left: 260px; font-size: 20px; + background-color: yellow; } .Rental-PriceInner { width: 100px; - height: 30px; + height: 40px; position: absolute; - top: 50px; + top: 60px; left: 420px; font-size: 18px; } diff --git a/src/Components/Views/CartPage/CartRent/CartRent.tsx b/src/Components/Views/CartPage/CartRent/CartRent.tsx index 48fce65f..b41a8bd1 100644 --- a/src/Components/Views/CartPage/CartRent/CartRent.tsx +++ b/src/Components/Views/CartPage/CartRent/CartRent.tsx @@ -124,12 +124,12 @@ interface RentItem { cartbookimage
    - {el.name} + {el.product_name}
    -
    + {/*
    {Number(el.price).toFixed(0)}원 -
    +
    */}
    {el.rentdate}일
    diff --git a/src/Components/Views/DetailPage/DetailPage.tsx b/src/Components/Views/DetailPage/DetailPage.tsx index 4cfaa369..ecfbc9f7 100644 --- a/src/Components/Views/DetailPage/DetailPage.tsx +++ b/src/Components/Views/DetailPage/DetailPage.tsx @@ -67,7 +67,7 @@ function DetailPage() { })(); }, []); - let token = localStorage.getItem("token"); + const token = localStorage.getItem("token"); const BuyBook = (detail: DetailInfo, type: string) => { let Cart: DetailInfo[] = JSON.parse(localStorage.getItem("cart") || "[]"); diff --git a/src/Components/Views/MyPage/MyPage.scss b/src/Components/Views/MyPage/MyPage.scss index 62cd8e69..149b72b8 100644 --- a/src/Components/Views/MyPage/MyPage.scss +++ b/src/Components/Views/MyPage/MyPage.scss @@ -76,16 +76,15 @@ height: 20px; position: relative; top:50px; - right: -500px; + left: 480px; button{ width:inherit; - position: absolute; } } .orderList-priceBox{ - width: auto; + width: 100px; position: relative; left: 350px; top:50px; @@ -232,7 +231,7 @@ } .RentList-priceBox{ - width: auto; + width:100px; position: relative; left: 350px; top:60px; diff --git a/src/Components/Views/MyPage/MyPage.tsx b/src/Components/Views/MyPage/MyPage.tsx index 471f7e27..cda1bcd6 100644 --- a/src/Components/Views/MyPage/MyPage.tsx +++ b/src/Components/Views/MyPage/MyPage.tsx @@ -1,7 +1,7 @@ import { useState, useEffect } from "react"; import axios, { AxiosResponse } from "axios"; import Category from "./common/components/Category"; -import { GetImpToken } from "@/Apis/productApi"; +//import { GetImpToken } from "@/Apis/productApi"; import "./MyPage.scss"; import Swal from "sweetalert2"; @@ -43,16 +43,24 @@ function MyPage() { const [itemList, setItemList] = useState([]); const [mydataList, setMydataList] = useState([]); - const GetToken = async () => { - try { - const tokenData = await GetImpToken(); - const accessToken = tokenData.data.response.access_token; - return accessToken; + const GetToken = async () => { + try{ + const response = await axios.post('/iamport/users/getToken', + { + imp_key: '5758023681388354', + imp_secret: 'tCdwGmiflqhMA3It54n6aLBIeA7LCg0O3WYu5qI1SKpwQ85FKXtJsiHu8yUWTynhDx7fxCFY1wsA3KVc', + }, + { + headers: { 'Content-Type': 'application/json' }, + } + ); + const accessToken = response.data.response.access_token; + return accessToken; } catch (error) { console.log(error); throw error; - } - }; + } + } const fetchData = async (): Promise => { try { @@ -99,18 +107,37 @@ function MyPage() { if (itemList.length === 0) { return; } - const useData = itemList.filter((item) => item.custom_data); + // const useData = itemList.filter((item) => item.custom_data); + // useData.forEach((item) => { + // if (item.custom_data) { + // let parsedData: PageData[] = JSON.parse(item.custom_data); + // parsedData = parsedData.map((data) => ({ + // ...data, + // paid_at: item.paid_at, + // merchant_uid: item.merchant_uid, + // })); + // setMydataList((prevDataList) => [...prevDataList, ...parsedData]); + // } + // }); + // }, [itemList]); + + const useData = itemList.filter((item) => item.custom_data); useData.forEach((item) => { - if (item.custom_data) { - let parsedData: PageData[] = JSON.parse(item.custom_data); - parsedData = parsedData.map((data) => ({ - ...data, - paid_at: item.paid_at, - merchant_uid: item.merchant_uid, - })); - setMydataList((prevDataList) => [...prevDataList, ...parsedData]); - } - }); + if (item.custom_data) { + try { + let parsedData: PageData[] = JSON.parse(item.custom_data); + parsedData = parsedData.map((data) => ({ + ...data, + paid_at: item.paid_at, + merchant_uid: item.merchant_uid, + })); + setMydataList((prevDataList) => [...prevDataList, ...parsedData]); + } catch (error) { + console.error("Error parsing custom_data:", error); + // Handle the error, e.g., show a message or skip this item + } + } + }); }, [itemList]); const DeleteList = (itemnum: string) => { @@ -202,11 +229,10 @@ function MyPage() { {item.product_name}
    - {item.price} + {item.price.toLocaleString()}원
    diff --git a/vite.config.ts.timestamp-1687497662715-2af11b3632e8c.mjs b/vite.config.ts.timestamp-1687497662715-2af11b3632e8c.mjs index ba7ac111..767efed3 100644 --- a/vite.config.ts.timestamp-1687497662715-2af11b3632e8c.mjs +++ b/vite.config.ts.timestamp-1687497662715-2af11b3632e8c.mjs @@ -4,6 +4,7 @@ import react from "file:///C:/Users/user/Desktop/WinkBook/node_modules/@vitejs/p import sassDts from "file:///C:/Users/user/Desktop/WinkBook/node_modules/vite-plugin-sass-dts/dist/index.js"; import mkcert from "file:///C:/Users/user/Desktop/WinkBook/node_modules/vite-plugin-mkcert/dist/mkcert.mjs"; import path from "path"; + var __dirname = path.resolve(); var vite_config_default = defineConfig({ plugins: [react(), sassDts(), mkcert()], From f6f6c74c25ba11e1824323cd001278e106263585 Mon Sep 17 00:00:00 2001 From: Seo Donguk Date: Sat, 1 Jul 2023 18:04:13 +0900 Subject: [PATCH 69/75] =?UTF-8?q?fix:=20=EA=B2=B0=EC=A0=9C=EB=82=B4?= =?UTF-8?q?=EC=97=AD=20=EC=B6=9C=EB=A0=A5=20=EB=B0=8F=20=EB=AF=B8=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=20=EB=B3=80=EC=88=98=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Common/Layout/Footer/footer.tsx | 6 +---- src/Components/Views/MyPage/MyPage.tsx | 37 ++++++++++++++++++-------- 2 files changed, 27 insertions(+), 16 deletions(-) diff --git a/src/Common/Layout/Footer/footer.tsx b/src/Common/Layout/Footer/footer.tsx index 5ce7e04b..42b44f63 100644 --- a/src/Common/Layout/Footer/footer.tsx +++ b/src/Common/Layout/Footer/footer.tsx @@ -1,10 +1,6 @@ import './footer.scss'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; -import { - faGithub, - faFacebook, - faSquareInstagram, -} from '@fortawesome/free-brands-svg-icons'; +import { faGithub } from '@fortawesome/free-brands-svg-icons'; const Footer = () => { const Donguk = 'https://github.com/foodeco'; diff --git a/src/Components/Views/MyPage/MyPage.tsx b/src/Components/Views/MyPage/MyPage.tsx index 57a52765..833d1e03 100644 --- a/src/Components/Views/MyPage/MyPage.tsx +++ b/src/Components/Views/MyPage/MyPage.tsx @@ -64,7 +64,7 @@ function MyPage() { const accessToken = await GetToken(); const paymentsResponse: AxiosResponse = await axios.get( - `/iamport/payments/status/paid?limit=20&sorting=paid&_token=${accessToken}` + `/iamport/payments/status/paid?limit=100&sorting=paid&_token=${accessToken}` ); if ( paymentsResponse.data && @@ -97,16 +97,31 @@ function MyPage() { if (itemList.length === 0) { return; } + const checkJson = function (str: string) { + try { + JSON.parse(str); + } catch (e) { + return false; + } + return true; + }; const useData = itemList.filter((item) => item.custom_data); useData.forEach((item) => { - if (item.custom_data) { - let parsedData: PageData[] = JSON.parse(item.custom_data); - parsedData = parsedData.map((data) => ({ - ...data, - paid_at: item.paid_at, - merchant_uid: item.merchant_uid, - })); - setMydataList((prevDataList) => [...prevDataList, ...parsedData]); + console.log(checkJson(item.custom_data)); + if (checkJson(item.custom_data)) { + try { + let parsedData: PageData[] = JSON.parse(item.custom_data); + console.log(JSON.parse(item.custom_data) + 'dddddd'); + parsedData = parsedData.map((data) => ({ + ...data, + paid_at: item.paid_at, + merchant_uid: item.merchant_uid, + })); + setMydataList((prevDataList) => [...prevDataList, ...parsedData]); + } catch (error) { + console.error('Error parsing custom_data:', error); + // Handle the error, e.g., show a message or skip this item + } } }); }, [itemList]); @@ -168,7 +183,7 @@ function MyPage() {
    - ​ +
    구매 내역
    @@ -208,7 +223,7 @@ function MyPage() { ))}
    - ​
    대여내역
    +
    대여내역
    {Object.keys(TopCategory).map((key) => { From 7078bbda26c8a28147c4d43c010990585db8b8c8 Mon Sep 17 00:00:00 2001 From: hahahaday12 Date: Sun, 2 Jul 2023 00:23:01 +0900 Subject: [PATCH 70/75] =?UTF-8?q?fix:=20=EA=B8=B0=EB=8A=A5=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=EC=82=AC=ED=95=AD=20=20-=20=EC=8A=A4=ED=83=80?= =?UTF-8?q?=EC=9D=BC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Common/Form/Login/login.tsx | 2 +- src/Common/Layout/Header/header.tsx | 14 +++--- .../Views/CartPage/CartItems/CartItems.scss | 4 +- .../Views/CartPage/CartItems/CartItems.tsx | 5 ++- src/Components/Views/CartPage/CartPage.scss | 8 ++-- .../Views/CartPage/CartRent/CartRent.scss | 37 +++++++--------- .../Views/CartPage/CartRent/CartRent.tsx | 18 ++++---- src/Components/Views/MyPage/MyPage.tsx | 44 ++++++++----------- src/Components/Views/MyPage/UserInfo.scss | 31 ++++++------- src/Components/Views/MyPage/UserInfo.tsx | 20 ++++++--- 10 files changed, 89 insertions(+), 94 deletions(-) diff --git a/src/Common/Form/Login/login.tsx b/src/Common/Form/Login/login.tsx index 8a4af809..d7eb27a1 100644 --- a/src/Common/Form/Login/login.tsx +++ b/src/Common/Form/Login/login.tsx @@ -79,7 +79,7 @@ function Login() {
    {keyword && - filteredItems.map((v: Product) => { - if (v.product_name.trim() !== '') { + filteredItems.map((item: Product) => { + if (item.product_name.trim() !== '') { return (
    - searchbookimage + searchbookimage
    - {v.product_name} - {v.price.slice(0, -3)}원 + {item.product_name} + {item.price.slice(0, -3)}원
    ); diff --git a/src/Components/Views/CartPage/CartItems/CartItems.scss b/src/Components/Views/CartPage/CartItems/CartItems.scss index 38c45c10..76163599 100644 --- a/src/Components/Views/CartPage/CartItems/CartItems.scss +++ b/src/Components/Views/CartPage/CartItems/CartItems.scss @@ -70,11 +70,11 @@ position: relative; bottom: 10px; margin-left: 160px; - background-color: rebeccapurple; + //background-color: rebeccapurple; img { width: inherit; - background-color: orange; + //color: orange; height: auto; } } diff --git a/src/Components/Views/CartPage/CartItems/CartItems.tsx b/src/Components/Views/CartPage/CartItems/CartItems.tsx index abac1335..14cd6b89 100644 --- a/src/Components/Views/CartPage/CartItems/CartItems.tsx +++ b/src/Components/Views/CartPage/CartItems/CartItems.tsx @@ -9,7 +9,7 @@ interface BuyItem { id: number; gubun: string; product_name: string; - price: number; + price: string; detail_image: string; product_no: number; buyItem:number; @@ -90,6 +90,7 @@ const CartItems = ({ checkedItems.length < buyItem.length } onChange={handleChange1} + style={{marginTop:"8px"}} />
    } @@ -122,7 +123,7 @@ const CartItems = ({
    - {Number(el.price).toFixed(0)}원 + {el.price.slice(0, -3)}원
    diff --git a/src/Components/Views/CartPage/CartPage.scss b/src/Components/Views/CartPage/CartPage.scss index 5daadd62..c53442d5 100644 --- a/src/Components/Views/CartPage/CartPage.scss +++ b/src/Components/Views/CartPage/CartPage.scss @@ -80,15 +80,15 @@ .NowBuy { width: 500px; position: absolute; - height: 120px; + height: 100px; left: 100px; border-bottom: 2px solid black; .Buy-Container { - width: 250px; + width: 270px; position: absolute; padding-bottom: 10px; - background-color: gold; + //background-color: gold; margin: 0 auto; left: 150px; right: 0; @@ -96,7 +96,7 @@ .Pay-Container { width: inherit; - background-color: rosybrown; + //background-color: rosybrown; display: flex; gap: 40px; font-size: 20px; diff --git a/src/Components/Views/CartPage/CartRent/CartRent.scss b/src/Components/Views/CartPage/CartRent/CartRent.scss index 48334e7c..2ae3fb82 100644 --- a/src/Components/Views/CartPage/CartRent/CartRent.scss +++ b/src/Components/Views/CartPage/CartRent/CartRent.scss @@ -23,22 +23,22 @@ .Rental-Namebox { @include CartNameStyle; - left: 160px; + left: 230px; } - .Renatal-Price { + .RentDay { @include CartNameStyle; - left: 400px; + left: 520px; } - - .RentDay { + + .Renatal-Price { @include CartNameStyle; - right: 400px; + right: 370px; } .DeleteDay { @include CartNameStyle; - right: 150px; + right: 120px; } } @@ -68,13 +68,11 @@ .ImageBox { width: 100px; position: relative; - bottom: 10px; + bottom: 5px; margin-left: 120px; - background-color: rebeccapurple; img { width: inherit; - background-color: orange; height: auto; } } @@ -83,38 +81,33 @@ width: 150px; height: 100px; position: absolute; - top: 1px; + top: 25px; left: 260px; font-size: 20px; - background-color: yellow; } .Rental-PriceInner { width: 100px; - height: 40px; position: absolute; - top: 60px; - left: 420px; + top: 50px; + right: 320px; font-size: 18px; } .Rental-RentDay { - width: 50px; + width: 100px; + height: 40px; position: absolute; top: 50px; - right: 420px; + left: 540px; font-size: 18px; - - span { - width: auto; - } } .RentButtonBox { width: 60px; position: absolute; top: 40px; - right: 110px; + right: 90px; button { display: block; diff --git a/src/Components/Views/CartPage/CartRent/CartRent.tsx b/src/Components/Views/CartPage/CartRent/CartRent.tsx index b41a8bd1..f80981e6 100644 --- a/src/Components/Views/CartPage/CartRent/CartRent.tsx +++ b/src/Components/Views/CartPage/CartRent/CartRent.tsx @@ -8,7 +8,7 @@ import './CartRent.scss' interface RentItem { id: number; product_name: string; - price: number; + price: string; detail_image: string; product_no: number; gubun: string; @@ -90,6 +90,7 @@ interface RentItem { checked={allCheck} indeterminate={checkedItems.length > 0 && checkedItems.length < buyItem.length} onChange={handleChange1} + style={{marginTop:"8px"}} />
    } @@ -98,13 +99,13 @@ interface RentItem { 상품명
    -
    -

    대여가격

    +
    +

    대여날짜

    -
    - 대여날짜 +
    + 대여가격
    @@ -126,13 +127,12 @@ interface RentItem {
    {el.product_name}
    - - {/*
    - {Number(el.price).toFixed(0)}원 -
    */}
    {el.rentdate}일
    +
    + {el.price.slice(0, -3)}원 +
    - ​
    대여내역
    +
    대여내역
    {Object.keys(TopCategory).map((key) => { @@ -250,7 +244,7 @@ function MyPage() { {item.product_name}
    - {item.price} + {item.price.slice(0, -3)}원
    - - 파일 용량은 1MB를 초과할 수 없습니다. - -
    - + 파일 용량은 1MB를 초과할 수 없습니다. + +
    + {selectedImage ? ( + Preview + ) : ( + 이미지 미리보기 + )} +
    +
    +
    + + + +
    From 041676a4e6de840dd4465e1f7263568edeecfd71 Mon Sep 17 00:00:00 2001 From: hahahaday12 Date: Sun, 2 Jul 2023 00:55:31 +0900 Subject: [PATCH 71/75] =?UTF-8?q?fix:=20api=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Apis/productApi.ts | 35 +++++++++++--------------- src/Components/Views/MyPage/MyPage.tsx | 17 +++---------- 2 files changed, 19 insertions(+), 33 deletions(-) diff --git a/src/Apis/productApi.ts b/src/Apis/productApi.ts index 14e67edd..5649f758 100644 --- a/src/Apis/productApi.ts +++ b/src/Apis/productApi.ts @@ -1,6 +1,6 @@ import axios from 'axios'; -const { VITE_CLIENT_ID } = import.meta.env; +const { VITE_CLIENT_ID, VITE_IMP_KEY, VITE_IMP_SECRET } = import.meta.env; const ajax = axios.create({ baseURL: '/cafe24', @@ -27,7 +27,6 @@ export async function getList(info: GetList) { limit: info.limit }, }); - //console.log(data.products); return data.products; } catch (err) { console.log(err); @@ -52,21 +51,17 @@ export async function getDetail(product_no: string) { } } -// export const GetImpToken = async () => { -// try { -// const response = await axios.post( -// '/iamport/users/getToken', -// { -// imp_key: '5758023681388354', -// imp_secret: 'tCdwGmiflqhMA3It54n6aLBIeA7LCg0O3WYu5qI1SKpwQ85FKXtJsiHu8yUWTynhDx7fxCFY1wsA3KVc', -// }, -// { -// headers: { 'Content-Type': 'application/json' }, -// } -// ); -// return response.data; -// } catch (error) { -// console.error(error); -// throw error; -// } -// }; \ No newline at end of file +export const MypageToken = async () => { + + const response = await axios.post('/iamport/users/getToken', + { + imp_key: VITE_IMP_KEY, + imp_secret: VITE_IMP_SECRET, + }, + { + headers: { 'Content-Type': 'application/json' }, + } + ); + const accessToken = response.data.response.access_token; + return accessToken; +} \ No newline at end of file diff --git a/src/Components/Views/MyPage/MyPage.tsx b/src/Components/Views/MyPage/MyPage.tsx index d1e38aef..3ecacf4f 100644 --- a/src/Components/Views/MyPage/MyPage.tsx +++ b/src/Components/Views/MyPage/MyPage.tsx @@ -1,7 +1,7 @@ import { useState, useEffect } from 'react'; import axios, { AxiosResponse } from 'axios'; import Category from './common/components/Category'; -//import { GetImpToken } from "@/Apis/productApi"; +import { MypageToken } from '@/Apis/productApi'; import './MyPage.scss'; import Swal from 'sweetalert2'; @@ -40,21 +40,12 @@ function MyPage() { const GetToken = async () => { try{ - const response = await axios.post('/iamport/users/getToken', - { - imp_key: '5758023681388354', - imp_secret: 'tCdwGmiflqhMA3It54n6aLBIeA7LCg0O3WYu5qI1SKpwQ85FKXtJsiHu8yUWTynhDx7fxCFY1wsA3KVc', - }, - { - headers: { 'Content-Type': 'application/json' }, - } - ); - const accessToken = response.data.response.access_token; - return accessToken; + const accessToken = await MypageToken(); + return accessToken; } catch (error) { console.log(error); throw error; - } + } } const fetchData = async (): Promise => { From 67dc83d29a88b24bd13f118d04f63a05761283a8 Mon Sep 17 00:00:00 2001 From: hahahaday12 Date: Sun, 2 Jul 2023 16:34:59 +0900 Subject: [PATCH 72/75] =?UTF-8?q?fix:=20=EC=98=A4=EB=A5=98=EC=82=AC?= =?UTF-8?q?=ED=95=AD=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Apis/common.d.ts | 4 +- src/Common/Layout/Header/header.tsx | 6 +- .../Views/CartPage/CartItems/CartItems.tsx | 6 +- src/Components/Views/CartPage/CartPage.tsx | 16 +- .../Views/CartPage/CartRent/CartRent.tsx | 6 +- .../Views/CartPage/Payment/Payment.tsx | 76 +++++++--- .../Views/DetailPage/DetailPage.tsx | 5 +- .../Views/DetailPage/components/TopHeader.tsx | 5 +- .../Views/MainPage/Component/BookInfo.tsx | 12 +- src/Components/Views/MyPage/MyPage.tsx | 138 +++++++++++++++--- .../Views/SearchPage/SearchPage.tsx | 6 +- 11 files changed, 218 insertions(+), 62 deletions(-) diff --git a/src/Apis/common.d.ts b/src/Apis/common.d.ts index 80111fcc..82fb97c0 100644 --- a/src/Apis/common.d.ts +++ b/src/Apis/common.d.ts @@ -75,11 +75,11 @@ declare type Product = { 상품의 판매 가격. 쿠폰 및 혜택을 적용하기 전의 가격. 상품 등록시엔 모든 멀티 쇼핑몰에 동일한 가격으로 등록하며, 멀티쇼핑몰별로 다른 가격을 입력하고자 할 경우 상품 수정을 통해 가격을 다르게 입력할 수 있다. ※ 판매가 = [ 공급가 + (공급가 * 마진율) + 추가금액 ] */ - price: string; + price: number; /** 상품 소비자가 시중에 판매되는 소비자 가격. 쇼핑몰의 가격을 강조하기 위한 비교 목적으로 사용함. */ - retail_price: string; + retail_price: number; /** 진열상태 상품을 쇼핑몰에 진열할지 여부. 상품을 쇼핑몰에 진열할 경우 설정한 상품분류와 메인화면에 표시된다. 상품이 쇼핑몰에 진열되어 있지 않으면 쇼핑몰 화면에 표시되지 않아 접근할 수 없으며 상품을 구매할 수 없다. diff --git a/src/Common/Layout/Header/header.tsx b/src/Common/Layout/Header/header.tsx index 3c96eb24..f479e312 100644 --- a/src/Common/Layout/Header/header.tsx +++ b/src/Common/Layout/Header/header.tsx @@ -15,7 +15,7 @@ interface Product { product_no: number; product_name: string; small_image: string; - price: string; + price: number; } function Header() { @@ -114,6 +114,8 @@ function Header() { })(); }, []); + const formatter = new Intl.NumberFormat("ko-KR"); + return ( <>
    @@ -158,7 +160,7 @@ function Header() {
    {item.product_name} - {item.price.slice(0, -3)}원 + {formatter.format(item.price)}원
    ); diff --git a/src/Components/Views/CartPage/CartItems/CartItems.tsx b/src/Components/Views/CartPage/CartItems/CartItems.tsx index 14cd6b89..44a1dd38 100644 --- a/src/Components/Views/CartPage/CartItems/CartItems.tsx +++ b/src/Components/Views/CartPage/CartItems/CartItems.tsx @@ -9,7 +9,7 @@ interface BuyItem { id: number; gubun: string; product_name: string; - price: string; + price: number; detail_image: string; product_no: number; buyItem:number; @@ -75,6 +75,8 @@ const CartItems = ({ ); + const formatter = new Intl.NumberFormat("ko-KR"); + return ( <>
    @@ -123,7 +125,7 @@ const CartItems = ({
    - {el.price.slice(0, -3)}원 + {formatter.format(el.price)}원
    diff --git a/src/Components/Views/CartPage/CartPage.tsx b/src/Components/Views/CartPage/CartPage.tsx index a50eda27..bc84dc36 100644 --- a/src/Components/Views/CartPage/CartPage.tsx +++ b/src/Components/Views/CartPage/CartPage.tsx @@ -8,7 +8,7 @@ import Swal from "sweetalert2"; interface BuyItem { id: number; product_name: string; - price: string; + price: number; detail_image: string; product_no: number; } @@ -84,10 +84,14 @@ function CartPage() { console.log(selectedItem); let total = 0; if (Array.isArray(selectedItem)) { - selectedItem.forEach((item) => { - const itemPrice = parseFloat(item.price); + selectedItem.forEach((item:any) => { + const itemPrice= parseInt(item.price); + console.log(itemPrice) if (!isNaN(itemPrice)) { + console.log(typeof itemPrice) + total += itemPrice; + console.log(total); } }); } else { @@ -128,6 +132,7 @@ function CartPage() { } }); }; + const formatter = new Intl.NumberFormat("ko-KR"); return ( <> @@ -159,14 +164,15 @@ function CartPage() {
    총 상품 가격 - {ShowTotal &&

    ${Total}원

    } + {/* {ShowTotal &&

    ${Total}원

    } */} + {ShowTotal &&

    {formatter.format(Total)}원

    }
    총 결제 예상 금액 - ${Total} + {formatter.format(Total)}원
    diff --git a/src/Components/Views/CartPage/CartRent/CartRent.tsx b/src/Components/Views/CartPage/CartRent/CartRent.tsx index f80981e6..f972435b 100644 --- a/src/Components/Views/CartPage/CartRent/CartRent.tsx +++ b/src/Components/Views/CartPage/CartRent/CartRent.tsx @@ -8,7 +8,7 @@ import './CartRent.scss' interface RentItem { id: number; product_name: string; - price: string; + price: number; detail_image: string; product_no: number; gubun: string; @@ -78,6 +78,8 @@ interface RentItem { ); + const formatter = new Intl.NumberFormat("ko-KR"); + return( <>
    @@ -131,7 +133,7 @@ interface RentItem { {el.rentdate}일
    - {el.price.slice(0, -3)}원 + {formatter.format(el.price)}원
    - {item.price.slice(0, -3)}원 + {formatter.format(item.price)}원
    -

    {item.price.slice(0, -3)}원

    -

    {item.retail_price.slice(0, -3)}원

    +

    {formatter.format(item.price)}원

    +

    {formatter.format(item.retail_price)}원

    From 305d5b2030e86108750297468d28488d81465d7c Mon Sep 17 00:00:00 2001 From: hahahaday12 Date: Sun, 2 Jul 2023 16:43:21 +0900 Subject: [PATCH 73/75] =?UTF-8?q?fix:=20title=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- index.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/index.html b/index.html index bb73b662..fd40558a 100644 --- a/index.html +++ b/index.html @@ -2,9 +2,9 @@ - + - Vite + React + TS + WinkBook
    From db8319387ed2e49d3a8d1403c2364e9a0fe0a910 Mon Sep 17 00:00:00 2001 From: Seo Donguk Date: Sun, 2 Jul 2023 16:51:34 +0900 Subject: [PATCH 74/75] =?UTF-8?q?style:=20=EC=A0=9C=EB=AA=A9=ED=81=AC?= =?UTF-8?q?=EA=B8=B0=20=EB=8B=A8=EC=9C=84=20rem=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Components/Views/MyPage/MyPage.scss | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Components/Views/MyPage/MyPage.scss b/src/Components/Views/MyPage/MyPage.scss index f81b9561..71f929e0 100644 --- a/src/Components/Views/MyPage/MyPage.scss +++ b/src/Components/Views/MyPage/MyPage.scss @@ -85,7 +85,7 @@ } .orderList-ImageBox__text { - width: 200px; + width: 12.5rem; } } } @@ -148,7 +148,7 @@ .RentList-ImageBox__text { position: relative; - width: 200px; + width: 12.5rem; height: min-content; } } From 33983f0fa2e3f1ae2687cc26b57420dd2e29a661 Mon Sep 17 00:00:00 2001 From: Seo Donguk Date: Sun, 2 Jul 2023 22:26:41 +0900 Subject: [PATCH 75/75] =?UTF-8?q?doc:=20readme=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- readme.md | 98 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 readme.md diff --git a/readme.md b/readme.md new file mode 100644 index 00000000..410fa409 --- /dev/null +++ b/readme.md @@ -0,0 +1,98 @@ +# WinkBook + +WinkBook은 e-book을 판매하는 컨셉의 쇼핑몰 사이트 입니다. + +총 5개의 도서별 카테고리가 나눠져 있으며 실제 도서 사이트에서 사용하는 상세 설명을 나타내도록 했습니다. + +쇼핑몰을 만들 때 충분히 활용할 수 있는 사이트를 개설하자는 목표를 가지고 진행 되었으며, 실제 오픈 Api를 활용하여 기능을 구현하였습니다. + +
    + +커머스: ![](https://img.cafe24.com/images/common/cafe24.svg) + +결제: ![](https://www.gitbook.com/cdn-cgi/image/width=100,dpr=1,height=40,fit=contain,format=auto/https%3A%2F%2F3026939543-files.gitbook.io%2F~%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FwWX2hlvRZLZrXeH1aacF%252Flogo%252FdtaZNeSUqL59mzfDm6jC%252FPortOne_Logo_Black.png%3Falt%3Dmedia%26token%3Dd66f72ec-8826-4be6-8e09-b0b32ff9a482) + +
    +
    + +# 배포 사이트 + +[WinkBook](https://winkbook.netlify.app) + +[WinkBook-Admin](https://winkbook-admin.netlify.app) + +
    +
    + +# 프로젝트 기간 + +2023.05.30 ~ 2023.07.02 + +
    +
    + +# 기술스택 + +### Develoment + + + + + + + +### Config + + + +### Enviroment + + + + + +### Deployment + + + +
    +
    + +# 프로젝트 주요 기능 + +### 메인 + +- 제품 검색 +- 추천 도서 +- sticky 안내바 + +### 상세페이지 + +- 구매, 대여 버튼 +- 장바구니 자동 이동 + +### 검색 + +- 구매, 대여 버튼 +- 검색 결과 미리보기 + +### 마이페이지 + +- 개인 구매 내역 +- 회원 정보 수정 + +### 어드민페이지 + +- 물건 등록/수정/삭제 +- 전체 회원 목록 +- 전체 결제 내역 + +
    +
    + +# 팀원 + +| [서동욱](https://github.com/foodeco) | [김하은](https://github.com/hahahaday12) | [김세연](https://github.com/saeyeonKim) | [문대현](https://github.com/dhmoon11) | [박진영](https://github.com/jinyoungpark231) | +| :--------------------------------------------------------: | :-------------------------------------------------------------: | :-------------------------------------------------------------: | :-------------------------------------------------------------: | :------------------------------------------------------------: | +| ![](https://avatars.githubusercontent.com/u/106901147?v=4) | ![](https://avatars.githubusercontent.com/u/101441685?s=96&v=4) | ![](https://avatars.githubusercontent.com/u/118176015?s=96&v=4) | ![](https://avatars.githubusercontent.com/u/128357255?s=96&v=4) | ![](https://avatars.githubusercontent.com/u/76546374?s=96&v=4) | +| 메인페이지, 어드민페이지, 카페24&아임포트 토큰 발행 및 api | 장바구니, 마이페이지, 상세페이지, 회원가입, 인증, 결제 및 조회 | 검색페이지, 결제 | 마이페이지, 회원정보 수정 | 검색페이지, 목록조회 |