박권수

feat. qrcode 생성

...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
5 "requires": true, 5 "requires": true,
6 "packages": { 6 "packages": {
7 "": { 7 "": {
8 + "name": "web",
8 "version": "0.1.0", 9 "version": "0.1.0",
9 "dependencies": { 10 "dependencies": {
10 "@testing-library/jest-dom": "^5.11.4", 11 "@testing-library/jest-dom": "^5.11.4",
...@@ -18,10 +19,12 @@ ...@@ -18,10 +19,12 @@
18 "highcharts": "^9.2.0", 19 "highcharts": "^9.2.0",
19 "highcharts-react-official": "^3.0.0", 20 "highcharts-react-official": "^3.0.0",
20 "moment": "^2.29.1", 21 "moment": "^2.29.1",
22 + "qrcode": "^1.4.4",
21 "react": "^17.0.2", 23 "react": "^17.0.2",
22 "react-dom": "^17.0.2", 24 "react-dom": "^17.0.2",
23 "react-router-dom": "^5.2.0", 25 "react-router-dom": "^5.2.0",
24 "react-scripts": "4.0.3", 26 "react-scripts": "4.0.3",
27 + "react-spinners": "^0.11.0",
25 "recoil": "^0.4.0", 28 "recoil": "^0.4.0",
26 "recoil-persist": "^3.0.0", 29 "recoil-persist": "^3.0.0",
27 "styled-components": "^5.3.0", 30 "styled-components": "^5.3.0",
...@@ -31,6 +34,7 @@ ...@@ -31,6 +34,7 @@
31 "web-vitals": "^1.0.1" 34 "web-vitals": "^1.0.1"
32 }, 35 },
33 "devDependencies": { 36 "devDependencies": {
37 + "@types/qrcode": "^1.4.1",
34 "@types/react-router-dom": "^5.1.8", 38 "@types/react-router-dom": "^5.1.8",
35 "@types/styled-components": "^5.1.12", 39 "@types/styled-components": "^5.1.12",
36 "@types/validator": "^13.6.3", 40 "@types/validator": "^13.6.3",
...@@ -1247,11 +1251,14 @@ ...@@ -1247,11 +1251,14 @@
1247 } 1251 }
1248 }, 1252 },
1249 "node_modules/@babel/runtime": { 1253 "node_modules/@babel/runtime": {
1250 - "version": "7.12.18", 1254 + "version": "7.15.4",
1251 - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.18.tgz", 1255 + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.15.4.tgz",
1252 - "integrity": "sha512-BogPQ7ciE6SYAUPtlm9tWbgI9+2AgqSam6QivMgXgAT+fKbgppaj4ZX15MHeLC1PVF5sNk70huBu20XxWOs8Cg==", 1256 + "integrity": "sha512-99catp6bHCaxr4sJ/DbTGgHS4+Rs2RVd2g7iOap6SLGPDknRK9ztKNsE/Fg6QhSeh1FGE5f6gHGQmvvn3I3xhw==",
1253 "dependencies": { 1257 "dependencies": {
1254 "regenerator-runtime": "^0.13.4" 1258 "regenerator-runtime": "^0.13.4"
1259 + },
1260 + "engines": {
1261 + "node": ">=6.9.0"
1255 } 1262 }
1256 }, 1263 },
1257 "node_modules/@babel/runtime-corejs3": { 1264 "node_modules/@babel/runtime-corejs3": {
...@@ -1332,6 +1339,23 @@ ...@@ -1332,6 +1339,23 @@
1332 "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-10.1.0.tgz", 1339 "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-10.1.0.tgz",
1333 "integrity": "sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg==" 1340 "integrity": "sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg=="
1334 }, 1341 },
1342 + "node_modules/@emotion/cache": {
1343 + "version": "11.4.0",
1344 + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.4.0.tgz",
1345 + "integrity": "sha512-Zx70bjE7LErRO9OaZrhf22Qye1y4F7iDl+ITjet0J+i+B88PrAOBkKvaAWhxsZf72tDLajwCgfCjJ2dvH77C3g==",
1346 + "dependencies": {
1347 + "@emotion/memoize": "^0.7.4",
1348 + "@emotion/sheet": "^1.0.0",
1349 + "@emotion/utils": "^1.0.0",
1350 + "@emotion/weak-memoize": "^0.2.5",
1351 + "stylis": "^4.0.3"
1352 + }
1353 + },
1354 + "node_modules/@emotion/hash": {
1355 + "version": "0.8.0",
1356 + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz",
1357 + "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow=="
1358 + },
1335 "node_modules/@emotion/is-prop-valid": { 1359 "node_modules/@emotion/is-prop-valid": {
1336 "version": "0.8.8", 1360 "version": "0.8.8",
1337 "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz", 1361 "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz",
...@@ -1345,6 +1369,49 @@ ...@@ -1345,6 +1369,49 @@
1345 "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", 1369 "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz",
1346 "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==" 1370 "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw=="
1347 }, 1371 },
1372 + "node_modules/@emotion/react": {
1373 + "version": "11.4.1",
1374 + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.4.1.tgz",
1375 + "integrity": "sha512-pRegcsuGYj4FCdZN6j5vqCALkNytdrKw3TZMekTzNXixRg4wkLsU5QEaBG5LC6l01Vppxlp7FE3aTHpIG5phLg==",
1376 + "dependencies": {
1377 + "@babel/runtime": "^7.13.10",
1378 + "@emotion/cache": "^11.4.0",
1379 + "@emotion/serialize": "^1.0.2",
1380 + "@emotion/sheet": "^1.0.2",
1381 + "@emotion/utils": "^1.0.0",
1382 + "@emotion/weak-memoize": "^0.2.5",
1383 + "hoist-non-react-statics": "^3.3.1"
1384 + },
1385 + "peerDependencies": {
1386 + "@babel/core": "^7.0.0",
1387 + "react": ">=16.8.0"
1388 + },
1389 + "peerDependenciesMeta": {
1390 + "@babel/core": {
1391 + "optional": true
1392 + },
1393 + "@types/react": {
1394 + "optional": true
1395 + }
1396 + }
1397 + },
1398 + "node_modules/@emotion/serialize": {
1399 + "version": "1.0.2",
1400 + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.0.2.tgz",
1401 + "integrity": "sha512-95MgNJ9+/ajxU7QIAruiOAdYNjxZX7G2mhgrtDWswA21VviYIRP1R5QilZ/bDY42xiKsaktP4egJb3QdYQZi1A==",
1402 + "dependencies": {
1403 + "@emotion/hash": "^0.8.0",
1404 + "@emotion/memoize": "^0.7.4",
1405 + "@emotion/unitless": "^0.7.5",
1406 + "@emotion/utils": "^1.0.0",
1407 + "csstype": "^3.0.2"
1408 + }
1409 + },
1410 + "node_modules/@emotion/sheet": {
1411 + "version": "1.0.2",
1412 + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.0.2.tgz",
1413 + "integrity": "sha512-QQPB1B70JEVUHuNtzjHftMGv6eC3Y9wqavyarj4x4lg47RACkeSfNo5pxIOKizwS9AEFLohsqoaxGQj4p0vSIw=="
1414 + },
1348 "node_modules/@emotion/stylis": { 1415 "node_modules/@emotion/stylis": {
1349 "version": "0.8.5", 1416 "version": "0.8.5",
1350 "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz", 1417 "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz",
...@@ -1355,6 +1422,16 @@ ...@@ -1355,6 +1422,16 @@
1355 "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", 1422 "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz",
1356 "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" 1423 "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg=="
1357 }, 1424 },
1425 + "node_modules/@emotion/utils": {
1426 + "version": "1.0.0",
1427 + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.0.0.tgz",
1428 + "integrity": "sha512-mQC2b3XLDs6QCW+pDQDiyO/EdGZYOygE8s5N5rrzjSI4M3IejPE/JPndCBwRT9z982aqQNi6beWs1UeayrQxxA=="
1429 + },
1430 + "node_modules/@emotion/weak-memoize": {
1431 + "version": "0.2.5",
1432 + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz",
1433 + "integrity": "sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA=="
1434 + },
1358 "node_modules/@eslint/eslintrc": { 1435 "node_modules/@eslint/eslintrc": {
1359 "version": "0.4.3", 1436 "version": "0.4.3",
1360 "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", 1437 "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz",
...@@ -2229,17 +2306,6 @@ ...@@ -2229,17 +2306,6 @@
2229 "node": ">=10" 2306 "node": ">=10"
2230 } 2307 }
2231 }, 2308 },
2232 - "node_modules/@testing-library/dom/node_modules/@babel/runtime": {
2233 - "version": "7.14.8",
2234 - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.8.tgz",
2235 - "integrity": "sha512-twj3L8Og5SaCRCErB4x4ajbvBIVV77CGeFglHpeg5WC5FF8TZzBWXtTJ4MqaD9QszLYTtr+IsaAL2rEUevb+eg==",
2236 - "dependencies": {
2237 - "regenerator-runtime": "^0.13.4"
2238 - },
2239 - "engines": {
2240 - "node": ">=6.9.0"
2241 - }
2242 - },
2243 "node_modules/@testing-library/dom/node_modules/chalk": { 2309 "node_modules/@testing-library/dom/node_modules/chalk": {
2244 "version": "4.1.2", 2310 "version": "4.1.2",
2245 "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 2311 "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
...@@ -2276,17 +2342,6 @@ ...@@ -2276,17 +2342,6 @@
2276 "yarn": ">=1" 2342 "yarn": ">=1"
2277 } 2343 }
2278 }, 2344 },
2279 - "node_modules/@testing-library/jest-dom/node_modules/@babel/runtime": {
2280 - "version": "7.14.8",
2281 - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.8.tgz",
2282 - "integrity": "sha512-twj3L8Og5SaCRCErB4x4ajbvBIVV77CGeFglHpeg5WC5FF8TZzBWXtTJ4MqaD9QszLYTtr+IsaAL2rEUevb+eg==",
2283 - "dependencies": {
2284 - "regenerator-runtime": "^0.13.4"
2285 - },
2286 - "engines": {
2287 - "node": ">=6.9.0"
2288 - }
2289 - },
2290 "node_modules/@testing-library/jest-dom/node_modules/chalk": { 2345 "node_modules/@testing-library/jest-dom/node_modules/chalk": {
2291 "version": "3.0.0", 2346 "version": "3.0.0",
2292 "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", 2347 "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
...@@ -2315,17 +2370,6 @@ ...@@ -2315,17 +2370,6 @@
2315 "react-dom": "*" 2370 "react-dom": "*"
2316 } 2371 }
2317 }, 2372 },
2318 - "node_modules/@testing-library/react/node_modules/@babel/runtime": {
2319 - "version": "7.14.8",
2320 - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.8.tgz",
2321 - "integrity": "sha512-twj3L8Og5SaCRCErB4x4ajbvBIVV77CGeFglHpeg5WC5FF8TZzBWXtTJ4MqaD9QszLYTtr+IsaAL2rEUevb+eg==",
2322 - "dependencies": {
2323 - "regenerator-runtime": "^0.13.4"
2324 - },
2325 - "engines": {
2326 - "node": ">=6.9.0"
2327 - }
2328 - },
2329 "node_modules/@testing-library/user-event": { 2373 "node_modules/@testing-library/user-event": {
2330 "version": "12.8.3", 2374 "version": "12.8.3",
2331 "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-12.8.3.tgz", 2375 "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-12.8.3.tgz",
...@@ -2341,17 +2385,6 @@ ...@@ -2341,17 +2385,6 @@
2341 "@testing-library/dom": ">=7.21.4" 2385 "@testing-library/dom": ">=7.21.4"
2342 } 2386 }
2343 }, 2387 },
2344 - "node_modules/@testing-library/user-event/node_modules/@babel/runtime": {
2345 - "version": "7.14.8",
2346 - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.8.tgz",
2347 - "integrity": "sha512-twj3L8Og5SaCRCErB4x4ajbvBIVV77CGeFglHpeg5WC5FF8TZzBWXtTJ4MqaD9QszLYTtr+IsaAL2rEUevb+eg==",
2348 - "dependencies": {
2349 - "regenerator-runtime": "^0.13.4"
2350 - },
2351 - "engines": {
2352 - "node": ">=6.9.0"
2353 - }
2354 - },
2355 "node_modules/@types/anymatch": { 2388 "node_modules/@types/anymatch": {
2356 "version": "1.3.1", 2389 "version": "1.3.1",
2357 "resolved": "https://registry.npmjs.org/@types/anymatch/-/anymatch-1.3.1.tgz", 2390 "resolved": "https://registry.npmjs.org/@types/anymatch/-/anymatch-1.3.1.tgz",
...@@ -2536,6 +2569,15 @@ ...@@ -2536,6 +2569,15 @@
2536 "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", 2569 "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz",
2537 "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==" 2570 "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug=="
2538 }, 2571 },
2572 + "node_modules/@types/qrcode": {
2573 + "version": "1.4.1",
2574 + "resolved": "https://registry.npmjs.org/@types/qrcode/-/qrcode-1.4.1.tgz",
2575 + "integrity": "sha512-vxMyr7JM7tYPxu8vUE83NiosWX5DZieCyYeJRoOIg0pAkyofCBzknJ2ycUZkPGDFis2RS8GN/BeJLnRnAPxeCA==",
2576 + "dev": true,
2577 + "dependencies": {
2578 + "@types/node": "*"
2579 + }
2580 + },
2539 "node_modules/@types/react": { 2581 "node_modules/@types/react": {
2540 "version": "17.0.16", 2582 "version": "17.0.16",
2541 "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.16.tgz", 2583 "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.16.tgz",
...@@ -4813,6 +4855,25 @@ ...@@ -4813,6 +4855,25 @@
4813 "isarray": "^1.0.0" 4855 "isarray": "^1.0.0"
4814 } 4856 }
4815 }, 4857 },
4858 + "node_modules/buffer-alloc": {
4859 + "version": "1.2.0",
4860 + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz",
4861 + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==",
4862 + "dependencies": {
4863 + "buffer-alloc-unsafe": "^1.1.0",
4864 + "buffer-fill": "^1.0.0"
4865 + }
4866 + },
4867 + "node_modules/buffer-alloc-unsafe": {
4868 + "version": "1.1.0",
4869 + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz",
4870 + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg=="
4871 + },
4872 + "node_modules/buffer-fill": {
4873 + "version": "1.0.0",
4874 + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz",
4875 + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw="
4876 + },
4816 "node_modules/buffer-from": { 4877 "node_modules/buffer-from": {
4817 "version": "1.1.1", 4878 "version": "1.1.1",
4818 "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 4879 "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
...@@ -6483,6 +6544,11 @@ ...@@ -6483,6 +6544,11 @@
6483 "randombytes": "^2.0.0" 6544 "randombytes": "^2.0.0"
6484 } 6545 }
6485 }, 6546 },
6547 + "node_modules/dijkstrajs": {
6548 + "version": "1.0.2",
6549 + "resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.2.tgz",
6550 + "integrity": "sha512-QV6PMaHTCNmKSeP6QoXhVTw9snc9VD8MulTT0Bd99Pacp4SS1cjcrYPgBPmibqKVtMJJfqC6XvOXgPMEEPH/fg=="
6551 + },
6486 "node_modules/dir-glob": { 6552 "node_modules/dir-glob": {
6487 "version": "3.0.1", 6553 "version": "3.0.1",
6488 "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", 6554 "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
...@@ -12762,6 +12828,14 @@ ...@@ -12762,6 +12828,14 @@
12762 "node": ">=6" 12828 "node": ">=6"
12763 } 12829 }
12764 }, 12830 },
12831 + "node_modules/pngjs": {
12832 + "version": "3.4.0",
12833 + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz",
12834 + "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==",
12835 + "engines": {
12836 + "node": ">=4.0.0"
12837 + }
12838 + },
12765 "node_modules/pnp-webpack-plugin": { 12839 "node_modules/pnp-webpack-plugin": {
12766 "version": "1.6.4", 12840 "version": "1.6.4",
12767 "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz", 12841 "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz",
...@@ -14095,6 +14169,193 @@ ...@@ -14095,6 +14169,193 @@
14095 "teleport": ">=0.2.0" 14169 "teleport": ">=0.2.0"
14096 } 14170 }
14097 }, 14171 },
14172 + "node_modules/qrcode": {
14173 + "version": "1.4.4",
14174 + "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.4.4.tgz",
14175 + "integrity": "sha512-oLzEC5+NKFou9P0bMj5+v6Z40evexeE29Z9cummZXZ9QXyMr3lphkURzxjXgPJC5azpxcshoDWV1xE46z+/c3Q==",
14176 + "dependencies": {
14177 + "buffer": "^5.4.3",
14178 + "buffer-alloc": "^1.2.0",
14179 + "buffer-from": "^1.1.1",
14180 + "dijkstrajs": "^1.0.1",
14181 + "isarray": "^2.0.1",
14182 + "pngjs": "^3.3.0",
14183 + "yargs": "^13.2.4"
14184 + },
14185 + "bin": {
14186 + "qrcode": "bin/qrcode"
14187 + },
14188 + "engines": {
14189 + "node": ">=4"
14190 + }
14191 + },
14192 + "node_modules/qrcode/node_modules/ansi-regex": {
14193 + "version": "4.1.0",
14194 + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
14195 + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
14196 + "engines": {
14197 + "node": ">=6"
14198 + }
14199 + },
14200 + "node_modules/qrcode/node_modules/ansi-styles": {
14201 + "version": "3.2.1",
14202 + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
14203 + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
14204 + "dependencies": {
14205 + "color-convert": "^1.9.0"
14206 + },
14207 + "engines": {
14208 + "node": ">=4"
14209 + }
14210 + },
14211 + "node_modules/qrcode/node_modules/buffer": {
14212 + "version": "5.7.1",
14213 + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
14214 + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
14215 + "funding": [
14216 + {
14217 + "type": "github",
14218 + "url": "https://github.com/sponsors/feross"
14219 + },
14220 + {
14221 + "type": "patreon",
14222 + "url": "https://www.patreon.com/feross"
14223 + },
14224 + {
14225 + "type": "consulting",
14226 + "url": "https://feross.org/support"
14227 + }
14228 + ],
14229 + "dependencies": {
14230 + "base64-js": "^1.3.1",
14231 + "ieee754": "^1.1.13"
14232 + }
14233 + },
14234 + "node_modules/qrcode/node_modules/cliui": {
14235 + "version": "5.0.0",
14236 + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
14237 + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
14238 + "dependencies": {
14239 + "string-width": "^3.1.0",
14240 + "strip-ansi": "^5.2.0",
14241 + "wrap-ansi": "^5.1.0"
14242 + }
14243 + },
14244 + "node_modules/qrcode/node_modules/emoji-regex": {
14245 + "version": "7.0.3",
14246 + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
14247 + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA=="
14248 + },
14249 + "node_modules/qrcode/node_modules/find-up": {
14250 + "version": "3.0.0",
14251 + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
14252 + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
14253 + "dependencies": {
14254 + "locate-path": "^3.0.0"
14255 + },
14256 + "engines": {
14257 + "node": ">=6"
14258 + }
14259 + },
14260 + "node_modules/qrcode/node_modules/is-fullwidth-code-point": {
14261 + "version": "2.0.0",
14262 + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
14263 + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
14264 + "engines": {
14265 + "node": ">=4"
14266 + }
14267 + },
14268 + "node_modules/qrcode/node_modules/isarray": {
14269 + "version": "2.0.5",
14270 + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
14271 + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="
14272 + },
14273 + "node_modules/qrcode/node_modules/locate-path": {
14274 + "version": "3.0.0",
14275 + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
14276 + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
14277 + "dependencies": {
14278 + "p-locate": "^3.0.0",
14279 + "path-exists": "^3.0.0"
14280 + },
14281 + "engines": {
14282 + "node": ">=6"
14283 + }
14284 + },
14285 + "node_modules/qrcode/node_modules/p-locate": {
14286 + "version": "3.0.0",
14287 + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
14288 + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
14289 + "dependencies": {
14290 + "p-limit": "^2.0.0"
14291 + },
14292 + "engines": {
14293 + "node": ">=6"
14294 + }
14295 + },
14296 + "node_modules/qrcode/node_modules/string-width": {
14297 + "version": "3.1.0",
14298 + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
14299 + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
14300 + "dependencies": {
14301 + "emoji-regex": "^7.0.1",
14302 + "is-fullwidth-code-point": "^2.0.0",
14303 + "strip-ansi": "^5.1.0"
14304 + },
14305 + "engines": {
14306 + "node": ">=6"
14307 + }
14308 + },
14309 + "node_modules/qrcode/node_modules/strip-ansi": {
14310 + "version": "5.2.0",
14311 + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
14312 + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
14313 + "dependencies": {
14314 + "ansi-regex": "^4.1.0"
14315 + },
14316 + "engines": {
14317 + "node": ">=6"
14318 + }
14319 + },
14320 + "node_modules/qrcode/node_modules/wrap-ansi": {
14321 + "version": "5.1.0",
14322 + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
14323 + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
14324 + "dependencies": {
14325 + "ansi-styles": "^3.2.0",
14326 + "string-width": "^3.0.0",
14327 + "strip-ansi": "^5.0.0"
14328 + },
14329 + "engines": {
14330 + "node": ">=6"
14331 + }
14332 + },
14333 + "node_modules/qrcode/node_modules/yargs": {
14334 + "version": "13.3.2",
14335 + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
14336 + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
14337 + "dependencies": {
14338 + "cliui": "^5.0.0",
14339 + "find-up": "^3.0.0",
14340 + "get-caller-file": "^2.0.1",
14341 + "require-directory": "^2.1.1",
14342 + "require-main-filename": "^2.0.0",
14343 + "set-blocking": "^2.0.0",
14344 + "string-width": "^3.0.0",
14345 + "which-module": "^2.0.0",
14346 + "y18n": "^4.0.0",
14347 + "yargs-parser": "^13.1.2"
14348 + }
14349 + },
14350 + "node_modules/qrcode/node_modules/yargs-parser": {
14351 + "version": "13.1.2",
14352 + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz",
14353 + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==",
14354 + "dependencies": {
14355 + "camelcase": "^5.0.0",
14356 + "decamelize": "^1.2.0"
14357 + }
14358 + },
14098 "node_modules/qs": { 14359 "node_modules/qs": {
14099 "version": "6.7.0", 14360 "version": "6.7.0",
14100 "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", 14361 "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
...@@ -14737,6 +14998,18 @@ ...@@ -14737,6 +14998,18 @@
14737 "node": ">=0.10.0" 14998 "node": ">=0.10.0"
14738 } 14999 }
14739 }, 15000 },
15001 + "node_modules/react-spinners": {
15002 + "version": "0.11.0",
15003 + "resolved": "https://registry.npmjs.org/react-spinners/-/react-spinners-0.11.0.tgz",
15004 + "integrity": "sha512-rDZc0ABWn/M1OryboGsWVmIPg8uYWl0L35jPUhr40+Yg+syVPjeHwvnB7XWaRpaKus3M0cG9BiJA+ZB0dAwWyw==",
15005 + "dependencies": {
15006 + "@emotion/react": "^11.1.4"
15007 + },
15008 + "peerDependencies": {
15009 + "react": "^16.0.0 || ^17.0.0",
15010 + "react-dom": "^16.0.0 || ^17.0.0"
15011 + }
15012 + },
14740 "node_modules/read-pkg": { 15013 "node_modules/read-pkg": {
14741 "version": "5.2.0", 15014 "version": "5.2.0",
14742 "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", 15015 "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
...@@ -16776,6 +17049,11 @@ ...@@ -16776,6 +17049,11 @@
16776 "node": ">=8" 17049 "node": ">=8"
16777 } 17050 }
16778 }, 17051 },
17052 + "node_modules/stylis": {
17053 + "version": "4.0.10",
17054 + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.0.10.tgz",
17055 + "integrity": "sha512-m3k+dk7QeJw660eIKRRn3xPF6uuvHs/FFzjX3HQ5ove0qYsiygoAhwn5a3IYKaZPo5LrYD0rfVmtv1gNY1uYwg=="
17056 + },
16779 "node_modules/supports-color": { 17057 "node_modules/supports-color": {
16780 "version": "7.2.0", 17058 "version": "7.2.0",
16781 "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 17059 "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
...@@ -20048,9 +20326,9 @@ ...@@ -20048,9 +20326,9 @@
20048 } 20326 }
20049 }, 20327 },
20050 "@babel/runtime": { 20328 "@babel/runtime": {
20051 - "version": "7.12.18", 20329 + "version": "7.15.4",
20052 - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.18.tgz", 20330 + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.15.4.tgz",
20053 - "integrity": "sha512-BogPQ7ciE6SYAUPtlm9tWbgI9+2AgqSam6QivMgXgAT+fKbgppaj4ZX15MHeLC1PVF5sNk70huBu20XxWOs8Cg==", 20331 + "integrity": "sha512-99catp6bHCaxr4sJ/DbTGgHS4+Rs2RVd2g7iOap6SLGPDknRK9ztKNsE/Fg6QhSeh1FGE5f6gHGQmvvn3I3xhw==",
20054 "requires": { 20332 "requires": {
20055 "regenerator-runtime": "^0.13.4" 20333 "regenerator-runtime": "^0.13.4"
20056 } 20334 }
...@@ -20124,6 +20402,23 @@ ...@@ -20124,6 +20402,23 @@
20124 "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-10.1.0.tgz", 20402 "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-10.1.0.tgz",
20125 "integrity": "sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg==" 20403 "integrity": "sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg=="
20126 }, 20404 },
20405 + "@emotion/cache": {
20406 + "version": "11.4.0",
20407 + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.4.0.tgz",
20408 + "integrity": "sha512-Zx70bjE7LErRO9OaZrhf22Qye1y4F7iDl+ITjet0J+i+B88PrAOBkKvaAWhxsZf72tDLajwCgfCjJ2dvH77C3g==",
20409 + "requires": {
20410 + "@emotion/memoize": "^0.7.4",
20411 + "@emotion/sheet": "^1.0.0",
20412 + "@emotion/utils": "^1.0.0",
20413 + "@emotion/weak-memoize": "^0.2.5",
20414 + "stylis": "^4.0.3"
20415 + }
20416 + },
20417 + "@emotion/hash": {
20418 + "version": "0.8.0",
20419 + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz",
20420 + "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow=="
20421 + },
20127 "@emotion/is-prop-valid": { 20422 "@emotion/is-prop-valid": {
20128 "version": "0.8.8", 20423 "version": "0.8.8",
20129 "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz", 20424 "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz",
...@@ -20137,6 +20432,37 @@ ...@@ -20137,6 +20432,37 @@
20137 "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", 20432 "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz",
20138 "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==" 20433 "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw=="
20139 }, 20434 },
20435 + "@emotion/react": {
20436 + "version": "11.4.1",
20437 + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.4.1.tgz",
20438 + "integrity": "sha512-pRegcsuGYj4FCdZN6j5vqCALkNytdrKw3TZMekTzNXixRg4wkLsU5QEaBG5LC6l01Vppxlp7FE3aTHpIG5phLg==",
20439 + "requires": {
20440 + "@babel/runtime": "^7.13.10",
20441 + "@emotion/cache": "^11.4.0",
20442 + "@emotion/serialize": "^1.0.2",
20443 + "@emotion/sheet": "^1.0.2",
20444 + "@emotion/utils": "^1.0.0",
20445 + "@emotion/weak-memoize": "^0.2.5",
20446 + "hoist-non-react-statics": "^3.3.1"
20447 + }
20448 + },
20449 + "@emotion/serialize": {
20450 + "version": "1.0.2",
20451 + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.0.2.tgz",
20452 + "integrity": "sha512-95MgNJ9+/ajxU7QIAruiOAdYNjxZX7G2mhgrtDWswA21VviYIRP1R5QilZ/bDY42xiKsaktP4egJb3QdYQZi1A==",
20453 + "requires": {
20454 + "@emotion/hash": "^0.8.0",
20455 + "@emotion/memoize": "^0.7.4",
20456 + "@emotion/unitless": "^0.7.5",
20457 + "@emotion/utils": "^1.0.0",
20458 + "csstype": "^3.0.2"
20459 + }
20460 + },
20461 + "@emotion/sheet": {
20462 + "version": "1.0.2",
20463 + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.0.2.tgz",
20464 + "integrity": "sha512-QQPB1B70JEVUHuNtzjHftMGv6eC3Y9wqavyarj4x4lg47RACkeSfNo5pxIOKizwS9AEFLohsqoaxGQj4p0vSIw=="
20465 + },
20140 "@emotion/stylis": { 20466 "@emotion/stylis": {
20141 "version": "0.8.5", 20467 "version": "0.8.5",
20142 "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz", 20468 "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz",
...@@ -20147,6 +20473,16 @@ ...@@ -20147,6 +20473,16 @@
20147 "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", 20473 "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz",
20148 "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" 20474 "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg=="
20149 }, 20475 },
20476 + "@emotion/utils": {
20477 + "version": "1.0.0",
20478 + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.0.0.tgz",
20479 + "integrity": "sha512-mQC2b3XLDs6QCW+pDQDiyO/EdGZYOygE8s5N5rrzjSI4M3IejPE/JPndCBwRT9z982aqQNi6beWs1UeayrQxxA=="
20480 + },
20481 + "@emotion/weak-memoize": {
20482 + "version": "0.2.5",
20483 + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz",
20484 + "integrity": "sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA=="
20485 + },
20150 "@eslint/eslintrc": { 20486 "@eslint/eslintrc": {
20151 "version": "0.4.3", 20487 "version": "0.4.3",
20152 "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", 20488 "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz",
...@@ -20777,14 +21113,6 @@ ...@@ -20777,14 +21113,6 @@
20777 "pretty-format": "^26.6.2" 21113 "pretty-format": "^26.6.2"
20778 }, 21114 },
20779 "dependencies": { 21115 "dependencies": {
20780 - "@babel/runtime": {
20781 - "version": "7.14.8",
20782 - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.8.tgz",
20783 - "integrity": "sha512-twj3L8Og5SaCRCErB4x4ajbvBIVV77CGeFglHpeg5WC5FF8TZzBWXtTJ4MqaD9QszLYTtr+IsaAL2rEUevb+eg==",
20784 - "requires": {
20785 - "regenerator-runtime": "^0.13.4"
20786 - }
20787 - },
20788 "chalk": { 21116 "chalk": {
20789 "version": "4.1.2", 21117 "version": "4.1.2",
20790 "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 21118 "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
...@@ -20812,14 +21140,6 @@ ...@@ -20812,14 +21140,6 @@
20812 "redent": "^3.0.0" 21140 "redent": "^3.0.0"
20813 }, 21141 },
20814 "dependencies": { 21142 "dependencies": {
20815 - "@babel/runtime": {
20816 - "version": "7.14.8",
20817 - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.8.tgz",
20818 - "integrity": "sha512-twj3L8Og5SaCRCErB4x4ajbvBIVV77CGeFglHpeg5WC5FF8TZzBWXtTJ4MqaD9QszLYTtr+IsaAL2rEUevb+eg==",
20819 - "requires": {
20820 - "regenerator-runtime": "^0.13.4"
20821 - }
20822 - },
20823 "chalk": { 21143 "chalk": {
20824 "version": "3.0.0", 21144 "version": "3.0.0",
20825 "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", 21145 "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
...@@ -20838,16 +21158,6 @@ ...@@ -20838,16 +21158,6 @@
20838 "requires": { 21158 "requires": {
20839 "@babel/runtime": "^7.12.5", 21159 "@babel/runtime": "^7.12.5",
20840 "@testing-library/dom": "^7.28.1" 21160 "@testing-library/dom": "^7.28.1"
20841 - },
20842 - "dependencies": {
20843 - "@babel/runtime": {
20844 - "version": "7.14.8",
20845 - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.8.tgz",
20846 - "integrity": "sha512-twj3L8Og5SaCRCErB4x4ajbvBIVV77CGeFglHpeg5WC5FF8TZzBWXtTJ4MqaD9QszLYTtr+IsaAL2rEUevb+eg==",
20847 - "requires": {
20848 - "regenerator-runtime": "^0.13.4"
20849 - }
20850 - }
20851 } 21161 }
20852 }, 21162 },
20853 "@testing-library/user-event": { 21163 "@testing-library/user-event": {
...@@ -20856,16 +21166,6 @@ ...@@ -20856,16 +21166,6 @@
20856 "integrity": "sha512-IR0iWbFkgd56Bu5ZI/ej8yQwrkCv8Qydx6RzwbKz9faXazR/+5tvYKsZQgyXJiwgpcva127YO6JcWy7YlCfofQ==", 21166 "integrity": "sha512-IR0iWbFkgd56Bu5ZI/ej8yQwrkCv8Qydx6RzwbKz9faXazR/+5tvYKsZQgyXJiwgpcva127YO6JcWy7YlCfofQ==",
20857 "requires": { 21167 "requires": {
20858 "@babel/runtime": "^7.12.5" 21168 "@babel/runtime": "^7.12.5"
20859 - },
20860 - "dependencies": {
20861 - "@babel/runtime": {
20862 - "version": "7.14.8",
20863 - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.8.tgz",
20864 - "integrity": "sha512-twj3L8Og5SaCRCErB4x4ajbvBIVV77CGeFglHpeg5WC5FF8TZzBWXtTJ4MqaD9QszLYTtr+IsaAL2rEUevb+eg==",
20865 - "requires": {
20866 - "regenerator-runtime": "^0.13.4"
20867 - }
20868 - }
20869 } 21169 }
20870 }, 21170 },
20871 "@types/anymatch": { 21171 "@types/anymatch": {
...@@ -21056,6 +21356,15 @@ ...@@ -21056,6 +21356,15 @@
21056 "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", 21356 "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz",
21057 "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==" 21357 "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug=="
21058 }, 21358 },
21359 + "@types/qrcode": {
21360 + "version": "1.4.1",
21361 + "resolved": "https://registry.npmjs.org/@types/qrcode/-/qrcode-1.4.1.tgz",
21362 + "integrity": "sha512-vxMyr7JM7tYPxu8vUE83NiosWX5DZieCyYeJRoOIg0pAkyofCBzknJ2ycUZkPGDFis2RS8GN/BeJLnRnAPxeCA==",
21363 + "dev": true,
21364 + "requires": {
21365 + "@types/node": "*"
21366 + }
21367 + },
21059 "@types/react": { 21368 "@types/react": {
21060 "version": "17.0.16", 21369 "version": "17.0.16",
21061 "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.16.tgz", 21370 "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.16.tgz",
...@@ -22917,6 +23226,25 @@ ...@@ -22917,6 +23226,25 @@
22917 "isarray": "^1.0.0" 23226 "isarray": "^1.0.0"
22918 } 23227 }
22919 }, 23228 },
23229 + "buffer-alloc": {
23230 + "version": "1.2.0",
23231 + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz",
23232 + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==",
23233 + "requires": {
23234 + "buffer-alloc-unsafe": "^1.1.0",
23235 + "buffer-fill": "^1.0.0"
23236 + }
23237 + },
23238 + "buffer-alloc-unsafe": {
23239 + "version": "1.1.0",
23240 + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz",
23241 + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg=="
23242 + },
23243 + "buffer-fill": {
23244 + "version": "1.0.0",
23245 + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz",
23246 + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw="
23247 + },
22920 "buffer-from": { 23248 "buffer-from": {
22921 "version": "1.1.1", 23249 "version": "1.1.1",
22922 "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 23250 "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
...@@ -24256,6 +24584,11 @@ ...@@ -24256,6 +24584,11 @@
24256 "randombytes": "^2.0.0" 24584 "randombytes": "^2.0.0"
24257 } 24585 }
24258 }, 24586 },
24587 + "dijkstrajs": {
24588 + "version": "1.0.2",
24589 + "resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.2.tgz",
24590 + "integrity": "sha512-QV6PMaHTCNmKSeP6QoXhVTw9snc9VD8MulTT0Bd99Pacp4SS1cjcrYPgBPmibqKVtMJJfqC6XvOXgPMEEPH/fg=="
24591 + },
24259 "dir-glob": { 24592 "dir-glob": {
24260 "version": "3.0.1", 24593 "version": "3.0.1",
24261 "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", 24594 "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
...@@ -29110,6 +29443,11 @@ ...@@ -29110,6 +29443,11 @@
29110 } 29443 }
29111 } 29444 }
29112 }, 29445 },
29446 + "pngjs": {
29447 + "version": "3.4.0",
29448 + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz",
29449 + "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w=="
29450 + },
29113 "pnp-webpack-plugin": { 29451 "pnp-webpack-plugin": {
29114 "version": "1.6.4", 29452 "version": "1.6.4",
29115 "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz", 29453 "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz",
...@@ -30180,6 +30518,148 @@ ...@@ -30180,6 +30518,148 @@
30180 "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", 30518 "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
30181 "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=" 30519 "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc="
30182 }, 30520 },
30521 + "qrcode": {
30522 + "version": "1.4.4",
30523 + "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.4.4.tgz",
30524 + "integrity": "sha512-oLzEC5+NKFou9P0bMj5+v6Z40evexeE29Z9cummZXZ9QXyMr3lphkURzxjXgPJC5azpxcshoDWV1xE46z+/c3Q==",
30525 + "requires": {
30526 + "buffer": "^5.4.3",
30527 + "buffer-alloc": "^1.2.0",
30528 + "buffer-from": "^1.1.1",
30529 + "dijkstrajs": "^1.0.1",
30530 + "isarray": "^2.0.1",
30531 + "pngjs": "^3.3.0",
30532 + "yargs": "^13.2.4"
30533 + },
30534 + "dependencies": {
30535 + "ansi-regex": {
30536 + "version": "4.1.0",
30537 + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
30538 + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg=="
30539 + },
30540 + "ansi-styles": {
30541 + "version": "3.2.1",
30542 + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
30543 + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
30544 + "requires": {
30545 + "color-convert": "^1.9.0"
30546 + }
30547 + },
30548 + "buffer": {
30549 + "version": "5.7.1",
30550 + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
30551 + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
30552 + "requires": {
30553 + "base64-js": "^1.3.1",
30554 + "ieee754": "^1.1.13"
30555 + }
30556 + },
30557 + "cliui": {
30558 + "version": "5.0.0",
30559 + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
30560 + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
30561 + "requires": {
30562 + "string-width": "^3.1.0",
30563 + "strip-ansi": "^5.2.0",
30564 + "wrap-ansi": "^5.1.0"
30565 + }
30566 + },
30567 + "emoji-regex": {
30568 + "version": "7.0.3",
30569 + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
30570 + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA=="
30571 + },
30572 + "find-up": {
30573 + "version": "3.0.0",
30574 + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
30575 + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
30576 + "requires": {
30577 + "locate-path": "^3.0.0"
30578 + }
30579 + },
30580 + "is-fullwidth-code-point": {
30581 + "version": "2.0.0",
30582 + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
30583 + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8="
30584 + },
30585 + "isarray": {
30586 + "version": "2.0.5",
30587 + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
30588 + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="
30589 + },
30590 + "locate-path": {
30591 + "version": "3.0.0",
30592 + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
30593 + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
30594 + "requires": {
30595 + "p-locate": "^3.0.0",
30596 + "path-exists": "^3.0.0"
30597 + }
30598 + },
30599 + "p-locate": {
30600 + "version": "3.0.0",
30601 + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
30602 + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
30603 + "requires": {
30604 + "p-limit": "^2.0.0"
30605 + }
30606 + },
30607 + "string-width": {
30608 + "version": "3.1.0",
30609 + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
30610 + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
30611 + "requires": {
30612 + "emoji-regex": "^7.0.1",
30613 + "is-fullwidth-code-point": "^2.0.0",
30614 + "strip-ansi": "^5.1.0"
30615 + }
30616 + },
30617 + "strip-ansi": {
30618 + "version": "5.2.0",
30619 + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
30620 + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
30621 + "requires": {
30622 + "ansi-regex": "^4.1.0"
30623 + }
30624 + },
30625 + "wrap-ansi": {
30626 + "version": "5.1.0",
30627 + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
30628 + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
30629 + "requires": {
30630 + "ansi-styles": "^3.2.0",
30631 + "string-width": "^3.0.0",
30632 + "strip-ansi": "^5.0.0"
30633 + }
30634 + },
30635 + "yargs": {
30636 + "version": "13.3.2",
30637 + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
30638 + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
30639 + "requires": {
30640 + "cliui": "^5.0.0",
30641 + "find-up": "^3.0.0",
30642 + "get-caller-file": "^2.0.1",
30643 + "require-directory": "^2.1.1",
30644 + "require-main-filename": "^2.0.0",
30645 + "set-blocking": "^2.0.0",
30646 + "string-width": "^3.0.0",
30647 + "which-module": "^2.0.0",
30648 + "y18n": "^4.0.0",
30649 + "yargs-parser": "^13.1.2"
30650 + }
30651 + },
30652 + "yargs-parser": {
30653 + "version": "13.1.2",
30654 + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz",
30655 + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==",
30656 + "requires": {
30657 + "camelcase": "^5.0.0",
30658 + "decamelize": "^1.2.0"
30659 + }
30660 + }
30661 + }
30662 + },
30183 "qs": { 30663 "qs": {
30184 "version": "6.7.0", 30664 "version": "6.7.0",
30185 "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", 30665 "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
...@@ -30669,6 +31149,14 @@ ...@@ -30669,6 +31149,14 @@
30669 } 31149 }
30670 } 31150 }
30671 }, 31151 },
31152 + "react-spinners": {
31153 + "version": "0.11.0",
31154 + "resolved": "https://registry.npmjs.org/react-spinners/-/react-spinners-0.11.0.tgz",
31155 + "integrity": "sha512-rDZc0ABWn/M1OryboGsWVmIPg8uYWl0L35jPUhr40+Yg+syVPjeHwvnB7XWaRpaKus3M0cG9BiJA+ZB0dAwWyw==",
31156 + "requires": {
31157 + "@emotion/react": "^11.1.4"
31158 + }
31159 + },
30672 "read-pkg": { 31160 "read-pkg": {
30673 "version": "5.2.0", 31161 "version": "5.2.0",
30674 "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", 31162 "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
...@@ -32283,6 +32771,11 @@ ...@@ -32283,6 +32771,11 @@
32283 } 32771 }
32284 } 32772 }
32285 }, 32773 },
32774 + "stylis": {
32775 + "version": "4.0.10",
32776 + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.0.10.tgz",
32777 + "integrity": "sha512-m3k+dk7QeJw660eIKRRn3xPF6uuvHs/FFzjX3HQ5ove0qYsiygoAhwn5a3IYKaZPo5LrYD0rfVmtv1gNY1uYwg=="
32778 + },
32286 "supports-color": { 32779 "supports-color": {
32287 "version": "7.2.0", 32780 "version": "7.2.0",
32288 "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 32781 "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
......
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
14 "highcharts": "^9.2.0", 14 "highcharts": "^9.2.0",
15 "highcharts-react-official": "^3.0.0", 15 "highcharts-react-official": "^3.0.0",
16 "moment": "^2.29.1", 16 "moment": "^2.29.1",
17 + "qrcode": "^1.4.4",
17 "react": "^17.0.2", 18 "react": "^17.0.2",
18 "react-dom": "^17.0.2", 19 "react-dom": "^17.0.2",
19 "react-router-dom": "^5.2.0", 20 "react-router-dom": "^5.2.0",
...@@ -52,6 +53,7 @@ ...@@ -52,6 +53,7 @@
52 ] 53 ]
53 }, 54 },
54 "devDependencies": { 55 "devDependencies": {
56 + "@types/qrcode": "^1.4.1",
55 "@types/react-router-dom": "^5.1.8", 57 "@types/react-router-dom": "^5.1.8",
56 "@types/styled-components": "^5.1.12", 58 "@types/styled-components": "^5.1.12",
57 "@types/validator": "^13.6.3", 59 "@types/validator": "^13.6.3",
......
...@@ -9,6 +9,12 @@ export const token = atom({ ...@@ -9,6 +9,12 @@ export const token = atom({
9 effects_UNSTABLE : [persistAtom], 9 effects_UNSTABLE : [persistAtom],
10 }); 10 });
11 11
12 +export const userId = atom({
13 + key : 'userId',
14 + default : null,
15 + effects_UNSTABLE : [persistAtom],
16 +});
17 +
12 export const userTypeCd = atom({ 18 export const userTypeCd = atom({
13 key : 'userTypeCd', 19 key : 'userTypeCd',
14 default : 'NORMAL', 20 default : 'NORMAL',
......
...@@ -23,6 +23,7 @@ const LoginContainer = (props : LoginProps) => { ...@@ -23,6 +23,7 @@ const LoginContainer = (props : LoginProps) => {
23 }); 23 });
24 24
25 const [token, setToken] = useRecoilState(recoilUtil.token); 25 const [token, setToken] = useRecoilState(recoilUtil.token);
26 + const [userId, setUserId] = useRecoilState(recoilUtil.userId);
26 const [userTypeCd, setUserTypeCd] = useRecoilState(recoilUtil.userTypeCd); 27 const [userTypeCd, setUserTypeCd] = useRecoilState(recoilUtil.userTypeCd);
27 28
28 29
...@@ -58,12 +59,13 @@ const LoginContainer = (props : LoginProps) => { ...@@ -58,12 +59,13 @@ const LoginContainer = (props : LoginProps) => {
58 const result : any = await authApi.login(loginForm); 59 const result : any = await authApi.login(loginForm);
59 if(result.statusText === 'OK' && result.data.userTypeCd !== 'NORMAL') { 60 if(result.statusText === 'OK' && result.data.userTypeCd !== 'NORMAL') {
60 setToken(result.data.token); 61 setToken(result.data.token);
62 + setUserId(loginForm.userId);
61 setUserTypeCd(result.data.userTypeCd); 63 setUserTypeCd(result.data.userTypeCd);
62 Alert.onSuccess('로그인 성공, 메인 화면으로 이동합니다.', () => props.history.push('/')); 64 Alert.onSuccess('로그인 성공, 메인 화면으로 이동합니다.', () => props.history.push('/'));
63 } else if(result.data.userTypeCd === 'NORMAL') { 65 } else if(result.data.userTypeCd === 'NORMAL') {
64 Alert.onError('권한이 없는 유저입니다.', () => props.history.push('/')); 66 Alert.onError('권한이 없는 유저입니다.', () => props.history.push('/'));
65 } 67 }
66 - } catch(e) { 68 + } catch(e : any) {
67 Alert.onError(e.response.data.error, () => null); 69 Alert.onError(e.response.data.error, () => null);
68 } 70 }
69 71
......
...@@ -10,6 +10,8 @@ import * as Alert from '../../../util/alertMessage'; ...@@ -10,6 +10,8 @@ import * as Alert from '../../../util/alertMessage';
10 10
11 import { doctorApi, medicineApi } from '../../../api'; 11 import { doctorApi, medicineApi } from '../../../api';
12 12
13 +import QRCode from 'qrcode';
14 +
13 15
14 //toDo : Generate QR Code By Medicine Id 16 //toDo : Generate QR Code By Medicine Id
15 17
...@@ -18,6 +20,7 @@ type DoctorMenuProps = RouteComponentProps ...@@ -18,6 +20,7 @@ type DoctorMenuProps = RouteComponentProps
18 const DoctorMenuContainer = (props : DoctorMenuProps) => { 20 const DoctorMenuContainer = (props : DoctorMenuProps) => {
19 21
20 const token = useRecoilValue(recoilUtil.token); 22 const token = useRecoilValue(recoilUtil.token);
23 + const userId = useRecoilValue(recoilUtil.userId);
21 const [loading, setLoading] = useRecoilState(recoilUtil.loading); 24 const [loading, setLoading] = useRecoilState(recoilUtil.loading);
22 25
23 const [doctorInfo, setDoctorInfo] = useState<any>({ 26 const [doctorInfo, setDoctorInfo] = useState<any>({
...@@ -52,9 +55,13 @@ const DoctorMenuContainer = (props : DoctorMenuProps) => { ...@@ -52,9 +55,13 @@ const DoctorMenuContainer = (props : DoctorMenuProps) => {
52 const [newPatientSearchResult, setNewPatientSearchResult] = useState<any | null>(null); 55 const [newPatientSearchResult, setNewPatientSearchResult] = useState<any | null>(null);
53 56
54 const [prescribeModal, setPrescribeModal] = useState<boolean>(false); 57 const [prescribeModal, setPrescribeModal] = useState<boolean>(false);
58 + const [prescribeModalStep, setPrescribeModalStep] = useState<number>(1);
55 const [searchMedicineKeyword, setSearchMedicineKeyword] = useState<string>(''); 59 const [searchMedicineKeyword, setSearchMedicineKeyword] = useState<string>('');
56 const [medicineList, setMedicineList] = useState<any>([]); 60 const [medicineList, setMedicineList] = useState<any>([]);
57 const [prescribeMedicine, setPrescribeMedicine] = useState<any>(null); 61 const [prescribeMedicine, setPrescribeMedicine] = useState<any>(null);
62 + const [dosage, setDosage] = useState<string>('1');
63 +
64 + const [qrcodeUrl, setQrcodeUrl] = useState<string | null>(null);
58 65
59 66
60 const fetchData = async() => { 67 const fetchData = async() => {
...@@ -213,9 +220,11 @@ const DoctorMenuContainer = (props : DoctorMenuProps) => { ...@@ -213,9 +220,11 @@ const DoctorMenuContainer = (props : DoctorMenuProps) => {
213 setEditModal(false); 220 setEditModal(false);
214 setEditPatientInfo(''); 221 setEditPatientInfo('');
215 setPrescribeModal(false); 222 setPrescribeModal(false);
223 + setPrescribeModalStep(1);
216 setSearchMedicineKeyword(''); 224 setSearchMedicineKeyword('');
217 setMedicineList([]); 225 setMedicineList([]);
218 setPrescribeMedicine(null); 226 setPrescribeMedicine(null);
227 + setDosage('1');
219 }; 228 };
220 229
221 const onGoBottleDetail = (bottleId : number) => { 230 const onGoBottleDetail = (bottleId : number) => {
...@@ -233,7 +242,6 @@ const DoctorMenuContainer = (props : DoctorMenuProps) => { ...@@ -233,7 +242,6 @@ const DoctorMenuContainer = (props : DoctorMenuProps) => {
233 setLoading(true); 242 setLoading(true);
234 const res = await medicineApi.searchMedicine(token, searchMedicineKeyword); 243 const res = await medicineApi.searchMedicine(token, searchMedicineKeyword);
235 if(res.statusText === 'OK') { 244 if(res.statusText === 'OK') {
236 - console.log(res.data.medicineList)
237 setMedicineList(res.data.medicineList); 245 setMedicineList(res.data.medicineList);
238 } 246 }
239 setLoading(false); 247 setLoading(false);
...@@ -242,9 +250,32 @@ const DoctorMenuContainer = (props : DoctorMenuProps) => { ...@@ -242,9 +250,32 @@ const DoctorMenuContainer = (props : DoctorMenuProps) => {
242 } 250 }
243 }; 251 };
244 252
253 + const onSetDosage = (e : React.ChangeEvent<HTMLInputElement>) => {
254 + setDosage(e.target.value);
255 + };
256 +
257 + const onSetNextStepPrescribe = () => {
258 + if(prescribeMedicine) setPrescribeModalStep(prescribeModalStep + 1);
259 + else Alert.onWarning('먼저 처방할 약을 선택해야 합니다.', () => null);
260 + };
261 +
262 + const onSetPrevStepPrescribe = () => {
263 + if(prescribeModalStep > 1) setPrescribeModalStep(prescribeModalStep - 1);
264 + };
265 +
245 const onPrescribeSubmit = async() => { 266 const onPrescribeSubmit = async() => {
246 - //toDo : 처방해서, QR코드 생성 267 + Alert.onCheck(`${prescribeMedicine.name}(일 복용량:${dosage})\n을 처방하시겠습니까?`, async () => {
247 - Alert.onWarning('작업 중입니다.', () => null); 268 + setQrcodeUrl(await QRCode.toDataURL(`${prescribeMedicine.name}/${prescribeMedicine.medicineId}/${dosage}/${userId}`, {
269 + type : "image/png",
270 + color : {dark : '#337DFF', light : '#FFF'},
271 + }));
272 + Alert.onSuccess('처방 정보가 생성 되었습니다.', () => onSetNextStepPrescribe());
273 + }, () => null);
274 + };
275 +
276 + const onPrintQrcode = async() => {
277 + //toDo : QR코드 출력
278 + Alert.onWarning('준비 중입니다.', () => null);
248 }; 279 };
249 280
250 const onPrescribeCancel = () => { 281 const onPrescribeCancel = () => {
...@@ -298,14 +329,21 @@ const DoctorMenuContainer = (props : DoctorMenuProps) => { ...@@ -298,14 +329,21 @@ const DoctorMenuContainer = (props : DoctorMenuProps) => {
298 onCloseModal = {onCloseModal} 329 onCloseModal = {onCloseModal}
299 330
300 prescribeModal = {prescribeModal} 331 prescribeModal = {prescribeModal}
332 + prescribeModalStep = {prescribeModalStep}
333 + onSetNextStepPrescribe = {onSetNextStepPrescribe}
334 + onSetPrevStepPrescribe = {onSetPrevStepPrescribe}
301 setPrescribeModal = {setPrescribeModal} 335 setPrescribeModal = {setPrescribeModal}
302 searchMedicineKeyword = {searchMedicineKeyword} 336 searchMedicineKeyword = {searchMedicineKeyword}
303 onSetSearchMedicineKeyword = {onSetSearchMedicineKeyword} 337 onSetSearchMedicineKeyword = {onSetSearchMedicineKeyword}
304 medicineList = {medicineList} 338 medicineList = {medicineList}
305 searchMedicine = {searchMedicine} 339 searchMedicine = {searchMedicine}
306 prescribeMedicine = {prescribeMedicine} 340 prescribeMedicine = {prescribeMedicine}
341 + dosage = {dosage}
342 + onSetDosage = {onSetDosage}
343 + qrcodeUrl = {qrcodeUrl}
307 setPrescribeMedicine = {setPrescribeMedicine} 344 setPrescribeMedicine = {setPrescribeMedicine}
308 onPrescribeSubmit = {onPrescribeSubmit} 345 onPrescribeSubmit = {onPrescribeSubmit}
346 + onPrintQrcode = {onPrintQrcode}
309 onPrescribeCancel = {onPrescribeCancel} 347 onPrescribeCancel = {onPrescribeCancel}
310 348
311 newPatientSearchResult = {newPatientSearchResult} 349 newPatientSearchResult = {newPatientSearchResult}
......
...@@ -48,6 +48,10 @@ interface DoctorMenuProps { ...@@ -48,6 +48,10 @@ interface DoctorMenuProps {
48 48
49 prescribeModal : boolean; 49 prescribeModal : boolean;
50 setPrescribeModal : any; 50 setPrescribeModal : any;
51 + prescribeModalStep : number;
52 + onSetNextStepPrescribe : () => void;
53 + onSetPrevStepPrescribe : () => void;
54 +
51 searchMedicineKeyword : string; 55 searchMedicineKeyword : string;
52 onSetSearchMedicineKeyword : React.ChangeEventHandler<HTMLInputElement>; 56 onSetSearchMedicineKeyword : React.ChangeEventHandler<HTMLInputElement>;
53 57
...@@ -57,7 +61,13 @@ interface DoctorMenuProps { ...@@ -57,7 +61,13 @@ interface DoctorMenuProps {
57 prescribeMedicine : any; 61 prescribeMedicine : any;
58 setPrescribeMedicine : (arg0 : any) => void; 62 setPrescribeMedicine : (arg0 : any) => void;
59 63
64 + dosage : string;
65 + onSetDosage : React.ChangeEventHandler<HTMLInputElement>;
66 +
67 + qrcodeUrl : string | null;
68 +
60 onPrescribeSubmit : () => void; 69 onPrescribeSubmit : () => void;
70 + onPrintQrcode : () => void;
61 onPrescribeCancel : () => void; 71 onPrescribeCancel : () => void;
62 } 72 }
63 73
...@@ -189,53 +199,105 @@ const DoctorMenuPresenter = (props : DoctorMenuProps) => { ...@@ -189,53 +199,105 @@ const DoctorMenuPresenter = (props : DoctorMenuProps) => {
189 <styled.ModalContentWrapper> 199 <styled.ModalContentWrapper>
190 <styled.ModalContent> 200 <styled.ModalContent>
191 <styled.MedicineSearchTitle> 201 <styled.MedicineSearchTitle>
192 - 약 검색 202 + {
203 + props.prescribeModalStep === 1 ?
204 + '약 검색' :
205 + props.prescribeModalStep === 2 ?
206 + '복용량 입력' :
207 + '처방 정보 QR코드'
208 + }
193 </styled.MedicineSearchTitle> 209 </styled.MedicineSearchTitle>
194 - <styled.MedicineSearchInputWrapper>
195 - <styled.MedicineSearchInput
196 - placeholder = '증상, 또는 약 이름을 검색하세요.'
197 - onChange = {props.onSetSearchMedicineKeyword}
198 - value = {props.searchMedicineKeyword}
199 - />
200 - <styled.MedicineSearchButton
201 - onClick = {props.searchMedicine}
202 - >
203 - <styled.MedicineSearchButtonImg src = {lensImg}/>
204 - </styled.MedicineSearchButton>
205 - </styled.MedicineSearchInputWrapper>
206 - <styled.MedicineSearchResultWrapper>
207 { 210 {
208 - props.medicineList.length ? 211 + props.prescribeModalStep === 1 ?
209 - props.medicineList.map((medicine : any) => { 212 + <>
210 - return ( 213 + <styled.MedicineSearchInputWrapper>
211 - <styled.MedicineSearchResultEach 214 + <styled.MedicineSearchInput
212 - key = {medicine.medicineId} 215 + placeholder = '증상, 또는 약 이름을 검색하세요.'
213 - onClick = {() => props.setPrescribeMedicine(medicine)} 216 + onChange = {props.onSetSearchMedicineKeyword}
214 - > 217 + value = {props.searchMedicineKeyword}
215 - <styled.MedicineSearchResultEachInfo> 218 + />
216 - {medicine.name} 219 + <styled.MedicineSearchButton
217 - </styled.MedicineSearchResultEachInfo> 220 + onClick = {props.searchMedicine}
218 - <styled.MedicineSearchButtonImg 221 + >
219 - src = { 222 + <styled.MedicineSearchButtonImg src = {lensImg}/>
220 - props.prescribeMedicine && props.prescribeMedicine.medicineId === medicine.medicineId ? 223 + </styled.MedicineSearchButton>
221 - check : uncheck 224 + </styled.MedicineSearchInputWrapper>
222 - } 225 + <styled.MedicineSearchResultWrapper>
223 - /> 226 + {
224 - </styled.MedicineSearchResultEach> 227 + props.medicineList.length ?
225 - ) 228 + props.medicineList.map((medicine : any) => {
226 - }) : 229 + return (
227 - <styled.NothingWrapper style = {{fontSize : 13,}}> 230 + <styled.MedicineSearchResultEach
228 - 🤔검색 결과가 없습니다. 231 + key = {medicine.medicineId}
229 - </styled.NothingWrapper> 232 + onClick = {() => props.setPrescribeMedicine(
233 + props.prescribeMedicine && props.prescribeMedicine.medicineId === medicine.medicineId ?
234 + null : medicine
235 + )}
236 + >
237 + <styled.MedicineSearchResultEachInfo>
238 + {medicine.name}
239 + </styled.MedicineSearchResultEachInfo>
240 + <styled.MedicineSearchButtonImg
241 + src = {
242 + props.prescribeMedicine && props.prescribeMedicine.medicineId === medicine.medicineId ?
243 + check : uncheck
244 + }
245 + />
246 + </styled.MedicineSearchResultEach>
247 + )
248 + }) :
249 + <styled.NothingWrapper style = {{fontSize : 13,}}>
250 + 🤔검색 결과가 없습니다.
251 + </styled.NothingWrapper>
252 + }
253 + </styled.MedicineSearchResultWrapper>
254 + </>
255 + :
256 + props.prescribeModalStep === 2 ?
257 + <styled.MedicineDosageSetWrapper>
258 + <styled.MedicineDosageInfo>
259 + *하루 복용량을 입력하세요.
260 + </styled.MedicineDosageInfo>
261 + <styled.MedicineDosageInput
262 + value = {props.dosage}
263 + onChange = {props.onSetDosage}
264 + />
265 + </styled.MedicineDosageSetWrapper>
266 + :
267 + <styled.MedicineQRCodeWrapper>
268 + <styled.MedicineQRCodeInfo>
269 + *어플리케이션에서 QR코드를 스캔하면 약병에 약이 등록됩니다.
270 + </styled.MedicineQRCodeInfo>
271 + {
272 + props.qrcodeUrl ?
273 + <styled.MedicineQRCode src = {props.qrcodeUrl}/> : null
274 + }
275 + </styled.MedicineQRCodeWrapper>
230 } 276 }
231 - </styled.MedicineSearchResultWrapper>
232 <styled.MedicinePrescribeButtonWrapper> 277 <styled.MedicinePrescribeButtonWrapper>
233 - <styled.MedicinePrescribeButton 278 + {
234 - isClose = {false} 279 + props.prescribeModalStep === 1 ?
235 - onClick = {props.onPrescribeSubmit} 280 + <styled.MedicinePrescribeButton
236 - > 281 + isClose = {false}
237 - 처방 282 + onClick = {props.onSetNextStepPrescribe}
238 - </styled.MedicinePrescribeButton> 283 + >
284 + 다음 단계
285 + </styled.MedicinePrescribeButton> :
286 + props.prescribeModalStep === 2 ?
287 + <styled.MedicinePrescribeButton
288 + isClose = {false}
289 + onClick = {props.onPrescribeSubmit}
290 + >
291 + 처방
292 + </styled.MedicinePrescribeButton>
293 + :
294 + <styled.MedicinePrescribeButton
295 + isClose = {false}
296 + onClick = {props.onPrintQrcode}
297 + >
298 + 출력
299 + </styled.MedicinePrescribeButton>
300 + }
239 <styled.MedicinePrescribeButton 301 <styled.MedicinePrescribeButton
240 isClose = {true} 302 isClose = {true}
241 onClick = {props.onPrescribeCancel} 303 onClick = {props.onPrescribeCancel}
......
...@@ -436,6 +436,7 @@ export const MedicineSearchButtonImg = styled.img ` ...@@ -436,6 +436,7 @@ export const MedicineSearchButtonImg = styled.img `
436 height : 15px; 436 height : 15px;
437 width : 15px; 437 width : 15px;
438 438
439 + transition : .25s all;
439 `; 440 `;
440 441
441 export const MedicineSearchResultWrapper = styled.div ` 442 export const MedicineSearchResultWrapper = styled.div `
...@@ -499,6 +500,92 @@ export const MedicineSelectButtonImg = styled.img ` ...@@ -499,6 +500,92 @@ export const MedicineSelectButtonImg = styled.img `
499 width : 15px; 500 width : 15px;
500 `; 501 `;
501 502
503 +export const MedicineDosageSetWrapper = styled.div `
504 + width : 80%;
505 +
506 + display : flex;
507 + flex-direction : column;
508 +
509 + justify-content : center;
510 + align-items : center;
511 +
512 + border : none;
513 +
514 + margin : 20px 0;
515 +
516 + height : 200px;
517 +`;
518 +
519 +export const MedicineDosageInfo = styled.div `
520 + font-size : 15px;
521 + font-weight : 500;
522 +
523 + color : #a0a0a0;
524 +
525 + width : 100%;
526 + margin : 0 0 20px 0;
527 +
528 + border : none;
529 + background-color : transparent;
530 +
531 + text-align : center;
532 +`;
533 +
534 +export const MedicineDosageInput = styled.input.attrs({
535 + type : 'number',
536 + min : '1',
537 + max : '3',
538 +}) `
539 + width : 40%;
540 +
541 + padding : 10px 20px;
542 + color : #337DFF;
543 + font-size : 20px;
544 +
545 + font-weight : 700;
546 +
547 + border : none;
548 + border-bottom : 1px solid #337DFF;
549 +
550 + display : flex;
551 + flex-direction : row;
552 +
553 + text-align : center;
554 +
555 + transition : .25s all;
556 +`;
557 +
558 +export const MedicineQRCodeWrapper = styled.div `
559 + width : 80%;
560 + height : 200px;
561 +
562 + display : flex;
563 + flex-direction : column;
564 +
565 + justify-content : center;
566 + align-items : center;
567 +
568 + margin : 20px 0;
569 +
570 + border : none;
571 +`;
572 +
573 +export const MedicineQRCodeInfo = styled.div `
574 + font-size : 15px;
575 + font-weight : 500;
576 +
577 + color : #a0a0a0;
578 +
579 + text-align : center;
580 +`;
581 +
582 +export const MedicineQRCode = styled.img `
583 + margin : 10px 0 0 0;
584 +
585 + height : 170px;
586 + width : 170px;
587 +`;
588 +
502 export const MedicinePrescribeButtonWrapper = styled.div ` 589 export const MedicinePrescribeButtonWrapper = styled.div `
503 margin : 20px 0 0 0; 590 margin : 20px 0 0 0;
504 591
......
This diff could not be displayed because it is too large.