diff --git a/package-lock.json b/package-lock.json
index 4e35f59..3be6627 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -13,10 +13,13 @@
"@emotion/styled": "^11.10.5",
"@types/react": "^17.0.52",
"@types/react-dom": "^17.0.18",
+ "dayjs": "^1.11.7",
"express": "^4.18.2",
+ "qrcode": "^1.5.1",
"react": "^17.0.2",
"react-dom": "^17.0.2",
"react-helmet": "^6.1.0",
+ "react-router-dom": "^6.10.0",
"socket.io-client": "^4.5.4",
"typescript": "^4.9.3"
},
@@ -2160,6 +2163,14 @@
"node": ">= 8"
}
},
+ "node_modules/@remix-run/router": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.5.0.tgz",
+ "integrity": "sha512-bkUDCp8o1MvFO+qxkODcbhSqRa6P2GXgrGZVpt0dCXNW2HCSCqYI0ZoAqEOSAjRWmmlKcYgFvN4B4S+zo/f8kg==",
+ "engines": {
+ "node": ">=14"
+ }
+ },
"node_modules/@socket.io/component-emitter": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz",
@@ -2602,7 +2613,6 @@
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
- "dev": true,
"engines": {
"node": ">=8"
}
@@ -2611,7 +2621,6 @@
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
"dependencies": {
"color-convert": "^2.0.1"
},
@@ -2989,6 +2998,14 @@
"node": ">=6"
}
},
+ "node_modules/camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/caniuse-lite": {
"version": "1.0.30001434",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001434.tgz",
@@ -3143,6 +3160,16 @@
"webpack": "*"
}
},
+ "node_modules/cliui": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
+ "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^6.2.0"
+ }
+ },
"node_modules/clone-deep": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz",
@@ -3174,7 +3201,6 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
"dependencies": {
"color-name": "~1.1.4"
},
@@ -3185,8 +3211,7 @@
"node_modules/color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
},
"node_modules/colorette": {
"version": "2.0.19",
@@ -3438,6 +3463,11 @@
"resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz",
"integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw=="
},
+ "node_modules/dayjs": {
+ "version": "1.11.7",
+ "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.7.tgz",
+ "integrity": "sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ=="
+ },
"node_modules/debug": {
"version": "4.3.4",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
@@ -3454,6 +3484,14 @@
}
}
},
+ "node_modules/decamelize": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+ "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/decode-uri-component": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
@@ -3580,6 +3618,11 @@
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
"dev": true
},
+ "node_modules/dijkstrajs": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.3.tgz",
+ "integrity": "sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA=="
+ },
"node_modules/dir-glob": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
@@ -3614,6 +3657,11 @@
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz",
"integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA=="
},
+ "node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
+ },
"node_modules/emojis-list": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
@@ -3623,6 +3671,11 @@
"node": ">= 4"
}
},
+ "node_modules/encode-utf8": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/encode-utf8/-/encode-utf8-1.0.3.tgz",
+ "integrity": "sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw=="
+ },
"node_modules/encodeurl": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
@@ -4291,7 +4344,6 @@
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
"integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
- "dev": true,
"dependencies": {
"locate-path": "^5.0.0",
"path-exists": "^4.0.0"
@@ -4304,7 +4356,6 @@
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
"integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
- "dev": true,
"dependencies": {
"p-locate": "^4.1.0"
},
@@ -4316,7 +4367,6 @@
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
"integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
- "dev": true,
"dependencies": {
"p-try": "^2.0.0"
},
@@ -4331,7 +4381,6 @@
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
"integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
- "dev": true,
"dependencies": {
"p-limit": "^2.2.0"
},
@@ -4656,6 +4705,14 @@
"node": ">=6.9.0"
}
},
+ "node_modules/get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
+ }
+ },
"node_modules/get-intrinsic": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz",
@@ -5224,6 +5281,14 @@
"node": ">=0.10.0"
}
},
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/is-glob": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
@@ -6012,7 +6077,6 @@
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
"integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
- "dev": true,
"engines": {
"node": ">=6"
}
@@ -6066,7 +6130,6 @@
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
"integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
- "dev": true,
"engines": {
"node": ">=8"
}
@@ -6245,6 +6308,14 @@
"node": ">=4"
}
},
+ "node_modules/pngjs": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-5.0.0.tgz",
+ "integrity": "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==",
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
"node_modules/posix-character-classes": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
@@ -6409,6 +6480,23 @@
"node": ">=6"
}
},
+ "node_modules/qrcode": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.1.tgz",
+ "integrity": "sha512-nS8NJ1Z3md8uTjKtP+SGGhfqmTCs5flU/xR623oI0JX+Wepz9R8UrRVCTBTJm3qGw3rH6jJ6MUHjkDx15cxSSg==",
+ "dependencies": {
+ "dijkstrajs": "^1.0.1",
+ "encode-utf8": "^1.0.3",
+ "pngjs": "^5.0.0",
+ "yargs": "^15.3.1"
+ },
+ "bin": {
+ "qrcode": "bin/qrcode"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
"node_modules/qs": {
"version": "6.11.0",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
@@ -6809,6 +6897,36 @@
"integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==",
"dev": true
},
+ "node_modules/react-router": {
+ "version": "6.10.0",
+ "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.10.0.tgz",
+ "integrity": "sha512-Nrg0BWpQqrC3ZFFkyewrflCud9dio9ME3ojHCF/WLsprJVzkq3q3UeEhMCAW1dobjeGbWgjNn/PVF6m46ANxXQ==",
+ "dependencies": {
+ "@remix-run/router": "1.5.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "react": ">=16.8"
+ }
+ },
+ "node_modules/react-router-dom": {
+ "version": "6.10.0",
+ "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.10.0.tgz",
+ "integrity": "sha512-E5dfxRPuXKJqzwSe/qGcqdwa18QiWC6f3H3cWXM24qj4N0/beCIf/CWTipop2xm7mR0RCS99NnaqPNjHtrAzCg==",
+ "dependencies": {
+ "@remix-run/router": "1.5.0",
+ "react-router": "6.10.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "react": ">=16.8",
+ "react-dom": ">=16.8"
+ }
+ },
"node_modules/react-side-effect": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/react-side-effect/-/react-side-effect-2.1.2.tgz",
@@ -6972,6 +7090,19 @@
"node": ">=0.10"
}
},
+ "node_modules/require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/require-main-filename": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
+ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg=="
+ },
"node_modules/resolve": {
"version": "1.22.1",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
@@ -7202,6 +7333,11 @@
"node": ">= 0.8.0"
}
},
+ "node_modules/set-blocking": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+ "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw=="
+ },
"node_modules/set-value": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz",
@@ -7727,11 +7863,34 @@
"node": ">= 0.8"
}
},
+ "node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/string-width/node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/strip-ansi": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
"integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
- "dev": true,
"dependencies": {
"ansi-regex": "^5.0.0"
},
@@ -8527,6 +8686,11 @@
"node": ">= 8"
}
},
+ "node_modules/which-module": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
+ "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q=="
+ },
"node_modules/wildcard": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz",
@@ -8548,6 +8712,19 @@
"microevent.ts": "~0.1.1"
}
},
+ "node_modules/wrap-ansi": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+ "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
@@ -8582,6 +8759,11 @@
"node": ">=0.4.0"
}
},
+ "node_modules/y18n": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz",
+ "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ=="
+ },
"node_modules/yallist": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
@@ -8596,6 +8778,39 @@
"node": ">= 6"
}
},
+ "node_modules/yargs": {
+ "version": "15.4.1",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz",
+ "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
+ "dependencies": {
+ "cliui": "^6.0.0",
+ "decamelize": "^1.2.0",
+ "find-up": "^4.1.0",
+ "get-caller-file": "^2.0.1",
+ "require-directory": "^2.1.1",
+ "require-main-filename": "^2.0.0",
+ "set-blocking": "^2.0.0",
+ "string-width": "^4.2.0",
+ "which-module": "^2.0.0",
+ "y18n": "^4.0.0",
+ "yargs-parser": "^18.1.2"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/yargs-parser": {
+ "version": "18.1.3",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
+ "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
+ "dependencies": {
+ "camelcase": "^5.0.0",
+ "decamelize": "^1.2.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/yocto-queue": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
@@ -10124,6 +10339,11 @@
"fastq": "^1.6.0"
}
},
+ "@remix-run/router": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.5.0.tgz",
+ "integrity": "sha512-bkUDCp8o1MvFO+qxkODcbhSqRa6P2GXgrGZVpt0dCXNW2HCSCqYI0ZoAqEOSAjRWmmlKcYgFvN4B4S+zo/f8kg=="
+ },
"@socket.io/component-emitter": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz",
@@ -10525,14 +10745,12 @@
"ansi-regex": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
- "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
- "dev": true
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="
},
"ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
"requires": {
"color-convert": "^2.0.1"
}
@@ -10811,6 +11029,11 @@
"resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
"integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="
},
+ "camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="
+ },
"caniuse-lite": {
"version": "1.0.30001434",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001434.tgz",
@@ -10922,6 +11145,16 @@
"del": "^4.1.1"
}
},
+ "cliui": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
+ "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
+ "requires": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^6.2.0"
+ }
+ },
"clone-deep": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz",
@@ -10947,7 +11180,6 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
"requires": {
"color-name": "~1.1.4"
}
@@ -10955,8 +11187,7 @@
"color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
},
"colorette": {
"version": "2.0.19",
@@ -11142,6 +11373,11 @@
"resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz",
"integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw=="
},
+ "dayjs": {
+ "version": "1.11.7",
+ "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.7.tgz",
+ "integrity": "sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ=="
+ },
"debug": {
"version": "4.3.4",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
@@ -11150,6 +11386,11 @@
"ms": "2.1.2"
}
},
+ "decamelize": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+ "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA=="
+ },
"decode-uri-component": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
@@ -11250,6 +11491,11 @@
}
}
},
+ "dijkstrajs": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.3.tgz",
+ "integrity": "sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA=="
+ },
"dir-glob": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
@@ -11281,12 +11527,22 @@
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz",
"integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA=="
},
+ "emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
+ },
"emojis-list": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
"integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
"dev": true
},
+ "encode-utf8": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/encode-utf8/-/encode-utf8-1.0.3.tgz",
+ "integrity": "sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw=="
+ },
"encodeurl": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
@@ -11834,7 +12090,6 @@
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
"integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
- "dev": true,
"requires": {
"locate-path": "^5.0.0",
"path-exists": "^4.0.0"
@@ -11844,7 +12099,6 @@
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
"integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
- "dev": true,
"requires": {
"p-locate": "^4.1.0"
}
@@ -11853,7 +12107,6 @@
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
"integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
- "dev": true,
"requires": {
"p-try": "^2.0.0"
}
@@ -11862,7 +12115,6 @@
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
"integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
- "dev": true,
"requires": {
"p-limit": "^2.2.0"
}
@@ -12116,6 +12368,11 @@
"resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
"integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="
},
+ "get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="
+ },
"get-intrinsic": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz",
@@ -12547,6 +12804,11 @@
"integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
"dev": true
},
+ "is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="
+ },
"is-glob": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
@@ -13121,8 +13383,7 @@
"p-try": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
- "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
- "dev": true
+ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="
},
"parent-module": {
"version": "1.0.1",
@@ -13157,8 +13418,7 @@
"path-exists": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
- "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
- "dev": true
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="
},
"path-is-absolute": {
"version": "1.0.1",
@@ -13288,6 +13548,11 @@
}
}
},
+ "pngjs": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-5.0.0.tgz",
+ "integrity": "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw=="
+ },
"posix-character-classes": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
@@ -13398,6 +13663,17 @@
"integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
"dev": true
},
+ "qrcode": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.1.tgz",
+ "integrity": "sha512-nS8NJ1Z3md8uTjKtP+SGGhfqmTCs5flU/xR623oI0JX+Wepz9R8UrRVCTBTJm3qGw3rH6jJ6MUHjkDx15cxSSg==",
+ "requires": {
+ "dijkstrajs": "^1.0.1",
+ "encode-utf8": "^1.0.3",
+ "pngjs": "^5.0.0",
+ "yargs": "^15.3.1"
+ }
+ },
"qs": {
"version": "6.11.0",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
@@ -13699,6 +13975,23 @@
"integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==",
"dev": true
},
+ "react-router": {
+ "version": "6.10.0",
+ "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.10.0.tgz",
+ "integrity": "sha512-Nrg0BWpQqrC3ZFFkyewrflCud9dio9ME3ojHCF/WLsprJVzkq3q3UeEhMCAW1dobjeGbWgjNn/PVF6m46ANxXQ==",
+ "requires": {
+ "@remix-run/router": "1.5.0"
+ }
+ },
+ "react-router-dom": {
+ "version": "6.10.0",
+ "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.10.0.tgz",
+ "integrity": "sha512-E5dfxRPuXKJqzwSe/qGcqdwa18QiWC6f3H3cWXM24qj4N0/beCIf/CWTipop2xm7mR0RCS99NnaqPNjHtrAzCg==",
+ "requires": {
+ "@remix-run/router": "1.5.0",
+ "react-router": "6.10.0"
+ }
+ },
"react-side-effect": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/react-side-effect/-/react-side-effect-2.1.2.tgz",
@@ -13831,6 +14124,16 @@
"integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==",
"dev": true
},
+ "require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="
+ },
+ "require-main-filename": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
+ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg=="
+ },
"resolve": {
"version": "1.22.1",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
@@ -13998,6 +14301,11 @@
"send": "0.18.0"
}
},
+ "set-blocking": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+ "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw=="
+ },
"set-value": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz",
@@ -14425,11 +14733,30 @@
"resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
"integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="
},
+ "string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "requires": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "dependencies": {
+ "strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "requires": {
+ "ansi-regex": "^5.0.1"
+ }
+ }
+ }
+ },
"strip-ansi": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
"integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
- "dev": true,
"requires": {
"ansi-regex": "^5.0.0"
}
@@ -14971,6 +15298,11 @@
"isexe": "^2.0.0"
}
},
+ "which-module": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
+ "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q=="
+ },
"wildcard": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz",
@@ -14992,6 +15324,16 @@
"microevent.ts": "~0.1.1"
}
},
+ "wrap-ansi": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+ "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+ "requires": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ }
+ },
"wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
@@ -15009,6 +15351,11 @@
"resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz",
"integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A=="
},
+ "y18n": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz",
+ "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ=="
+ },
"yallist": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
@@ -15020,6 +15367,33 @@
"resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
"integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg=="
},
+ "yargs": {
+ "version": "15.4.1",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz",
+ "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
+ "requires": {
+ "cliui": "^6.0.0",
+ "decamelize": "^1.2.0",
+ "find-up": "^4.1.0",
+ "get-caller-file": "^2.0.1",
+ "require-directory": "^2.1.1",
+ "require-main-filename": "^2.0.0",
+ "set-blocking": "^2.0.0",
+ "string-width": "^4.2.0",
+ "which-module": "^2.0.0",
+ "y18n": "^4.0.0",
+ "yargs-parser": "^18.1.2"
+ }
+ },
+ "yargs-parser": {
+ "version": "18.1.3",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
+ "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
+ "requires": {
+ "camelcase": "^5.0.0",
+ "decamelize": "^1.2.0"
+ }
+ },
"yocto-queue": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
diff --git a/package.json b/package.json
index 1d350c0..1e62d27 100644
--- a/package.json
+++ b/package.json
@@ -5,7 +5,7 @@
"main": "./src/index.tsx",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
- "start": "ijl-cli --server --port=8099 --with-open-browser",
+ "start": "ijl-cli --server --port=8099",
"build": "npm run clean && ijl-cli --build --dev",
"build:prod": "npm run clean && ijl-cli --build",
"clean": "rimraf dist"
@@ -25,10 +25,13 @@
"@emotion/styled": "^11.10.5",
"@types/react": "^17.0.52",
"@types/react-dom": "^17.0.18",
+ "dayjs": "^1.11.7",
"express": "^4.18.2",
+ "qrcode": "^1.5.1",
"react": "^17.0.2",
"react-dom": "^17.0.2",
"react-helmet": "^6.1.0",
+ "react-router-dom": "^6.10.0",
"socket.io-client": "^4.5.4",
"typescript": "^4.9.3"
}
diff --git a/src/app.tsx b/src/app.tsx
index 2c137eb..23ae77e 100644
--- a/src/app.tsx
+++ b/src/app.tsx
@@ -1,12 +1,17 @@
import React from 'react';
import { Helmet } from 'react-helmet';
import { Global, css } from '@emotion/react'
+import { BrowserRouter } from 'react-router-dom';
+import ruLocale from 'dayjs/locale/ru';
+import dayjs from 'dayjs';
-import { MainPage } from './pages/main';
+import { Dashboard } from './dashboard';
+
+dayjs.locale('ru', ruLocale);
const App = () => {
return(
- <>
+
@@ -58,8 +63,8 @@ const App = () => {
}
`}
/>
-
- >
+
+
)
}
diff --git a/src/assets/503702d8-c8e2-4dd9-b05b-3c12e282d1cb.png b/src/assets/503702d8-c8e2-4dd9-b05b-3c12e282d1cb.png
deleted file mode 100644
index c8e6d68..0000000
Binary files a/src/assets/503702d8-c8e2-4dd9-b05b-3c12e282d1cb.png and /dev/null differ
diff --git a/src/assets/back.svg b/src/assets/back.svg
deleted file mode 100644
index 6d6fc25..0000000
--- a/src/assets/back.svg
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
-
diff --git a/src/assets/fullscreen.svg b/src/assets/fullscreen.svg
deleted file mode 100644
index 98641b3..0000000
--- a/src/assets/fullscreen.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-
diff --git a/src/assets/logo-short.svg b/src/assets/logo-short.svg
deleted file mode 100644
index 563c229..0000000
--- a/src/assets/logo-short.svg
+++ /dev/null
@@ -1,57 +0,0 @@
-
\ No newline at end of file
diff --git a/src/assets/logo-white.svg b/src/assets/logo-white.svg
deleted file mode 100644
index 145bf6a..0000000
--- a/src/assets/logo-white.svg
+++ /dev/null
@@ -1,57 +0,0 @@
-
\ No newline at end of file
diff --git a/src/assets/logo.svg b/src/assets/logo.svg
deleted file mode 100644
index 86ed112..0000000
--- a/src/assets/logo.svg
+++ /dev/null
@@ -1,57 +0,0 @@
-
\ No newline at end of file
diff --git a/src/components/keyboard.style.ts b/src/components/keyboard.style.ts
deleted file mode 100644
index 0b37560..0000000
--- a/src/components/keyboard.style.ts
+++ /dev/null
@@ -1,66 +0,0 @@
-import styled from '@emotion/styled';
-import { keyframes } from '@emotion/react';
-
-const reveal = keyframes`
- from {
- bottom: -600px;
- }
- to {
- bottom: 0;
- }
-`;
-
-export const Wrapper = styled.div`
- position: absolute;
- bottom: 0;
- left: auto;
- right: auto;
- padding: 12px;
- background-color: #96e8c229;
- display: flex;
- flex-direction: column;
- align-items: center;
- justify-content: center;
- animation: ${reveal} .5s;
- animation-timing-function: cubic-bezier(0, 0.39, 0.29, 1.02);
-
- @media screen and (max-width: 600px) {
- padding: 6px;
- }
-`;
-
-export const KeyRow = styled.div`
- display: flex;
-`;
-
-export const BackspaceBtn = styled.img`
- width: 60%;
-`;
-
-export const Key = styled.button`
- margin: 4px;
- width: 8vw;
- max-width: 100px;
- height: 7vw;
- max-height: 100px;
- min-height: 40px;
- font-size: 24px;
- display: flex;
- align-items: center;
- justify-content: center;
- color: #829cdb;
- border-radius: 6px;
- background-color: #fff;
- border: none;
- box-shadow: 1px 2px 6px #5c7cc9;
-
- @media screen and (max-width: 600px) {
- margin: 2px;
- }
-
- &:active {
- background: #f5f5f5;
- box-shadow: inset 1px 2px 6px #5c7cc9,
- 0px 6px 16px #5c7cc9;
- }
-`;
diff --git a/src/components/keyboard.tsx b/src/components/keyboard.tsx
deleted file mode 100644
index b3792b5..0000000
--- a/src/components/keyboard.tsx
+++ /dev/null
@@ -1,36 +0,0 @@
-import React from 'react';
-import back from '../assets/back.svg';
-
-import {
- Wrapper,
- Key,
- KeyRow,
- BackspaceBtn,
-} from './keyboard.style';
-
-const rows = [
- ['q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p'],
- ['a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l'],
- ['z', 'x', 'c', 'v', 'b', 'n', 'm', ]
-]
-
-export const Keyboard = ({ onChange }) => {
- const handleClick = (key) => () => {
- if (typeof key === 'string') {
- onChange(v => v + key.toUpperCase());
- } else {
- onChange(v => v.slice(0, -1))
- }
- }
- return (
-
- {rows.map((row, index) => (
-
- {row.map(key => (
- {key}
- ))}
-
- ))}
-
- )
-}
\ No newline at end of file
diff --git a/src/dashboard.tsx b/src/dashboard.tsx
new file mode 100644
index 0000000..08d85d4
--- /dev/null
+++ b/src/dashboard.tsx
@@ -0,0 +1,29 @@
+import React, { useEffect } from 'react';
+import {
+ Routes,
+ Route,
+ useNavigate
+} from 'react-router-dom';
+
+import { MainPage } from './pages/main';
+import { Lesson } from './pages/Lesson';
+import { UserPage } from './pages/UserPage';
+
+const Redirect = ({ path }) => {
+ const navigate = useNavigate();
+
+ useEffect(() => {
+ navigate(path);
+ }, []);
+
+ return null;
+}
+
+export const Dashboard = () => (
+
+ } />
+ } />
+ } />
+ } />
+
+)
diff --git a/src/pages/Journal.tsx b/src/pages/Journal.tsx
new file mode 100644
index 0000000..f8d0a3d
--- /dev/null
+++ b/src/pages/Journal.tsx
@@ -0,0 +1,78 @@
+import React, { useCallback, useEffect, useRef, useState } from 'react';
+import dayjs from 'dayjs';
+import { Link } from 'react-router-dom'
+
+import {
+ ArrowImg,
+ IconButton,
+ InputElement,
+ InputLabel,
+ InputWrapper,
+ StartWrapper,
+ LessonItem,
+ Lessonname,
+} from './style';
+
+import arrow from '../assets/36-arrow-right.svg';
+import { connect, getSocket } from "../socket";
+
+export const Journal = () => {
+ const [lessons, setLessons] = useState(null);
+
+ useEffect(() => {
+ connect();
+ const socket = getSocket();
+ socket.on('lessons', data => {
+ setLessons(data)
+ })
+ }, []);
+
+ const [value, setValue] = useState('');
+ const handleChange = useCallback(event => {
+ setValue(event.target.value.toUpperCase())
+ }, [setValue]);
+ const inputRef = useRef(null);
+
+ const handleSubmit = useCallback((event) => {
+ event.preventDefault();
+
+ const socket = getSocket();
+ socket.emit('create-lesson', { lessonName: value });
+ setValue('')
+ }, [value])
+
+ return (
+
+
+
+ {lessons?.map((lesson) => (
+
+
+ {lesson.name}
+ {dayjs(lesson.ts).format('DD MMMM YYYYг.')}
+
+
+ ))}
+
+
+ )
+};
diff --git a/src/pages/Lesson.tsx b/src/pages/Lesson.tsx
new file mode 100644
index 0000000..e8d93e6
--- /dev/null
+++ b/src/pages/Lesson.tsx
@@ -0,0 +1,44 @@
+import React, { useEffect, useState, useRef } from 'react';
+import { useParams } from 'react-router-dom';
+import dayjs from 'dayjs';
+import QRCode from 'qrcode';
+
+import { connect, getSocket } from '../socket';
+import { MainWrapper, StartWrapper, QRCanvas, LessonItem, Lessonname } from './style';
+
+export const Lesson = () => {
+ const { lessonId } = useParams();
+ const canvRef = useRef(null);
+ const [lesson, setLesson] = useState(null);
+ useEffect(() => {
+ connect();
+ const socket = getSocket();
+ socket.on('lessons', data => {
+ setLesson(data.find(lesson => lesson.id === lessonId));
+ })
+
+ QRCode.toCanvas(canvRef.current, `${location.origin}/journal/u/${lessonId}` , function (error) {
+ if (error) console.error(error)
+ console.log('success!');
+ })
+ }, []);
+
+ return (
+
+
+ Lesson - {lesson?.name}
+ {dayjs(lesson?.ts).format('DD MMMM YYYYг.')}
+
+
+
+
+ {lesson?.padavans?.map((padavan, index) => (
+
+ {padavan.name}
+
+ ))}
+
+
+
+ )
+}
diff --git a/src/pages/UserPage.tsx b/src/pages/UserPage.tsx
new file mode 100644
index 0000000..ded37df
--- /dev/null
+++ b/src/pages/UserPage.tsx
@@ -0,0 +1,72 @@
+import React, { useCallback, useEffect, useState } from 'react';
+import { useParams } from 'react-router-dom';
+
+import { connect, getSocket } from '../socket';
+import { ArrowImg, IconButton, InputElement, InputLabel, InputWrapper, MainWrapper, StartWrapper } from './style';
+import arrow from '../assets/36-arrow-right.svg';
+
+export const UserPage = () => {
+ const [socketId, setSocketId] = useState(null);
+ const { lessonId } = useParams();
+ useEffect(() => {
+ connect();
+ const socket = getSocket();
+ socket.on('connect', () => {
+ const id = localStorage.getItem('socketId');
+ if (!id) {
+ localStorage.setItem('socketId', socket.id);
+ setSocketId(socket.id);
+ } else {
+ setSocketId(id);
+ }
+
+ const name = localStorage.getItem('name');
+ if (name) {
+ const socket = getSocket();
+ socket.emit('add', { socketId: id || socket.id, name, lessonid: lessonId });
+ }
+ })
+ socket.on('lessons', data => {
+ // setLessons(data)
+ })
+ }, []);
+
+ const [value, setValue] = useState(localStorage.getItem('name') || '');
+ const handleChange = useCallback(event => {
+ setValue(event.target.value.toUpperCase())
+ }, [setValue]);
+
+ const handleSubmit = useCallback((event) => {
+ event.preventDefault();
+
+ const socket = getSocket();
+ localStorage.setItem('name', value)
+ socket.emit('add', { socketId, name: value, lessonid: lessonId });
+ }, [value])
+
+ return (
+
+
+
+
+
+ )
+}
diff --git a/src/pages/main.tsx b/src/pages/main.tsx
index 9251b1e..97d9ea5 100644
--- a/src/pages/main.tsx
+++ b/src/pages/main.tsx
@@ -1,41 +1,16 @@
-import React, {useState, useCallback, useRef, useMemo} from 'react';
-import { getFeatures } from '@ijl/cli';
+import React, {useState, useCallback, useRef, useEffect} from 'react';
-import logo from '../assets/logo.svg';
import arrow from '../assets/36-arrow-right.svg';
-import fullScreen from '../assets/fullscreen.svg';
-import logoShort from '../assets/logo-short.svg';
-
-import { Keyboard } from '../components/keyboard';
import {
MainWrapper,
InputElement,
InputLabel,
InputWrapper,
- LogoImg,
ArrowImg,
IconButton,
- StartWrapper,
- StartI,
- StartInput,
- StartLabel,
- HalfLine,
- HideGroup,
- Circle,
- LineSvg,
- Svg,
- CircleDiv,
- FullScreenButton,
- InputHolder,
- Blow,
- BigLogo,
} from './style';
-import { socket } from "../socket";
-
-const keyboardFeature = getFeatures('hub-video-start')?.keyboard;
-const fullScreenFeature = getFeatures('hub-video-start')?.fullScreen;
-const blowAnimFeature = getFeatures('hub-video-start')?.blowAnim;
+import { Journal } from './Journal';
const Input = ({ onStart }) => {
const [value, setValue] = useState('');
@@ -45,9 +20,18 @@ const Input = ({ onStart }) => {
}, [setValue]);
const inputRef = useRef(null);
+ useEffect(() => {
+ const pass = localStorage.getItem('pass')
+
+ if (pass) {
+ onStart();
+ }
+ }, []);
+
const handleSubmit = useCallback((event) => {
event.preventDefault();
- if (value === 'SBER') {
+ localStorage.setItem('pass', 'true')
+ if (value === 'OYB0Y') {
onStart()
}
}, [value])
@@ -59,219 +43,33 @@ const Input = ({ onStart }) => {
- Ввод:
+ Введите пароль:
setInfocuse(true)}
ref={inputRef}
- onClick={(event) => {
- if (keyboardFeature) {
- event.preventDefault();
- event.stopPropagation();
- inputRef.current.blur();
- }
- }}
id="input"
+ type="password"
autoComplete="off"
/>
- {keyboardFeature && setInfocuse(true)} />}
- {keyboardFeature && inFocuse && (
-
- )}
>
)
}
-export const Line = ({ hide, reverse, speed, delay, radius, progress, width, color }) => (
-
-
-
-
-
-)
-
-Line.defaultProps = {
- reverse: false
-}
-
-const Start = () => {
- const [sended, setSend] = useState(false);
-
- const handleCheck = () => {
- if (!sended) {
- socket.emit('play')
- setSend(true)
- }
- }
-
- return (
-
- {sended && blowAnimFeature && (
- <>
-
-
-
-
-
-
- >
- )}
- {/* */}
-
-
-
-
-
-
-
-
-
- СТАРТ
-
-
-
- )
-}
-
export const MainPage = () => {
- const [showStart, setShowStart] = useState(false);
- const [isFull, setFull] = useState(false);
-
- const handleFullScreen = useCallback(() => {
- const elem = document.documentElement;
- if (elem.requestFullscreen) {
- elem.requestFullscreen();
- } else if (elem.webkitRequestFullscreen) { /* Safari */
- elem.webkitRequestFullscreen();
- } else if (elem.msRequestFullscreen) { /* IE11 */
- elem.msRequestFullscreen();
- }
- setFull(true);
- }, []);
+ const [shoList, setShoList] = useState(false);
return (
- {fullScreenFeature && !isFull && (
-
-
-
- )}
-
- {/* */}
- {!showStart && setShowStart(true)} />}
- {showStart && }
+ {!shoList && setShoList(true)} />}
+ {shoList && }
);
};
diff --git a/src/pages/style.ts b/src/pages/style.ts
index 631c8d5..a3ef198 100644
--- a/src/pages/style.ts
+++ b/src/pages/style.ts
@@ -33,12 +33,6 @@ export const InputElement = styled.input`
max-width: 90vw;
`;
-export const LogoImg = styled.img`
- position: absolute;
- top: 24px;
- left: 24px;
-`;
-
export const ArrowImg = styled.img`
width: 48px;
height: 48px;
@@ -65,177 +59,12 @@ const reveal = keyframes`
export const StartWrapper = styled.div`
animation: ${reveal} 1s ease forwards;
/* box-shadow: 0 -2px 5px rgba(255,255,255,0.05), 0 2px 5px rgba(255,255,255,0.1); */
- width: 350px;
- height: 350px;
+ width: 650px;
+ height: calc(100vh - 300px);
/* margin: 60px auto; */
position: relative;
`;
-export const StartLabel = styled.label`
- display: block;
- width: 100%;
- height: 100%;
- border-radius: 50%;
- background: #b25244;
- /* background: linear-gradient(#f7f2f6, #b2ac9e); */
- /* background: linear-gradient(#b52a2a, #e10ff1); */
- background: linear-gradient(rgb(255 251 251), rgb(140 219 35));
- position: relative;
- color: #a5a39d;
- font-size: 70px;
- text-align: center;
- line-height: 150px;
- transition: all 0.3s ease-out;
- text-shadow: 0 2px 1px rgba(0,0,0,0.25);
- z-index: 1;
- box-shadow:
- inset 0 2px 3px rgba(255,255,255,0.13),
- 0 5px 8px rgba(0,0,0,0.3),
- 0 10px 10px 4px rgba(0,0,0,0.3);
- -webkit-tap-highlight-color: transparent;
- -webkit-touch-callout: none;
- -webkit-user-select: none;
- -khtml-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none;
-
- &::after {
- content: "";
- position: absolute;
- left: -20px;
- right: -20px;
- top: -20px;
- bottom: -20px;
- z-index: -2;
- border-radius: inherit;
- box-shadow:
- inset 0 1px 0 rgba(255,255,255,0.1),
- 0 1px 2px rgba(0,0,0,0.3),
- 0 0 10px rgba(0,0,0,0.15);
- }
-
- &::before {
- content: "";
- position: absolute;
- left: -10px;
- right: -10px;
- top: -10px;
- bottom: -10px;
- z-index: -1;
- border-radius: inherit;
- box-shadow: inset 0 10px 10px rgba(0,0,0,0.13);
- -webkit-filter:blur(1px);
- filter: blur(1px);
- }
-`;
-
-export const StartInput = styled.input`
- display: block;
- width: 100%;
- height: 100%;
- opacity: 0;
- z-index: 100;
- position: absolute;
- cursor: pointer;
- -webkit-tap-highlight-color: transparent;
- -webkit-touch-callout: none;
- -webkit-user-select: none;
- -khtml-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none;
-
- &:checked ~ label {
- box-shadow:
- inset 0 2px 3px rgba(255,255,255,0.13),
- 0 5px 8px rgba(0,0,0,0.35),
- 0 3px 10px 4px rgba(0,0,0,0.2);
- color: #9abb82;
- }
-`;
-
-export const StartI = styled.i`
- content: "";
- display: flex;
- position: absolute;
- width: 70%;
- height: 70%;
- left: 50%;
- top: 50%;
- z-index: 1;
- color: white;
- margin: -35% 0 0 -35%;
- border-radius: 50%;
- background: linear-gradient(#22a037, #98e221);
- box-shadow:
- 0 -2px 5px rgba(255,255,255,0.05),
- 0 2px 5px rgba(255,255,255,0.1);
- -webkit-filter:blur(1px);
- filter: blur(1px);
- align-items: center;
- justify-content: center;
- font-style: normal;
-`;
-
-// const LineRotation = keyframes
-//`
-// 0% {
-// transform: translate(-50%, -100%) rotate(0);
-// }
-
-// 100% {
-// transform: translate(-50%, -100%) rotate(1turn);
-// }
-// `;
-
-
-// type LineProps = {
-// radius: number;
-// width: number;
-
-// }
-
-// export const HalfLine = styled.div(({
-// radius,
-// width,
-// }) =>css`
-// transform-origin: 50% 100%;
-// animation: ${LineRotation} 3s linear infinite;
-// width: ${radius * 2}px;
-// height: ${radius}px;
-// border-top-left-radius: ${radius}px;
-// border-top-right-radius: ${radius}px;
-// border: ${width}px solid gray;
-// border-bottom: 0;
-// position: absolute;
-// top: 50%;
-// left: 50%;
-// transform: translate(-50%, -100%);
-// `);
-
-const LineRotation = keyframes`
- 0% {
- transform: translate(-50%, -50%) rotate(0);
- }
-
- 100% {
- transform: translate(-50%, -50%) rotate(1turn);
- }
-`;
-
-const LineHideAnimation = keyframes`
- 0% {
- /* transform: scale(1); */
- opacity: 1;
- }
-
- 100% {
- /* transform: scale(0); */
- opacity: 0;
- }
-`;
-
export const Svg = styled.svg`
position: absolute;
top: 50%;
@@ -245,120 +74,20 @@ export const Svg = styled.svg`
/* stroke-dasharray: 600; */
`;
-export const CircleDiv = styled.div`
- width: 700px;
- height: 700px;
- position: absolute;
- top: 50%;
- left: 50%;
- transform-origin: 50% 50%;
- transform: translate(-50%, -50%) rotate(270deg);
- border-radius: 50%;
- background: radial-gradient(
- farthest-side at bottom center,
- rgba(35, 235, 4, 0.709),
- rgba(255, 255, 255, 0) 65%
- ),
- radial-gradient(
- farthest-corner at bottom left,
- rgba(244, 244, 8, 0.9),
- rgba(255, 255, 255, 0) 40%
- ),
- radial-gradient(
- farthest-side at bottom right,
- rgba(0, 195, 255, 0.648),
- rgba(255, 255, 255, 0) 65%
- );
+export const LessonItem = styled.li`
+ list-style: none;
+ background-color: #ffffff;
+ padding: 16px;
+ border-radius: 12px;
+ box-shadow: 2px 2px 6px #0000005c;
+ margin-bottom: 12px;
`;
-export const LineSvg = styled.svg<{ animationSpeed: number; delay: number; reverse: boolean }>`
- animation: ${LineRotation} ${({ animationSpeed }) => animationSpeed}s linear infinite${({ reverse }) => reverse ? ' reverse' : ''};
- animation-delay: -${({ delay }) => delay}s;
- position: absolute;
- top: 50%;
- left: 50%;
- transform-origin: 50% 50%;
- transform: translate(-50%, -50%);
- z-index: 2;
+export const Lessonname = styled.span`
+ display: inline-box;
+ margin-right: 12px;
`;
-export const HideGroup = styled.g<{ hide: boolean; delay: number; }>`
- animation: ${({ hide }) => hide ? css`${LineHideAnimation} 3s ease-in forwards`: ''};
- transform-origin: 50% 50%;
- animation-delay: ${({ delay }) => delay / 10}s;
-`;
-export const Circle = styled.circle<{ circumference: number; percent: number }>`
- transition: 0.35s stroke-dashoffset;
- transform: rotate(-90deg);
- transform-origin: 50% 50%;
- stroke-dasharray: ${({ circumference }) => `${circumference} ${circumference}`};
- stroke-dashoffset: ${({ circumference, percent }) => circumference - percent / 100 * circumference};
-`;
-
-export const FullScreenButton = styled.button`
- padding: 12px;
- position: absolute;
- top: 50px;
- right: 50px;
- border: none;
- background-color: rgba(0, 0, 0, .07);
-`;
-
-export const InputHolder = styled.div`
- background-color: rgba(0, 0, 0, .0);
- width: calc(100% - 70px);
- height: 60px;
- right: 70px;
- top: 12px;
- left: 12px;
- position: absolute;
-
- @media screen and (max-width: 600px) {
- width: 100%;
- }
-`;
-
-const blowAnim = keyframes`
- to {
- width: 200vw;
- height: 200vw;
- }
-`;
-
-type BlowProps = {
- delay: number;
- color: string;
-}
-
-export const Blow = styled.div`
- z-index: 10;
- border-radius: 50%;
- position: absolute;
- left: 50%;
- top: 50%;
- width: 0;
- height: 0%;
- background-color: ${({ color }) => color};
- animation: ${blowAnim} 1s ease-out forwards;
- animation-delay: ${({ delay }) => delay}s;
- transform: translate(-50%, -50%);
-`;
-
-const blowAnimShort = keyframes`
- to {
- width: 50vw;
- height: 50vw;
- }
-`;
-
-export const BigLogo = styled.img`
- z-index: 10;
- position: absolute;
- left: 50%;
- top: 50%;
- width: 0;
- height: 0;
- animation: ${blowAnimShort} 2s ease-out forwards;
- animation-delay: .7s;
- transform: translate(-50%, -50%);
+export const QRCanvas = styled.canvas`
+ display: block;
`;
diff --git a/src/socket.ts b/src/socket.ts
index 0166888..24bbd81 100644
--- a/src/socket.ts
+++ b/src/socket.ts
@@ -1,8 +1,17 @@
import { getConfigValue } from "@ijl/cli";
import { io } from "socket.io-client";
-export const socket = io(getConfigValue('journal.socket.url'), { path: getConfigValue('journal.socket.path')});
-socket.on("connect", () => {
- console.log('Socket connected', socket.id)
-})
+let socket = null;
+
+export const getSocket = () => socket;
+
+export const connect = () => {
+ socket = io(getConfigValue('journal.socket.url') + '/lessons', { path: getConfigValue('journal.socket.path')});
+ socket.on("connect", () => {
+ console.log('Socket connected', socket.id)
+ })
+
+}
+
+