박민정

[merge] Merge client into develop

Showing 38 changed files with 1046 additions and 60 deletions
...@@ -4,6 +4,43 @@ ...@@ -4,6 +4,43 @@
4 "lockfileVersion": 1, 4 "lockfileVersion": 1,
5 "requires": true, 5 "requires": true,
6 "dependencies": { 6 "dependencies": {
7 + "@ant-design/colors": {
8 + "version": "6.0.0",
9 + "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-6.0.0.tgz",
10 + "integrity": "sha512-qAZRvPzfdWHtfameEGP2Qvuf838NhergR35o+EuVyB5XvSA98xod5r4utvi4TJ3ywmevm290g9nsCG5MryrdWQ==",
11 + "requires": {
12 + "@ctrl/tinycolor": "^3.4.0"
13 + }
14 + },
15 + "@ant-design/icons": {
16 + "version": "4.6.2",
17 + "resolved": "https://registry.npmjs.org/@ant-design/icons/-/icons-4.6.2.tgz",
18 + "integrity": "sha512-QsBG2BxBYU/rxr2eb8b2cZ4rPKAPBpzAR+0v6rrZLp/lnyvflLH3tw1vregK+M7aJauGWjIGNdFmUfpAOtw25A==",
19 + "requires": {
20 + "@ant-design/colors": "^6.0.0",
21 + "@ant-design/icons-svg": "^4.0.0",
22 + "@babel/runtime": "^7.11.2",
23 + "classnames": "^2.2.6",
24 + "rc-util": "^5.9.4"
25 + }
26 + },
27 + "@ant-design/icons-svg": {
28 + "version": "4.1.0",
29 + "resolved": "https://registry.npmjs.org/@ant-design/icons-svg/-/icons-svg-4.1.0.tgz",
30 + "integrity": "sha512-Fi03PfuUqRs76aI3UWYpP864lkrfPo0hluwGqh7NJdLhvH4iRDc3jbJqZIvRDLHKbXrvAfPPV3+zjUccfFvWOQ=="
31 + },
32 + "@ant-design/react-slick": {
33 + "version": "0.28.3",
34 + "resolved": "https://registry.npmjs.org/@ant-design/react-slick/-/react-slick-0.28.3.tgz",
35 + "integrity": "sha512-u3onF2VevGRbkGbgpldVX/nzd7LFtLeZJE0x2xIFT2qYHKkJZ6QT/jQ7KqYK4UpeTndoyrbMqLN4DiJza4BVBg==",
36 + "requires": {
37 + "@babel/runtime": "^7.10.4",
38 + "classnames": "^2.2.5",
39 + "json2mq": "^0.2.0",
40 + "lodash": "^4.17.21",
41 + "resize-observer-polyfill": "^1.5.0"
42 + }
43 + },
7 "@babel/code-frame": { 44 "@babel/code-frame": {
8 "version": "7.12.13", 45 "version": "7.12.13",
9 "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", 46 "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz",
...@@ -1203,6 +1240,11 @@ ...@@ -1203,6 +1240,11 @@
1203 "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-10.1.0.tgz", 1240 "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-10.1.0.tgz",
1204 "integrity": "sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg==" 1241 "integrity": "sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg=="
1205 }, 1242 },
1243 + "@ctrl/tinycolor": {
1244 + "version": "3.4.0",
1245 + "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.4.0.tgz",
1246 + "integrity": "sha512-JZButFdZ1+/xAfpguQHoabIXkcqRRKpMrWKBkpEZZyxfY9C1DpADFB8PEqGSTeFr135SaTRfKqGKx5xSCLI7ZQ=="
1247 + },
1206 "@eslint/eslintrc": { 1248 "@eslint/eslintrc": {
1207 "version": "0.4.1", 1249 "version": "0.4.1",
1208 "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.1.tgz", 1250 "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.1.tgz",
...@@ -2276,6 +2318,15 @@ ...@@ -2276,6 +2318,15 @@
2276 "@types/node": "*" 2318 "@types/node": "*"
2277 } 2319 }
2278 }, 2320 },
2321 + "@types/hoist-non-react-statics": {
2322 + "version": "3.3.1",
2323 + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz",
2324 + "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==",
2325 + "requires": {
2326 + "@types/react": "*",
2327 + "hoist-non-react-statics": "^3.3.0"
2328 + }
2329 + },
2279 "@types/html-minifier-terser": { 2330 "@types/html-minifier-terser": {
2280 "version": "5.1.1", 2331 "version": "5.1.1",
2281 "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", 2332 "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz",
...@@ -2354,11 +2405,37 @@ ...@@ -2354,11 +2405,37 @@
2354 "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.2.3.tgz", 2405 "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.2.3.tgz",
2355 "integrity": "sha512-PijRCG/K3s3w1We6ynUKdxEc5AcuuH3NBmMDP8uvKVp6X43UY7NQlTzczakXP3DJR0F4dfNQIGjU2cUeRYs2AA==" 2406 "integrity": "sha512-PijRCG/K3s3w1We6ynUKdxEc5AcuuH3NBmMDP8uvKVp6X43UY7NQlTzczakXP3DJR0F4dfNQIGjU2cUeRYs2AA=="
2356 }, 2407 },
2408 + "@types/prop-types": {
2409 + "version": "15.7.3",
2410 + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz",
2411 + "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw=="
2412 + },
2357 "@types/q": { 2413 "@types/q": {
2358 "version": "1.5.4", 2414 "version": "1.5.4",
2359 "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", 2415 "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz",
2360 "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==" 2416 "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug=="
2361 }, 2417 },
2418 + "@types/react": {
2419 + "version": "17.0.9",
2420 + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.9.tgz",
2421 + "integrity": "sha512-2Cw7FvevpJxQrCb+k5t6GH1KIvmadj5uBbjPaLlJB/nZWUj56e1ZqcD6zsoMFB47MsJUTFl9RJ132A7hb3QFJA==",
2422 + "requires": {
2423 + "@types/prop-types": "*",
2424 + "@types/scheduler": "*",
2425 + "csstype": "^3.0.2"
2426 + }
2427 + },
2428 + "@types/react-redux": {
2429 + "version": "7.1.16",
2430 + "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.16.tgz",
2431 + "integrity": "sha512-f/FKzIrZwZk7YEO9E1yoxIuDNRiDducxkFlkw/GNMGEnK9n4K8wJzlJBghpSuOVDgEUHoDkDF7Gi9lHNQR4siw==",
2432 + "requires": {
2433 + "@types/hoist-non-react-statics": "^3.3.0",
2434 + "@types/react": "*",
2435 + "hoist-non-react-statics": "^3.3.0",
2436 + "redux": "^4.0.0"
2437 + }
2438 + },
2362 "@types/resolve": { 2439 "@types/resolve": {
2363 "version": "0.0.8", 2440 "version": "0.0.8",
2364 "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz", 2441 "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz",
...@@ -2367,6 +2444,11 @@ ...@@ -2367,6 +2444,11 @@
2367 "@types/node": "*" 2444 "@types/node": "*"
2368 } 2445 }
2369 }, 2446 },
2447 + "@types/scheduler": {
2448 + "version": "0.16.1",
2449 + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.1.tgz",
2450 + "integrity": "sha512-EaCxbanVeyxDRTQBkdLb3Bvl/HK7PBK6UJjsSixB0iHKoWxE5uu2Q/DgtpOhPIojN0Zl1whvOd7PoHs2P0s5eA=="
2451 + },
2370 "@types/source-list-map": { 2452 "@types/source-list-map": {
2371 "version": "0.1.2", 2453 "version": "0.1.2",
2372 "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", 2454 "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz",
...@@ -2851,6 +2933,55 @@ ...@@ -2851,6 +2933,55 @@
2851 "color-convert": "^1.9.0" 2933 "color-convert": "^1.9.0"
2852 } 2934 }
2853 }, 2935 },
2936 + "antd": {
2937 + "version": "4.16.1",
2938 + "resolved": "https://registry.npmjs.org/antd/-/antd-4.16.1.tgz",
2939 + "integrity": "sha512-v7KfUYvEAiqfTECKC4/VkpRPB/4RRxZLR3b2kKCYEtcj4nEHvsOKfO5CDbWVtSUmCehxOXNR2lV+UNy06KHBnA==",
2940 + "requires": {
2941 + "@ant-design/colors": "^6.0.0",
2942 + "@ant-design/icons": "^4.6.2",
2943 + "@ant-design/react-slick": "~0.28.1",
2944 + "@babel/runtime": "^7.12.5",
2945 + "array-tree-filter": "^2.1.0",
2946 + "classnames": "^2.2.6",
2947 + "copy-to-clipboard": "^3.2.0",
2948 + "lodash": "^4.17.21",
2949 + "moment": "^2.25.3",
2950 + "rc-cascader": "~1.4.0",
2951 + "rc-checkbox": "~2.3.0",
2952 + "rc-collapse": "~3.1.0",
2953 + "rc-dialog": "~8.5.1",
2954 + "rc-drawer": "~4.3.0",
2955 + "rc-dropdown": "~3.2.0",
2956 + "rc-field-form": "~1.20.0",
2957 + "rc-image": "~5.2.4",
2958 + "rc-input-number": "~7.1.0",
2959 + "rc-mentions": "~1.6.1",
2960 + "rc-menu": "~9.0.9",
2961 + "rc-motion": "^2.4.0",
2962 + "rc-notification": "~4.5.7",
2963 + "rc-pagination": "~3.1.6",
2964 + "rc-picker": "~2.5.10",
2965 + "rc-progress": "~3.1.0",
2966 + "rc-rate": "~2.9.0",
2967 + "rc-resize-observer": "^1.0.0",
2968 + "rc-select": "~12.1.6",
2969 + "rc-slider": "~9.7.1",
2970 + "rc-steps": "~4.1.0",
2971 + "rc-switch": "~3.2.0",
2972 + "rc-table": "~7.15.1",
2973 + "rc-tabs": "~11.9.1",
2974 + "rc-textarea": "~0.3.0",
2975 + "rc-tooltip": "~5.1.1",
2976 + "rc-tree": "~4.1.0",
2977 + "rc-tree-select": "~4.3.0",
2978 + "rc-trigger": "^5.2.1",
2979 + "rc-upload": "~4.3.0",
2980 + "rc-util": "^5.13.1",
2981 + "scroll-into-view-if-needed": "^2.2.25",
2982 + "warning": "^4.0.3"
2983 + }
2984 + },
2854 "anymatch": { 2985 "anymatch": {
2855 "version": "3.1.2", 2986 "version": "3.1.2",
2856 "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", 2987 "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
...@@ -2919,6 +3050,11 @@ ...@@ -2919,6 +3050,11 @@
2919 "is-string": "^1.0.5" 3050 "is-string": "^1.0.5"
2920 } 3051 }
2921 }, 3052 },
3053 + "array-tree-filter": {
3054 + "version": "2.1.0",
3055 + "resolved": "https://registry.npmjs.org/array-tree-filter/-/array-tree-filter-2.1.0.tgz",
3056 + "integrity": "sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw=="
3057 + },
2922 "array-union": { 3058 "array-union": {
2923 "version": "2.1.0", 3059 "version": "2.1.0",
2924 "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", 3060 "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
...@@ -3040,6 +3176,11 @@ ...@@ -3040,6 +3176,11 @@
3040 "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", 3176 "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz",
3041 "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" 3177 "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ=="
3042 }, 3178 },
3179 + "async-validator": {
3180 + "version": "3.5.2",
3181 + "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-3.5.2.tgz",
3182 + "integrity": "sha512-8eLCg00W9pIRZSB781UUX/H6Oskmm8xloZfr09lz5bikRpBVDlJ3hRVuxxP1SxcwsEYfJ4IU8Q19Y8/893r3rQ=="
3183 + },
3043 "asynckit": { 3184 "asynckit": {
3044 "version": "0.4.0", 3185 "version": "0.4.0",
3045 "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 3186 "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
...@@ -4085,6 +4226,11 @@ ...@@ -4085,6 +4226,11 @@
4085 } 4226 }
4086 } 4227 }
4087 }, 4228 },
4229 + "classnames": {
4230 + "version": "2.3.1",
4231 + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.1.tgz",
4232 + "integrity": "sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA=="
4233 + },
4088 "clean-css": { 4234 "clean-css": {
4089 "version": "4.2.3", 4235 "version": "4.2.3",
4090 "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", 4236 "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz",
...@@ -4253,6 +4399,11 @@ ...@@ -4253,6 +4399,11 @@
4253 } 4399 }
4254 } 4400 }
4255 }, 4401 },
4402 + "compute-scroll-into-view": {
4403 + "version": "1.0.17",
4404 + "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.17.tgz",
4405 + "integrity": "sha512-j4dx+Fb0URmzbwwMUrhqWM2BEWHdFGx+qZ9qqASHRPqvTYdqvWnHg0H1hIbcyLnvgnoNAVMlwkepyqM3DaIFUg=="
4406 + },
4256 "concat-map": { 4407 "concat-map": {
4257 "version": "0.0.1", 4408 "version": "0.0.1",
4258 "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 4409 "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
...@@ -4372,6 +4523,14 @@ ...@@ -4372,6 +4523,14 @@
4372 "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", 4523 "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
4373 "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" 4524 "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40="
4374 }, 4525 },
4526 + "copy-to-clipboard": {
4527 + "version": "3.3.1",
4528 + "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.1.tgz",
4529 + "integrity": "sha512-i13qo6kIHTTpCm8/Wup+0b1mVWETvu2kIMzKoK8FpkLkFxlt0znUAHcMzox+T8sPlqtZXq3CulEjQHsYiGFJUw==",
4530 + "requires": {
4531 + "toggle-selection": "^1.0.6"
4532 + }
4533 + },
4375 "core-js": { 4534 "core-js": {
4376 "version": "3.13.1", 4535 "version": "3.13.1",
4377 "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.13.1.tgz", 4536 "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.13.1.tgz",
...@@ -4799,6 +4958,11 @@ ...@@ -4799,6 +4958,11 @@
4799 } 4958 }
4800 } 4959 }
4801 }, 4960 },
4961 + "csstype": {
4962 + "version": "3.0.8",
4963 + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.8.tgz",
4964 + "integrity": "sha512-jXKhWqXPmlUeoQnF/EhTtTl4C9SnrxSH/jZUih3jmO6lBKr99rP3/+FmrMj4EFpOXzMtXHAZkd3x0E6h6Fgflw=="
4965 + },
4802 "cyclist": { 4966 "cyclist": {
4803 "version": "1.0.1", 4967 "version": "1.0.1",
4804 "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", 4968 "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz",
...@@ -4828,6 +4992,11 @@ ...@@ -4828,6 +4992,11 @@
4828 "whatwg-url": "^8.0.0" 4992 "whatwg-url": "^8.0.0"
4829 } 4993 }
4830 }, 4994 },
4995 + "date-fns": {
4996 + "version": "2.22.1",
4997 + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.22.1.tgz",
4998 + "integrity": "sha512-yUFPQjrxEmIsMqlHhAhmxkuH769baF21Kk+nZwZGyrMoyLA+LugaQtC0+Tqf9CBUUULWwUJt6Q5ySI3LJDDCGg=="
4999 + },
4831 "debug": { 5000 "debug": {
4832 "version": "4.3.1", 5001 "version": "4.3.1",
4833 "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", 5002 "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
...@@ -5112,6 +5281,11 @@ ...@@ -5112,6 +5281,11 @@
5112 "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.6.tgz", 5281 "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.6.tgz",
5113 "integrity": "sha512-DplGLZd8L1lN64jlT27N9TVSESFR5STaEJvX+thCby7fuCHonfPpAlodYc3vuUYbDuDec5w8AMP7oCM5TWFsqw==" 5282 "integrity": "sha512-DplGLZd8L1lN64jlT27N9TVSESFR5STaEJvX+thCby7fuCHonfPpAlodYc3vuUYbDuDec5w8AMP7oCM5TWFsqw=="
5114 }, 5283 },
5284 + "dom-align": {
5285 + "version": "1.12.2",
5286 + "resolved": "https://registry.npmjs.org/dom-align/-/dom-align-1.12.2.tgz",
5287 + "integrity": "sha512-pHuazgqrsTFrGU2WLDdXxCFabkdQDx72ddkraZNih1KsMcN5qsRSTR9O4VJRlwTPCPb5COYg3LOfiMHHcPInHg=="
5288 + },
5115 "dom-converter": { 5289 "dom-converter": {
5116 "version": "0.2.0", 5290 "version": "0.2.0",
5117 "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", 5291 "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz",
...@@ -6659,6 +6833,14 @@ ...@@ -6659,6 +6833,14 @@
6659 } 6833 }
6660 } 6834 }
6661 }, 6835 },
6836 + "flux-standard-action": {
6837 + "version": "2.1.1",
6838 + "resolved": "https://registry.npmjs.org/flux-standard-action/-/flux-standard-action-2.1.1.tgz",
6839 + "integrity": "sha512-W86GzmXmIiTVq/dpYVd2HtTIUX9c35Iq3ao3xR6qcKtuXgbu+BDEj72op5VnEIe/kpuSbhl+I8kT1iS2hpcusw==",
6840 + "requires": {
6841 + "lodash": "^4.17.15"
6842 + }
6843 + },
6662 "follow-redirects": { 6844 "follow-redirects": {
6663 "version": "1.14.1", 6845 "version": "1.14.1",
6664 "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.1.tgz", 6846 "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.1.tgz",
...@@ -7834,6 +8016,11 @@ ...@@ -7834,6 +8016,11 @@
7834 "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", 8016 "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz",
7835 "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" 8017 "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ=="
7836 }, 8018 },
8019 + "is-promise": {
8020 + "version": "2.2.2",
8021 + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz",
8022 + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ=="
8023 + },
7837 "is-regex": { 8024 "is-regex": {
7838 "version": "1.1.3", 8025 "version": "1.1.3",
7839 "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz", 8026 "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz",
...@@ -9530,6 +9717,14 @@ ...@@ -9530,6 +9717,14 @@
9530 "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 9717 "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
9531 "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" 9718 "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE="
9532 }, 9719 },
9720 + "json2mq": {
9721 + "version": "0.2.0",
9722 + "resolved": "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz",
9723 + "integrity": "sha1-tje9O6nqvhIsg+lyBIOusQ0skEo=",
9724 + "requires": {
9725 + "string-convert": "^0.2.0"
9726 + }
9727 + },
9533 "json3": { 9728 "json3": {
9534 "version": "3.3.3", 9729 "version": "3.3.3",
9535 "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", 9730 "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz",
...@@ -10104,6 +10299,11 @@ ...@@ -10104,6 +10299,11 @@
10104 "minimist": "^1.2.5" 10299 "minimist": "^1.2.5"
10105 } 10300 }
10106 }, 10301 },
10302 + "moment": {
10303 + "version": "2.29.1",
10304 + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz",
10305 + "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ=="
10306 + },
10107 "move-concurrently": { 10307 "move-concurrently": {
10108 "version": "1.0.1", 10308 "version": "1.0.1",
10109 "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", 10309 "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz",
...@@ -12250,6 +12450,382 @@ ...@@ -12250,6 +12450,382 @@
12250 } 12450 }
12251 } 12451 }
12252 }, 12452 },
12453 + "rc-align": {
12454 + "version": "4.0.9",
12455 + "resolved": "https://registry.npmjs.org/rc-align/-/rc-align-4.0.9.tgz",
12456 + "integrity": "sha512-myAM2R4qoB6LqBul0leaqY8gFaiECDJ3MtQDmzDo9xM9NRT/04TvWOYd2YHU9zvGzqk9QXF6S9/MifzSKDZeMw==",
12457 + "requires": {
12458 + "@babel/runtime": "^7.10.1",
12459 + "classnames": "2.x",
12460 + "dom-align": "^1.7.0",
12461 + "rc-util": "^5.3.0",
12462 + "resize-observer-polyfill": "^1.5.1"
12463 + }
12464 + },
12465 + "rc-cascader": {
12466 + "version": "1.4.3",
12467 + "resolved": "https://registry.npmjs.org/rc-cascader/-/rc-cascader-1.4.3.tgz",
12468 + "integrity": "sha512-Q4l9Mv8aaISJ+giVnM9IaXxDeMqHUGLvi4F+LksS6pHlaKlN4awop/L+IMjIXpL+ug/ojaCyv/ixcVopJYYCVA==",
12469 + "requires": {
12470 + "@babel/runtime": "^7.12.5",
12471 + "array-tree-filter": "^2.1.0",
12472 + "rc-trigger": "^5.0.4",
12473 + "rc-util": "^5.0.1",
12474 + "warning": "^4.0.1"
12475 + }
12476 + },
12477 + "rc-checkbox": {
12478 + "version": "2.3.2",
12479 + "resolved": "https://registry.npmjs.org/rc-checkbox/-/rc-checkbox-2.3.2.tgz",
12480 + "integrity": "sha512-afVi1FYiGv1U0JlpNH/UaEXdh6WUJjcWokj/nUN2TgG80bfG+MDdbfHKlLcNNba94mbjy2/SXJ1HDgrOkXGAjg==",
12481 + "requires": {
12482 + "@babel/runtime": "^7.10.1",
12483 + "classnames": "^2.2.1"
12484 + }
12485 + },
12486 + "rc-collapse": {
12487 + "version": "3.1.1",
12488 + "resolved": "https://registry.npmjs.org/rc-collapse/-/rc-collapse-3.1.1.tgz",
12489 + "integrity": "sha512-/oetKApTHzGGeR8Q8vD168EXkCs2MpEIrURGyy2D+LrrJd29LY/huuIMvOiJoSV6W3bcGhJqIdgHtg1Dxn1smA==",
12490 + "requires": {
12491 + "@babel/runtime": "^7.10.1",
12492 + "classnames": "2.x",
12493 + "rc-motion": "^2.3.4",
12494 + "rc-util": "^5.2.1",
12495 + "shallowequal": "^1.1.0"
12496 + }
12497 + },
12498 + "rc-dialog": {
12499 + "version": "8.5.2",
12500 + "resolved": "https://registry.npmjs.org/rc-dialog/-/rc-dialog-8.5.2.tgz",
12501 + "integrity": "sha512-3n4taFcjqhTE9uNuzjB+nPDeqgRBTEGBfe46mb1e7r88DgDo0lL4NnxY/PZ6PJKd2tsCt+RrgF/+YeTvJ/Thsw==",
12502 + "requires": {
12503 + "@babel/runtime": "^7.10.1",
12504 + "classnames": "^2.2.6",
12505 + "rc-motion": "^2.3.0",
12506 + "rc-util": "^5.6.1"
12507 + }
12508 + },
12509 + "rc-drawer": {
12510 + "version": "4.3.1",
12511 + "resolved": "https://registry.npmjs.org/rc-drawer/-/rc-drawer-4.3.1.tgz",
12512 + "integrity": "sha512-GMfFy4maqxS9faYXEhQ+0cA1xtkddEQzraf6SAdzWbn444DrrLogwYPk1NXSpdXjLCLxgxOj9MYtyYG42JsfXg==",
12513 + "requires": {
12514 + "@babel/runtime": "^7.10.1",
12515 + "classnames": "^2.2.6",
12516 + "rc-util": "^5.7.0"
12517 + }
12518 + },
12519 + "rc-dropdown": {
12520 + "version": "3.2.0",
12521 + "resolved": "https://registry.npmjs.org/rc-dropdown/-/rc-dropdown-3.2.0.tgz",
12522 + "integrity": "sha512-j1HSw+/QqlhxyTEF6BArVZnTmezw2LnSmRk6I9W7BCqNCKaRwleRmMMs1PHbuaG8dKHVqP6e21RQ7vPBLVnnNw==",
12523 + "requires": {
12524 + "@babel/runtime": "^7.10.1",
12525 + "classnames": "^2.2.6",
12526 + "rc-trigger": "^5.0.4"
12527 + }
12528 + },
12529 + "rc-field-form": {
12530 + "version": "1.20.1",
12531 + "resolved": "https://registry.npmjs.org/rc-field-form/-/rc-field-form-1.20.1.tgz",
12532 + "integrity": "sha512-f64KEZop7zSlrG4ef/PLlH12SLn6iHDQ3sTG+RfKBM45hikwV1i8qMf53xoX12NvXXWg1VwchggX/FSso4bWaA==",
12533 + "requires": {
12534 + "@babel/runtime": "^7.8.4",
12535 + "async-validator": "^3.0.3",
12536 + "rc-util": "^5.8.0"
12537 + }
12538 + },
12539 + "rc-image": {
12540 + "version": "5.2.4",
12541 + "resolved": "https://registry.npmjs.org/rc-image/-/rc-image-5.2.4.tgz",
12542 + "integrity": "sha512-kWOjhZC1OoGKfvWqtDoO9r8WUNswBwnjcstI6rf7HMudz0usmbGvewcWqsOhyaBRJL9+I4eeG+xiAoxV1xi75Q==",
12543 + "requires": {
12544 + "@babel/runtime": "^7.11.2",
12545 + "classnames": "^2.2.6",
12546 + "rc-dialog": "~8.5.0",
12547 + "rc-util": "^5.0.6"
12548 + }
12549 + },
12550 + "rc-input-number": {
12551 + "version": "7.1.3",
12552 + "resolved": "https://registry.npmjs.org/rc-input-number/-/rc-input-number-7.1.3.tgz",
12553 + "integrity": "sha512-o7/YTXAnxio53lCV402OcFRn8/jcm6YfKjCzPd+al0drQ7oyQkjQqcWbacSQwwN4gCHmqXGfgnRuAuBHoYz1dw==",
12554 + "requires": {
12555 + "@babel/runtime": "^7.10.1",
12556 + "classnames": "^2.2.5",
12557 + "rc-util": "^5.9.8"
12558 + }
12559 + },
12560 + "rc-mentions": {
12561 + "version": "1.6.1",
12562 + "resolved": "https://registry.npmjs.org/rc-mentions/-/rc-mentions-1.6.1.tgz",
12563 + "integrity": "sha512-LDzGI8jJVGnkhpTZxZuYBhMz3avcZZqPGejikchh97xPni/g4ht714Flh7DVvuzHQ+BoKHhIjobHnw1rcP8erg==",
12564 + "requires": {
12565 + "@babel/runtime": "^7.10.1",
12566 + "classnames": "^2.2.6",
12567 + "rc-menu": "^9.0.0",
12568 + "rc-textarea": "^0.3.0",
12569 + "rc-trigger": "^5.0.4",
12570 + "rc-util": "^5.0.1"
12571 + }
12572 + },
12573 + "rc-menu": {
12574 + "version": "9.0.10",
12575 + "resolved": "https://registry.npmjs.org/rc-menu/-/rc-menu-9.0.10.tgz",
12576 + "integrity": "sha512-wb7fZZ3f5KBqr7v3q8U1DB5K4SEm31KLPe/aANyrHajVJjQpiiGTMLF7ZB7vyqjC4QJq0SJewB4FkumT2U86fw==",
12577 + "requires": {
12578 + "@babel/runtime": "^7.10.1",
12579 + "classnames": "2.x",
12580 + "rc-motion": "^2.4.3",
12581 + "rc-overflow": "^1.2.0",
12582 + "rc-trigger": "^5.1.2",
12583 + "rc-util": "^5.12.0",
12584 + "shallowequal": "^1.1.0"
12585 + }
12586 + },
12587 + "rc-motion": {
12588 + "version": "2.4.4",
12589 + "resolved": "https://registry.npmjs.org/rc-motion/-/rc-motion-2.4.4.tgz",
12590 + "integrity": "sha512-ms7n1+/TZQBS0Ydd2Q5P4+wJTSOrhIrwNxLXCZpR7Fa3/oac7Yi803HDALc2hLAKaCTQtw9LmQeB58zcwOsqlQ==",
12591 + "requires": {
12592 + "@babel/runtime": "^7.11.1",
12593 + "classnames": "^2.2.1",
12594 + "rc-util": "^5.2.1"
12595 + }
12596 + },
12597 + "rc-notification": {
12598 + "version": "4.5.7",
12599 + "resolved": "https://registry.npmjs.org/rc-notification/-/rc-notification-4.5.7.tgz",
12600 + "integrity": "sha512-zhTGUjBIItbx96SiRu3KVURcLOydLUHZCPpYEn1zvh+re//Tnq/wSxN4FKgp38n4HOgHSVxcLEeSxBMTeBBDdw==",
12601 + "requires": {
12602 + "@babel/runtime": "^7.10.1",
12603 + "classnames": "2.x",
12604 + "rc-motion": "^2.2.0",
12605 + "rc-util": "^5.0.1"
12606 + }
12607 + },
12608 + "rc-overflow": {
12609 + "version": "1.2.1",
12610 + "resolved": "https://registry.npmjs.org/rc-overflow/-/rc-overflow-1.2.1.tgz",
12611 + "integrity": "sha512-TCB8QiEnmNUbsJZX1GU8ZvIgVxk42eu3yaRdDZc2HFjVeT3HBSfscVaCVzBuH3NR5IWrQLodI0p6MZEGFn+KiA==",
12612 + "requires": {
12613 + "@babel/runtime": "^7.11.1",
12614 + "classnames": "^2.2.1",
12615 + "rc-resize-observer": "^1.0.0",
12616 + "rc-util": "^5.5.1"
12617 + }
12618 + },
12619 + "rc-pagination": {
12620 + "version": "3.1.6",
12621 + "resolved": "https://registry.npmjs.org/rc-pagination/-/rc-pagination-3.1.6.tgz",
12622 + "integrity": "sha512-Pb2zJEt8uxXzYCWx/2qwsYZ3vSS9Eqdw0cJBli6C58/iYhmvutSBqrBJh51Z5UzYc5ZcW5CMeP5LbbKE1J3rpw==",
12623 + "requires": {
12624 + "@babel/runtime": "^7.10.1",
12625 + "classnames": "^2.2.1"
12626 + }
12627 + },
12628 + "rc-picker": {
12629 + "version": "2.5.10",
12630 + "resolved": "https://registry.npmjs.org/rc-picker/-/rc-picker-2.5.10.tgz",
12631 + "integrity": "sha512-d2or2jql9SSY8CaRPybpbKkXBq3bZ6g88UKyWQZBLTCrc92Xm87RfRC/P3UEQo/CLmia3jVF7IXVi1HmNe2DZA==",
12632 + "requires": {
12633 + "@babel/runtime": "^7.10.1",
12634 + "classnames": "^2.2.1",
12635 + "date-fns": "^2.15.0",
12636 + "moment": "^2.24.0",
12637 + "rc-trigger": "^5.0.4",
12638 + "rc-util": "^5.4.0",
12639 + "shallowequal": "^1.1.0"
12640 + }
12641 + },
12642 + "rc-progress": {
12643 + "version": "3.1.4",
12644 + "resolved": "https://registry.npmjs.org/rc-progress/-/rc-progress-3.1.4.tgz",
12645 + "integrity": "sha512-XBAif08eunHssGeIdxMXOmRQRULdHaDdIFENQ578CMb4dyewahmmfJRyab+hw4KH4XssEzzYOkAInTLS7JJG+Q==",
12646 + "requires": {
12647 + "@babel/runtime": "^7.10.1",
12648 + "classnames": "^2.2.6"
12649 + }
12650 + },
12651 + "rc-rate": {
12652 + "version": "2.9.1",
12653 + "resolved": "https://registry.npmjs.org/rc-rate/-/rc-rate-2.9.1.tgz",
12654 + "integrity": "sha512-MmIU7FT8W4LYRRHJD1sgG366qKtSaKb67D0/vVvJYR0lrCuRrCiVQ5qhfT5ghVO4wuVIORGpZs7ZKaYu+KMUzA==",
12655 + "requires": {
12656 + "@babel/runtime": "^7.10.1",
12657 + "classnames": "^2.2.5",
12658 + "rc-util": "^5.0.1"
12659 + }
12660 + },
12661 + "rc-resize-observer": {
12662 + "version": "1.0.0",
12663 + "resolved": "https://registry.npmjs.org/rc-resize-observer/-/rc-resize-observer-1.0.0.tgz",
12664 + "integrity": "sha512-RgKGukg1mlzyGdvzF7o/LGFC8AeoMH9aGzXTUdp6m+OApvmRdUuOscq/Y2O45cJA+rXt1ApWlpFoOIioXL3AGg==",
12665 + "requires": {
12666 + "@babel/runtime": "^7.10.1",
12667 + "classnames": "^2.2.1",
12668 + "rc-util": "^5.0.0",
12669 + "resize-observer-polyfill": "^1.5.1"
12670 + }
12671 + },
12672 + "rc-select": {
12673 + "version": "12.1.10",
12674 + "resolved": "https://registry.npmjs.org/rc-select/-/rc-select-12.1.10.tgz",
12675 + "integrity": "sha512-LQdUhYncvcULlrNcAShYicc1obPtnNK7/rvCD+YCm0b2BLLYxl3M3b/HOX6o+ppPej+yZulkUPeU6gcgcp9nag==",
12676 + "requires": {
12677 + "@babel/runtime": "^7.10.1",
12678 + "classnames": "2.x",
12679 + "rc-motion": "^2.0.1",
12680 + "rc-overflow": "^1.0.0",
12681 + "rc-trigger": "^5.0.4",
12682 + "rc-util": "^5.9.8",
12683 + "rc-virtual-list": "^3.2.0"
12684 + }
12685 + },
12686 + "rc-slider": {
12687 + "version": "9.7.2",
12688 + "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-9.7.2.tgz",
12689 + "integrity": "sha512-mVaLRpDo6otasBs6yVnG02ykI3K6hIrLTNfT5eyaqduFv95UODI9PDS6fWuVVehVpdS4ENgOSwsTjrPVun+k9g==",
12690 + "requires": {
12691 + "@babel/runtime": "^7.10.1",
12692 + "classnames": "^2.2.5",
12693 + "rc-tooltip": "^5.0.1",
12694 + "rc-util": "^5.0.0",
12695 + "shallowequal": "^1.1.0"
12696 + }
12697 + },
12698 + "rc-steps": {
12699 + "version": "4.1.3",
12700 + "resolved": "https://registry.npmjs.org/rc-steps/-/rc-steps-4.1.3.tgz",
12701 + "integrity": "sha512-GXrMfWQOhN3sVze3JnzNboHpQdNHcdFubOETUHyDpa/U3HEKBZC3xJ8XK4paBgF4OJ3bdUVLC+uBPc6dCxvDYA==",
12702 + "requires": {
12703 + "@babel/runtime": "^7.10.2",
12704 + "classnames": "^2.2.3",
12705 + "rc-util": "^5.0.1"
12706 + }
12707 + },
12708 + "rc-switch": {
12709 + "version": "3.2.2",
12710 + "resolved": "https://registry.npmjs.org/rc-switch/-/rc-switch-3.2.2.tgz",
12711 + "integrity": "sha512-+gUJClsZZzvAHGy1vZfnwySxj+MjLlGRyXKXScrtCTcmiYNPzxDFOxdQ/3pK1Kt/0POvwJ/6ALOR8gwdXGhs+A==",
12712 + "requires": {
12713 + "@babel/runtime": "^7.10.1",
12714 + "classnames": "^2.2.1",
12715 + "rc-util": "^5.0.1"
12716 + }
12717 + },
12718 + "rc-table": {
12719 + "version": "7.15.2",
12720 + "resolved": "https://registry.npmjs.org/rc-table/-/rc-table-7.15.2.tgz",
12721 + "integrity": "sha512-TAs7kCpIZwc2mtvD8CMrXSM6TqJDUsy0rUEV1YgRru33T8bjtAtc+9xW/KC1VWROJlHSpU0R0kXjFs9h/6+IzQ==",
12722 + "requires": {
12723 + "@babel/runtime": "^7.10.1",
12724 + "classnames": "^2.2.5",
12725 + "rc-resize-observer": "^1.0.0",
12726 + "rc-util": "^5.13.0",
12727 + "shallowequal": "^1.1.0"
12728 + }
12729 + },
12730 + "rc-tabs": {
12731 + "version": "11.9.1",
12732 + "resolved": "https://registry.npmjs.org/rc-tabs/-/rc-tabs-11.9.1.tgz",
12733 + "integrity": "sha512-CLNx3qaWnO8KBWPd+7r52Pfk0MoPyKtlr+2ltWq2I9iqAjd1nZu6iBpQP7wbWBwIomyeFNw/WjHdRN7VcX5Qtw==",
12734 + "requires": {
12735 + "@babel/runtime": "^7.11.2",
12736 + "classnames": "2.x",
12737 + "rc-dropdown": "^3.2.0",
12738 + "rc-menu": "^9.0.0",
12739 + "rc-resize-observer": "^1.0.0",
12740 + "rc-util": "^5.5.0"
12741 + }
12742 + },
12743 + "rc-textarea": {
12744 + "version": "0.3.4",
12745 + "resolved": "https://registry.npmjs.org/rc-textarea/-/rc-textarea-0.3.4.tgz",
12746 + "integrity": "sha512-ILUYx831ZukQPv3m7R4RGRtVVWmL1LV4ME03L22mvT56US0DGCJJaRTHs4vmpcSjFHItph5OTmhodY4BOwy81A==",
12747 + "requires": {
12748 + "@babel/runtime": "^7.10.1",
12749 + "classnames": "^2.2.1",
12750 + "rc-resize-observer": "^1.0.0",
12751 + "rc-util": "^5.7.0"
12752 + }
12753 + },
12754 + "rc-tooltip": {
12755 + "version": "5.1.1",
12756 + "resolved": "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-5.1.1.tgz",
12757 + "integrity": "sha512-alt8eGMJulio6+4/uDm7nvV+rJq9bsfxFDCI0ljPdbuoygUscbsMYb6EQgwib/uqsXQUvzk+S7A59uYHmEgmDA==",
12758 + "requires": {
12759 + "@babel/runtime": "^7.11.2",
12760 + "rc-trigger": "^5.0.0"
12761 + }
12762 + },
12763 + "rc-tree": {
12764 + "version": "4.1.5",
12765 + "resolved": "https://registry.npmjs.org/rc-tree/-/rc-tree-4.1.5.tgz",
12766 + "integrity": "sha512-q2vjcmnBDylGZ9/ZW4F9oZMKMJdbFWC7um+DAQhZG1nqyg1iwoowbBggUDUaUOEryJP+08bpliEAYnzJXbI5xQ==",
12767 + "requires": {
12768 + "@babel/runtime": "^7.10.1",
12769 + "classnames": "2.x",
12770 + "rc-motion": "^2.0.1",
12771 + "rc-util": "^5.0.0",
12772 + "rc-virtual-list": "^3.0.1"
12773 + }
12774 + },
12775 + "rc-tree-select": {
12776 + "version": "4.3.3",
12777 + "resolved": "https://registry.npmjs.org/rc-tree-select/-/rc-tree-select-4.3.3.tgz",
12778 + "integrity": "sha512-0tilOHLJA6p+TNg4kD559XnDX3PTEYuoSF7m7ryzFLAYvdEEPtjn0QZc5z6L0sMKBiBlj8a2kf0auw8XyHU3lA==",
12779 + "requires": {
12780 + "@babel/runtime": "^7.10.1",
12781 + "classnames": "2.x",
12782 + "rc-select": "^12.0.0",
12783 + "rc-tree": "^4.0.0",
12784 + "rc-util": "^5.0.5"
12785 + }
12786 + },
12787 + "rc-trigger": {
12788 + "version": "5.2.8",
12789 + "resolved": "https://registry.npmjs.org/rc-trigger/-/rc-trigger-5.2.8.tgz",
12790 + "integrity": "sha512-Tn84oGmvNBLXI+ptpzxyJx4ArKTduuB6l74ShDLhDaJaF9f5JAMizfx31L30ELVIzRr3Ze4sekG7rzwPGwVOdw==",
12791 + "requires": {
12792 + "@babel/runtime": "^7.11.2",
12793 + "classnames": "^2.2.6",
12794 + "rc-align": "^4.0.0",
12795 + "rc-motion": "^2.0.0",
12796 + "rc-util": "^5.5.0"
12797 + }
12798 + },
12799 + "rc-upload": {
12800 + "version": "4.3.0",
12801 + "resolved": "https://registry.npmjs.org/rc-upload/-/rc-upload-4.3.0.tgz",
12802 + "integrity": "sha512-wDXf1ZdUTwBIfagTof1MJDjOHZ6xluD0xcgojYZeAZSi+3Doyc21jNV8bRIeK5jx/OQmllrpQp1/MWKkqvkBhg==",
12803 + "requires": {
12804 + "@babel/runtime": "^7.10.1",
12805 + "classnames": "^2.2.5",
12806 + "rc-util": "^5.2.0"
12807 + }
12808 + },
12809 + "rc-util": {
12810 + "version": "5.13.1",
12811 + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.13.1.tgz",
12812 + "integrity": "sha512-Dws2tjXBBihfjVQFlG5JzZ/5O3Wutctm0W94Wb1+M7GD2roWJPrQdSa4AkWm2pn0Ms32zoVPPkWodFeAYZPLfA==",
12813 + "requires": {
12814 + "@babel/runtime": "^7.12.5",
12815 + "react-is": "^16.12.0",
12816 + "shallowequal": "^1.1.0"
12817 + }
12818 + },
12819 + "rc-virtual-list": {
12820 + "version": "3.2.6",
12821 + "resolved": "https://registry.npmjs.org/rc-virtual-list/-/rc-virtual-list-3.2.6.tgz",
12822 + "integrity": "sha512-8FiQLDzm3c/tMX0d62SQtKDhLH7zFlSI6pWBAPt+TUntEqd3Lz9zFAmpvTu8gkvUom/HCsDSZs4wfV4wDPWC0Q==",
12823 + "requires": {
12824 + "classnames": "^2.2.6",
12825 + "rc-resize-observer": "^1.0.0",
12826 + "rc-util": "^5.0.7"
12827 + }
12828 + },
12253 "react": { 12829 "react": {
12254 "version": "17.0.2", 12830 "version": "17.0.2",
12255 "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", 12831 "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz",
...@@ -12438,6 +13014,19 @@ ...@@ -12438,6 +13014,19 @@
12438 "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", 13014 "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
12439 "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" 13015 "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
12440 }, 13016 },
13017 + "react-redux": {
13018 + "version": "7.2.4",
13019 + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.4.tgz",
13020 + "integrity": "sha512-hOQ5eOSkEJEXdpIKbnRyl04LhaWabkDPV+Ix97wqQX3T3d2NQ8DUblNXXtNMavc7DpswyQM6xfaN4HQDKNY2JA==",
13021 + "requires": {
13022 + "@babel/runtime": "^7.12.1",
13023 + "@types/react-redux": "^7.1.16",
13024 + "hoist-non-react-statics": "^3.3.2",
13025 + "loose-envify": "^1.4.0",
13026 + "prop-types": "^15.7.2",
13027 + "react-is": "^16.13.1"
13028 + }
13029 + },
12441 "react-refresh": { 13030 "react-refresh": {
12442 "version": "0.8.3", 13031 "version": "0.8.3",
12443 "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.8.3.tgz", 13032 "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.8.3.tgz",
...@@ -12670,6 +13259,28 @@ ...@@ -12670,6 +13259,28 @@
12670 "strip-indent": "^3.0.0" 13259 "strip-indent": "^3.0.0"
12671 } 13260 }
12672 }, 13261 },
13262 + "redux": {
13263 + "version": "4.1.0",
13264 + "resolved": "https://registry.npmjs.org/redux/-/redux-4.1.0.tgz",
13265 + "integrity": "sha512-uI2dQN43zqLWCt6B/BMGRMY6db7TTY4qeHHfGeKb3EOhmOKjU3KdWvNLJyqaHRksv/ErdNH7cFZWg9jXtewy4g==",
13266 + "requires": {
13267 + "@babel/runtime": "^7.9.2"
13268 + }
13269 + },
13270 + "redux-promise": {
13271 + "version": "0.6.0",
13272 + "resolved": "https://registry.npmjs.org/redux-promise/-/redux-promise-0.6.0.tgz",
13273 + "integrity": "sha512-R2mGxJbPFgXyCNbFDE6LjTZhCEuACF54g1bxld3nqBhnRMX0OsUyWk77moF7UMGkUdl5WOAwc4BC5jOd1dunqQ==",
13274 + "requires": {
13275 + "flux-standard-action": "^2.0.3",
13276 + "is-promise": "^2.1.0"
13277 + }
13278 + },
13279 + "redux-thunk": {
13280 + "version": "2.3.0",
13281 + "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.3.0.tgz",
13282 + "integrity": "sha512-km6dclyFnmcvxhAcrQV2AkZmPQjzPDjgVlQtR0EQjxZPyJ0BnMf3in1ryuR8A2qU0HldVRfxYXbFSKlI3N7Slw=="
13283 + },
12673 "regenerate": { 13284 "regenerate": {
12674 "version": "1.4.2", 13285 "version": "1.4.2",
12675 "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", 13286 "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
...@@ -12824,6 +13435,11 @@ ...@@ -12824,6 +13435,11 @@
12824 "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", 13435 "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
12825 "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" 13436 "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8="
12826 }, 13437 },
13438 + "resize-observer-polyfill": {
13439 + "version": "1.5.1",
13440 + "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz",
13441 + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg=="
13442 + },
12827 "resolve": { 13443 "resolve": {
12828 "version": "1.18.1", 13444 "version": "1.18.1",
12829 "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.18.1.tgz", 13445 "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.18.1.tgz",
...@@ -13299,6 +13915,14 @@ ...@@ -13299,6 +13915,14 @@
13299 "ajv-keywords": "^3.5.2" 13915 "ajv-keywords": "^3.5.2"
13300 } 13916 }
13301 }, 13917 },
13918 + "scroll-into-view-if-needed": {
13919 + "version": "2.2.28",
13920 + "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.28.tgz",
13921 + "integrity": "sha512-8LuxJSuFVc92+0AdNv4QOxRL4Abeo1DgLnGNkn1XlaujPH/3cCFz3QI60r2VNu4obJJROzgnIUw5TKQkZvZI1w==",
13922 + "requires": {
13923 + "compute-scroll-into-view": "^1.0.17"
13924 + }
13925 + },
13302 "select-hose": { 13926 "select-hose": {
13303 "version": "2.0.0", 13927 "version": "2.0.0",
13304 "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", 13928 "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz",
...@@ -13473,6 +14097,11 @@ ...@@ -13473,6 +14097,11 @@
13473 "safe-buffer": "^5.0.1" 14097 "safe-buffer": "^5.0.1"
13474 } 14098 }
13475 }, 14099 },
14100 + "shallowequal": {
14101 + "version": "1.1.0",
14102 + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz",
14103 + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ=="
14104 + },
13476 "shebang-command": { 14105 "shebang-command": {
13477 "version": "1.2.0", 14106 "version": "1.2.0",
13478 "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", 14107 "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
...@@ -13992,6 +14621,11 @@ ...@@ -13992,6 +14621,11 @@
13992 "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", 14621 "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz",
13993 "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" 14622 "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM="
13994 }, 14623 },
14624 + "string-convert": {
14625 + "version": "0.2.1",
14626 + "resolved": "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz",
14627 + "integrity": "sha1-aYLMMEn7tM2F+LJFaLnZvznu/5c="
14628 + },
13995 "string-length": { 14629 "string-length": {
13996 "version": "4.0.2", 14630 "version": "4.0.2",
13997 "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", 14631 "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz",
...@@ -14555,6 +15189,11 @@ ...@@ -14555,6 +15189,11 @@
14555 "is-number": "^7.0.0" 15189 "is-number": "^7.0.0"
14556 } 15190 }
14557 }, 15191 },
15192 + "toggle-selection": {
15193 + "version": "1.0.6",
15194 + "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz",
15195 + "integrity": "sha1-bkWxJj8gF/oKzH2J14sVuL932jI="
15196 + },
14558 "toidentifier": { 15197 "toidentifier": {
14559 "version": "1.0.0", 15198 "version": "1.0.0",
14560 "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", 15199 "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
...@@ -15007,6 +15646,14 @@ ...@@ -15007,6 +15646,14 @@
15007 "makeerror": "1.0.x" 15646 "makeerror": "1.0.x"
15008 } 15647 }
15009 }, 15648 },
15649 + "warning": {
15650 + "version": "4.0.3",
15651 + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz",
15652 + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==",
15653 + "requires": {
15654 + "loose-envify": "^1.0.0"
15655 + }
15656 + },
15010 "watchpack": { 15657 "watchpack": {
15011 "version": "1.7.5", 15658 "version": "1.7.5",
15012 "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", 15659 "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz",
......
...@@ -6,12 +6,17 @@ ...@@ -6,12 +6,17 @@
6 "@testing-library/jest-dom": "^5.12.0", 6 "@testing-library/jest-dom": "^5.12.0",
7 "@testing-library/react": "^11.2.7", 7 "@testing-library/react": "^11.2.7",
8 "@testing-library/user-event": "^12.8.3", 8 "@testing-library/user-event": "^12.8.3",
9 + "antd": "^4.16.1",
9 "axios": "^0.21.1", 10 "axios": "^0.21.1",
10 "http-proxy-middleware": "^2.0.0", 11 "http-proxy-middleware": "^2.0.0",
11 "react": "^17.0.2", 12 "react": "^17.0.2",
12 "react-dom": "^17.0.2", 13 "react-dom": "^17.0.2",
14 + "react-redux": "^7.2.4",
13 "react-router-dom": "^5.2.0", 15 "react-router-dom": "^5.2.0",
14 "react-scripts": "4.0.3", 16 "react-scripts": "4.0.3",
17 + "redux": "^4.1.0",
18 + "redux-promise": "^0.6.0",
19 + "redux-thunk": "^2.3.0",
15 "web-vitals": "^1.1.2" 20 "web-vitals": "^1.1.2"
16 }, 21 },
17 "scripts": { 22 "scripts": {
......
1 -
2 import React from "react"; 1 import React from "react";
3 import { 2 import {
4 BrowserRouter as Router, 3 BrowserRouter as Router,
5 Switch, 4 Switch,
6 Route, 5 Route,
7 - Link 6 + //Link
8 } from "react-router-dom"; 7 } from "react-router-dom";
9 8
10 import LandingPage from './components/views/LandingPage/LandingPage' 9 import LandingPage from './components/views/LandingPage/LandingPage'
11 import LoginPage from './components/views/LoginPage/LoginPage' 10 import LoginPage from './components/views/LoginPage/LoginPage'
12 import RegisterPage from './components/views/RegisterPage/RegisterPage' 11 import RegisterPage from './components/views/RegisterPage/RegisterPage'
13 - 12 +import auth from './hoc/authentication'
14 13
15 function App() { 14 function App() {
16 return ( 15 return (
17 <Router> 16 <Router>
18 <div> 17 <div>
19 - {/*
20 - A <Switch> looks through all its children <Route>
21 - elements and renders the first one whose path
22 - matches the current URL. Use a <Switch> any time
23 - you have multiple routes, but you want only one
24 - of them to render at a time
25 - */}
26 <Switch> 18 <Switch>
27 - <Route exact path="/"> 19 + {/* null, false에 대한 옵션 설명은 auth로 가서 확인*/}
28 - <LandingPage /> 20 +
29 - </Route> {/* 21 + <Route exact path="/" component={auth(LandingPage, null)} />
30 - <Route exact path="/" component={LandingPage} /> 로 해도 똑같은 결과가 나옴!
31 - */}
32 22
33 - <Route path="/login"> 23 + <Route exact path="/login" component={auth(LoginPage, false)}/>
34 - <LoginPage />
35 - </Route>
36 24
37 - <Route path="/register"> 25 + <Route exact path="/register" component={auth(RegisterPage, false)}/>
38 - <RegisterPage /> 26 +
39 - </Route> 27 + {/*
28 + <Route exact path="/" component={LandingPage} />
29 +
30 + <Route exact path="/login" component={LoginPage}/>
31 +
32 + <Route exact path="/register" component={RegisterPage}/>
33 + */}
40 </Switch> 34 </Switch>
41 </div> 35 </div>
42 </Router> 36 </Router>
......
1 +// type들만 관리하는 곳
2 +
3 +export const LOGIN_USER = "login_user";
4 +export const REGISTER_USER = "resgier_user";
5 +export const AUTH_USER = "auth_user";
...\ No newline at end of file ...\ No newline at end of file
1 +import axios from 'axios';
2 +import {
3 + LOGIN_USER,
4 + REGISTER_USER,
5 + AUTH_USER
6 +} from './types';
7 +export function loginUser(logInfo) {
8 + const request = axios.post('/api/users/login', logInfo) // logInfo를 post로 전달
9 + .then(response => response.data); // 서버에서 받은 데이터를 request에 저장
10 +
11 + return { // return을 통해 Reducer로 보냄
12 + // Reducer에서 previousState, action을 이용해 nextState로 만들기 때문 :: (previousState, action) => nextState
13 + // request를 reducer로 보내는 작업
14 +
15 + // action은 type과 response을 넣어줘야 함
16 + type: "LOGIN_USER",
17 + payload: request // payroad == response
18 + }
19 +}
20 +
21 +export function RegisterUser(regInfo) {
22 + const request = axios.post('/api/users/register', regInfo) // logInfo를 post로 전달
23 + .then(response => response.data); // 서버에서 받은 데이터를 request에 저장
24 +
25 + return { // return을 통해 Reducer로 보냄.
26 + // Reducer에서 previousState, action을 이용해 nextState로 만들기 때문 :: (previousState, action) => nextState
27 + // request를 reducer로 보내는 작업
28 +
29 + // action은 type과 response을 넣어줘야 함
30 + type: "REGISTER_USER",
31 + payload: request // payroad == response
32 + }
33 +}
34 +
35 +export function auth() {
36 + const request = axios.get('/api/users/auth') // logInfo를 post로 전달
37 + .then(response => response.data); // 서버에서 받은 데이터를 request에 저장
38 +
39 + return {
40 +
41 + type: "AUTH_USER",
42 + payload: request // payroad == response
43 + }
44 +}
...\ No newline at end of file ...\ No newline at end of file
1 +// Redux에 있는 Store에 Reducer들이 여러가지 있을 수 있다.
2 +// -> why? : Reducer 안에서 하는 일은
3 +// state가 어떻게 변하는지를 보여준 다음, 변한 마지막 값을 return 해주는 것.
4 +// 웹서비스를 제작하면서 user state, comment state ... 등등 다양한 기능에 대한 state들이 존재할 수 있고
5 +// 각각 state마다 reducer가 있어서 user reducer, comment reducer ... 등등 다양한 reducer들이 존재할 수 있음.
6 +// ------------------------------------
7 +// 이렇게 나눠진 다양한 reducer을 combineReducers을 통해 rootReducer에서 하나로 합쳐주는 기능을 만들 것임.
8 +import { combineReducers } from 'redux';
9 +import user from './user_reducer'; // user(회원가입, 로그인, 인증, 로그아웃 기능이 있음) reducer
10 +// import comment from './comment_reducer'; // comment기능이 있을 때 reducer
11 +
12 +const rootReducer = combineReducers( {
13 + user
14 +})
15 +
16 +// 다른 곳에서도 rootReducer을 쓸 수 있도록
17 +export default rootReducer;
...\ No newline at end of file ...\ No newline at end of file
1 +import {
2 + LOGIN_USER,
3 + REGISTER_USER,
4 + AUTH_USER
5 +} from '../_actions/types';
6 +
7 +
8 +// reducer은 (previousState, action) => (nextState)로
9 +export default function (prevState = {}, action) {
10 + switch (action.type) {
11 + case LOGIN_USER:
12 + return {...prevState, loginSuccess:action.payload} // 위의 prevState를 그대로 가져오고,
13 + // user_action.js에 있는 payload를 그대로 가져와서 return.
14 + // loginSuccess는 server/index.js 에서 login에 성공하면 json type으로 loginSuccess: true를 전달하라고 했기 때문
15 + break;
16 + case REGISTER_USER:
17 + return {...prevState, success:action.payload}
18 + // success는 server/index.js 에서 register에 성공하면 json type으로 success: true를 전달하라고 했기 때문
19 + break;
20 +
21 + case AUTH_USER:
22 + return {...prevState, user:action.payload}
23 + break;
24 + default:
25 + return prevState;
26 + }
27 +}
...\ No newline at end of file ...\ No newline at end of file
1 +import React, {useEffect} from 'react'
2 +import axios from 'axios'
3 +import { withRouter } from 'react-router-dom';
4 +
5 +function LandingPage(props) {
6 +
7 + // 로그아웃 버튼 클릭 됐을 때
8 + const onLogoutClickedEvent = () => {
9 + axios.get('/api/users/logout')
10 + .then(response => {
11 + // 만약 success:true이면 로그인 페이지로 가기
12 + if(response.data.success)
13 + props.history.push("/login");
14 + else
15 + alert("Fail to logout.")
16 + })
17 + }
18 + // 랜딩페이지에 들어오자마자
19 + useEffect(() => {
20 + axios.get('/api/hello') // get request를 서버로 보냄 (endpoint는 /api/hello)
21 + .then(response => console.log(response.data)) // 서버로부터 응답 받은 내용을 콘솔에 출력
22 + }, [])
23 +
24 + return (
25 + <div style={{justifyContent:'center', alignItems: 'center', display:'flex', width:'100%'}}>
26 + <h1>시작 페이지</h1>
27 + <button onClick ={onLogoutClickedEvent}> Logout </button>
28 + </div>
29 +
30 +
31 + )
32 +}
33 +
34 +
35 +export default withRouter(LandingPage)
...\ No newline at end of file ...\ No newline at end of file
1 +import axios from 'axios';
2 +//import { response } from 'express';
3 +import React from 'react'
4 +import {useState} from 'react'
5 +import {useDispatch} from 'react-redux';
6 +import {loginUser} from '../../../_actions/user_action'
7 +import { withRouter } from 'react-router-dom';
8 +
9 +function LoginPage(props) {
10 +
11 +
12 + // 이 로그인페이지 안에서 input에 타이핑을 함으로써 데이터를 변화시켜주므로 state 사용.
13 + // 1-1. state을 사용하기 위해 state 만들어줌.
14 + const [Email, setEmail] = useState(""); // 1-2. email을 위한 state
15 + const [Password, setPassword] = useState(""); // 1-2. password를 위한 state
16 + //1-3. 아래 input value에 넣어줌
17 +
18 + // 2-1. 타이핑할 때 타이핑 하는 거 보이게 하도록 핸들러를 만들어줌
19 + const emailEvent = (event) => {
20 + setEmail(event.currentTarget.value)
21 + }
22 + const passwordEvent = (event) => {
23 + setPassword(event.currentTarget.value)
24 +
25 + }
26 +
27 + const dispatch = useDispatch();
28 + const submitEvent = (event) => {
29 + event.preventDefault(); // 이걸 하지 않으면 버튼을 누를 때마다 refresh돼서 데이터 처리를 할 수 없음
30 +
31 + //console.log('Email', Email); // 잘 나오는지 확인
32 + //console.log('Password', Password); // 잘 나오는지 확인
33 +
34 + let logInfo = { // 보내주기 위해 저장
35 + email: Email,
36 + password: Password
37 + }
38 +
39 + dispatch(loginUser(logInfo)) // _actions폴더 user_action.js에 있음
40 + .then(response => {
41 + if(response.payload.loginSuccess)
42 + props.history.push('/');
43 +
44 + else
45 + alert('Error');
46 +
47 +
48 + })
49 +
50 + }
51 + return (
52 + <div style={{
53 + justifyContent:'center', alignItems: 'center', display:'flex', width:'100%', height:'50vh'
54 + }}>
55 + <form onSubmit={submitEvent}>
56 + <label>Email</label>
57 + <input type="email" value={Email} onChange={emailEvent} />
58 + {/* input type="email"이라서 '이메일 주소에 '@'를 포함해주세요'라는 경고문 뜸. */}
59 + <label>Password</label>
60 + <input type="password" value={Password} onChange={passwordEvent} />
61 + <br/>
62 + <button>
63 + Login
64 + </button>
65 + </form>
66 + </div>
67 + )
68 +}
69 +
70 +export default withRouter(LoginPage)
1 +import React from 'react'
2 +import {useState} from 'react'
3 +import {useDispatch} from 'react-redux';
4 +import {RegisterUser} from '../../../_actions/user_action'
5 +import { withRouter } from 'react-router-dom';
6 +
7 +function RegisterPage(props) {
8 +
9 + // 이 로그인페이지 안에서 input에 타이핑을 함으로써 데이터를 변화시켜주므로 state 사용.
10 + // 1-1. state을 사용하기 위해 state 만들어줌.
11 + const [Name, setName] = useState("");
12 + const [Email, setEmail] = useState(""); // 1-2. email을 위한 state
13 + const [Password, setPassword] = useState(""); // 1-2. password를 위한 state
14 + const [Password2, setPassword2] = useState("");
15 +
16 + //1-3. 아래 input value에 넣어줌
17 +
18 + // 2-1. 타이핑할 때 타이핑 하는 거 보이게 하도록 핸들러를 만들어줌
19 + const emailEvent = (event) => {
20 + setEmail(event.currentTarget.value)
21 + }
22 + const passwordEvent = (event) => {
23 + setPassword(event.currentTarget.value)
24 +
25 + }
26 + const password2Event = (event) => {
27 + setPassword2(event.currentTarget.value)
28 +
29 + }
30 + const NameEvent = (event) => {
31 + setName(event.currentTarget.value)
32 +
33 + }
34 +
35 + const dispatch = useDispatch();
36 + const submitEvent = (event) => {
37 + event.preventDefault(); // 이걸 하지 않으면 버튼을 누를 때마다 refresh돼서 데이터 처리를 할 수 없음
38 +
39 + //console.log('Email', Email); // 잘 나오는지 확인
40 + //console.log('Password', Password); // 잘 나오는지 확인
41 +
42 + // 비밀번호 두개가 같아야 회원가입이 되도록
43 + if(Password !== Password2)
44 + return alert('비밀번호가 일치하지 않습니다.')
45 +
46 +
47 + let regiInfo = { // 보내주기 위해 저장
48 + name : Name,
49 + email: Email,
50 + password: Password
51 + }
52 +
53 + dispatch(RegisterUser(regiInfo)) // _actions폴더 user_action.js에 있음
54 + .then(response => {
55 + if(response.payload.success)
56 + props.history.push('/login');
57 +
58 + else
59 + alert('Fail to sign up');
60 + })
61 +
62 + }
63 +
64 + return (
65 + <div style={{
66 + justifyContent:'center', alignItems: 'center', display:'flex', width:'100%', height:'50vh'
67 + }}>
68 + <form onSubmit={submitEvent} style={{display: 'flex', flexDirection: 'column'}}>
69 +
70 + <label>Name</label>
71 + <input type="text" value={Name} onChange={NameEvent} />
72 +
73 + <label>Email</label>
74 + <input type="email" value={Email} onChange={emailEvent} />
75 + {/* input type="email"이라서 '이메일 주소에 '@'를 포함해주세요'라는 경고문 뜸. */}
76 +
77 +
78 + <label>Password</label>
79 + <input type="password" value={Password} onChange={passwordEvent} />
80 +
81 + <label>Confirm Password</label>
82 + <input type="password" value={Password2} onChange={password2Event} />
83 +
84 + <br/>
85 + <button>
86 + Sign In
87 + </button>
88 + </form>
89 + </div>
90 + )
91 +}
92 +
93 +export default withRouter(RegisterPage)
1 +// 사용자의 상태를 보고
2 +// 해당 페이지에 들어갈 수 있게 할지 안할지 결정해 줌. hoc 이용.
3 +import axios from 'axios';
4 +import React, {useEffect} from 'react';
5 +//import {useEffect} from 'react';
6 +import {useDispatch} from 'react-redux';
7 +import {auth} from '../_actions/user_action'
8 +
9 +
10 +export default function (SpecificComponent, option, adminRoute = null){
11 + // ㄴ option 종류
12 + // - null 아무나 출입 가능한 페이지
13 + // - true 로그인한 유저만 출입 가능
14 + // - false 로그인한 유저 출입 불가능
15 +
16 + function AuthenticationCheck(props) {
17 + //1. backend에 request를 날려서 사용자의 상태를 확인
18 + const dispatch = useDispatch(); // 1-1. dispatch 사용
19 + useEffect(() => {
20 + dispatch(auth()) // 페이지가 이동할 때마다 dispatch가 작동해서 backend에 request를 줌
21 + .then(response => { // 받은 response
22 + console.log(response);
23 +
24 +
25 + // 로그인 안했다면
26 + if(!response.payload.isAuth) {
27 + if(option) { // 만약 위 option이 true이면 (로그인한 유저만 출입 가능한 페이지로 가게 하려면)
28 + props.history.push('/login'); // 로그인 하게 함
29 + }
30 + }
31 +
32 + // 로그인 했다면
33 + else {
34 + if(adminRoute && !response.payload.isAdmin) { // admin만 갈 수 있는 페이지를 admin이 false 사람이 들어가려 한다면
35 + props.history.push('/'); // 홈페이지로 돌아가게 함
36 + }
37 + else {
38 + if(option===false) {// 로그인한 유저가 출입 불가능한 곳을 가려고 한다면
39 + props.history.push('/'); // 홈페이지로 돌아가게 함
40 +
41 + }
42 + }
43 + }
44 + })
45 + },[])
46 +
47 + return (
48 + <SpecificComponent />
49 + )
50 +
51 + }
52 +
53 + return AuthenticationCheck
54 +}
...\ No newline at end of file ...\ No newline at end of file
1 +import React from 'react';
2 +import ReactDOM from 'react-dom';
3 +import './index.css';
4 +import App from './App';
5 +import reportWebVitals from './reportWebVitals';
6 +import { Provider } from 'react-redux' // app에 redux를 연결시켜주기 위해 redux에서 제공하는 provider 사용
7 +import { createStore } from 'redux'; // redux에서 createStore 가져옴.
8 +import { applyMiddleware } from 'redux'; // object만 받는 store가 promise나 functions도 받기 위해 middleware을 사용함
9 +import promiseMiddleware from 'redux-promise';
10 +import ReduxThunk from 'redux-thunk';
11 +import Reducer from './_reducers';
12 +
13 +import 'antd/dist/antd.css';
14 +
15 +
16 +const createStoreWithMiddleware = applyMiddleware(promiseMiddleware, ReduxThunk)(createStore)
17 +
18 +ReactDOM.render(
19 + // App에 Redux를 연결
20 + <Provider
21 + store={createStoreWithMiddleware(Reducer,
22 + window.__REDUX_DEVTOOLS_EXTENSION__ &&
23 + window.__REDUX_DEVTOOLS_EXTENSION__()
24 + )}
25 + >
26 + <App />
27 + </Provider>
28 + , document.getElementById('root')
29 +);
30 +
31 +// If you want to start measuring performance in your app, pass a function
32 +// to log resu lts (for example: reportWebVitals(console.log))
33 +// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
34 +reportWebVitals();
1 -import React from 'react'
2 -
3 -function LoginPage() {
4 - return (
5 - <div>
6 - LoginPage
7 - </div>
8 - )
9 -}
10 -
11 -export default LoginPage
1 -import React from 'react'
2 -
3 -function RegisterPage() {
4 - return (
5 - <div>
6 - RegisterPage
7 - </div>
8 - )
9 -}
10 -
11 -export default RegisterPage
1 -import React from 'react';
2 -import ReactDOM from 'react-dom';
3 -import './index.css';
4 -import App from './App';
5 -import reportWebVitals from './reportWebVitals';
6 -
7 -ReactDOM.render(
8 - <React.StrictMode>
9 - <App />
10 - </React.StrictMode>,
11 - document.getElementById('root')
12 -);
13 -
14 -// If you want to start measuring performance in your app, pass a function
15 -// to log results (for example: reportWebVitals(console.log))
16 -// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
17 -reportWebVitals();