diff --git a/package-lock.json b/package-lock.json index c04a5942..7e2b0e72 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27,6 +27,7 @@ "date-fns": "^3.6.0", "framer-motion": "^11.2.10", "html2canvas": "^1.4.1", + "html5-qrcode": "^2.3.8", "js-confetti": "^0.12.0", "load-script": "^2.0.0", "lucide-react": "^0.379.0", @@ -34,6 +35,8 @@ "motion": "^11.13.1", "nanoid": "^5.0.7", "prop-types": "^15.8.1", + "qrcode": "^1.5.4", + "qrcode.react": "^4.2.0", "react": "^18.2.0", "react-avatar-editor": "^13.0.2", "react-blurhash": "^0.3.0", @@ -50,6 +53,7 @@ "react-loading-indicators": "^0.2.3", "react-loading-skeleton": "^3.4.0", "react-oauth": "^0.0.1", + "react-qr-barcode-scanner": "^2.1.8", "react-quill": "^2.0.0", "react-router-dom": "^6.23.0", "react-router-hash-link": "^2.4.3", @@ -115,6 +119,7 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.6.tgz", "integrity": "sha512-qAHSfAdVyFmIvl0VHELib8xar7ONuSHrE2hLnsaWkYNTI68dmi1x8GYDhJjMI/e7XWal9QBlZkwbOnkcw7Z8gQ==", + "peer": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.24.6", @@ -671,6 +676,7 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz", "integrity": "sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==", + "peer": true, "dependencies": { "@emotion/memoize": "^0.8.1" } @@ -684,6 +690,7 @@ "version": "11.11.4", "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.4.tgz", "integrity": "sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw==", + "peer": true, "dependencies": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.11.0", @@ -724,6 +731,7 @@ "version": "11.11.5", "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.5.tgz", "integrity": "sha512-/ZjjnaNKvuMPxcIiUkf/9SHoG4Q196DRl1w82hQ3WCsjo1IUR8uaGWrC6a87CrYAW0Kb/pK7hk8BnLgLRi9KoQ==", + "peer": true, "dependencies": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.11.0", @@ -1266,6 +1274,7 @@ "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.5.2.tgz", "integrity": "sha512-5CdaCBGl8Rh9ohNdxeeTMxIj8oc3KNBgIeLMvJosBMdslK/UnEB8rzyDRrbKdL1kDweqBPo4GT9wvnakHWucZw==", "hasInstallScript": true, + "peer": true, "dependencies": { "@fortawesome/fontawesome-common-types": "6.5.2" }, @@ -1541,20 +1550,6 @@ "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, - "node_modules/@jest/console/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/@jest/console/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -1570,22 +1565,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@jest/console/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/console/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==" - }, "node_modules/@jest/console/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -1652,20 +1631,6 @@ } } }, - "node_modules/@jest/core/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/@jest/core/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -1681,22 +1646,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@jest/core/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/core/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==" - }, "node_modules/@jest/core/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -1825,20 +1774,6 @@ } } }, - "node_modules/@jest/reporters/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/@jest/reporters/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -1854,22 +1789,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@jest/reporters/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/reporters/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==" - }, "node_modules/@jest/reporters/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -1966,20 +1885,6 @@ "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, - "node_modules/@jest/transform/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/@jest/transform/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -1995,22 +1900,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@jest/transform/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/transform/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==" - }, "node_modules/@jest/transform/node_modules/convert-source-map": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", @@ -2051,20 +1940,6 @@ "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, - "node_modules/@jest/types/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/@jest/types/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -2080,22 +1955,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@jest/types/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/types/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==" - }, "node_modules/@jest/types/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -2259,6 +2118,7 @@ "version": "5.15.20", "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.15.20.tgz", "integrity": "sha512-tVq3l4qoXx/NxUgIx/x3lZiPn/5xDbdTE8VrLczNpfblLYZzlrbxA7kb9mI8NoBF6+w9WE9IrxWnKK5KlPI2bg==", + "peer": true, "dependencies": { "@babel/runtime": "^7.23.9", "@mui/base": "5.0.0-beta.40", @@ -3284,6 +3144,7 @@ "version": "18.3.3", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz", "integrity": "sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==", + "peer": true, "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" @@ -3426,6 +3287,28 @@ "url": "https://github.com/wojtekmaj/date-utils?sponsor=1" } }, + "node_modules/@zxing/library": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/@zxing/library/-/library-0.21.3.tgz", + "integrity": "sha512-hZHqFe2JyH/ZxviJZosZjV+2s6EDSY0O24R+FQmlWZBZXP9IqMo7S3nb3+2LBWxodJQkSurdQGnqE7KXqrYgow==", + "license": "MIT", + "dependencies": { + "ts-custom-error": "^3.2.1" + }, + "engines": { + "node": ">= 10.4.0" + }, + "optionalDependencies": { + "@zxing/text-encoding": "~0.9.0" + } + }, + "node_modules/@zxing/text-encoding": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@zxing/text-encoding/-/text-encoding-0.9.0.tgz", + "integrity": "sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA==", + "license": "(Unlicense OR Apache-2.0)", + "optional": true + }, "node_modules/abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", @@ -3436,6 +3319,7 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", "dev": true, + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -3551,6 +3435,21 @@ "node": ">=8" } }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", @@ -3811,20 +3710,6 @@ "@babel/core": "^7.8.0" } }, - "node_modules/babel-jest/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/babel-jest/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -3840,22 +3725,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/babel-jest/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/babel-jest/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==" - }, "node_modules/babel-jest/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -4053,7 +3922,8 @@ "node_modules/blurhash": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/blurhash/-/blurhash-2.0.5.tgz", - "integrity": "sha512-cRygWd7kGBQO3VEhPiTgq4Wc43ctsM+o46urrmPOiuAe+07fzlSB9OJVdpgDL0jPqXUVQ9ht7aq7kxOeJHRK+w==" + "integrity": "sha512-cRygWd7kGBQO3VEhPiTgq4Wc43ctsM+o46urrmPOiuAe+07fzlSB9OJVdpgDL0jPqXUVQ9ht7aq7kxOeJHRK+w==", + "peer": true }, "node_modules/boxen": { "version": "7.1.1", @@ -4194,6 +4064,7 @@ "url": "https://github.com/sponsors/ai" } ], + "peer": true, "dependencies": { "caniuse-lite": "^1.0.30001587", "electron-to-chromium": "^1.4.668", @@ -4565,36 +4436,6 @@ "node": ">=12" } }, - "node_modules/cliui/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/cliui/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/cliui/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==" - }, "node_modules/cliui/node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -4650,6 +4491,24 @@ "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==" }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "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==", + "license": "MIT" + }, "node_modules/color-support": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", @@ -4855,7 +4714,8 @@ "node_modules/csstype": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "peer": true }, "node_modules/data-view-buffer": { "version": "1.0.1", @@ -4933,6 +4793,15 @@ } } }, + "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==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/decompress-response": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", @@ -5091,6 +4960,12 @@ "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, + "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==", + "license": "MIT" + }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -5436,6 +5311,7 @@ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", "dev": true, + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -5579,21 +5455,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/eslint/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -5610,28 +5471,10 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/eslint/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/eslint/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/eslint/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, "engines": { "node": ">=10" @@ -6620,6 +6463,12 @@ "node": ">=8.0.0" } }, + "node_modules/html5-qrcode": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/html5-qrcode/-/html5-qrcode-2.3.8.tgz", + "integrity": "sha512-jsr4vafJhwoLVEDW3n1KvPnCCXWaQfRng0/EEYk1vNcQGcG/htAdhJX0be8YyqMoSz7+hZvOZSTAepsabiuhiQ==", + "license": "Apache-2.0" + }, "node_modules/http-cache-semantics": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", @@ -7539,20 +7388,6 @@ "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, - "node_modules/jest-circus/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/jest-circus/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -7568,22 +7403,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/jest-circus/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-circus/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==" - }, "node_modules/jest-circus/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -7636,20 +7455,6 @@ } } }, - "node_modules/jest-cli/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/jest-cli/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -7665,22 +7470,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/jest-cli/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-cli/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==" - }, "node_modules/jest-cli/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -7744,20 +7533,6 @@ } } }, - "node_modules/jest-config/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/jest-config/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -7773,22 +7548,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/jest-config/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-config/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==" - }, "node_modules/jest-config/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -7822,20 +7581,6 @@ "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, - "node_modules/jest-diff/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/jest-diff/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -7851,22 +7596,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/jest-diff/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-diff/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==" - }, "node_modules/jest-diff/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -7912,20 +7641,6 @@ "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, - "node_modules/jest-each/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/jest-each/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -7941,22 +7656,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/jest-each/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-each/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==" - }, "node_modules/jest-each/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -8050,20 +7749,6 @@ "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, - "node_modules/jest-matcher-utils/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/jest-matcher-utils/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -8079,22 +7764,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/jest-matcher-utils/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-matcher-utils/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==" - }, "node_modules/jest-matcher-utils/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -8133,20 +7802,6 @@ "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, - "node_modules/jest-message-util/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/jest-message-util/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -8162,22 +7817,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/jest-message-util/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-message-util/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==" - }, "node_modules/jest-message-util/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -8264,20 +7903,6 @@ "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, - "node_modules/jest-resolve/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/jest-resolve/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -8293,22 +7918,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/jest-resolve/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-resolve/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==" - }, "node_modules/jest-resolve/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -8375,20 +7984,6 @@ "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, - "node_modules/jest-runner/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/jest-runner/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -8404,22 +7999,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/jest-runner/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-runner/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==" - }, "node_modules/jest-runner/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -8471,20 +8050,6 @@ "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, - "node_modules/jest-runtime/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/jest-runtime/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -8500,22 +8065,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/jest-runtime/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-runtime/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==" - }, "node_modules/jest-runtime/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -8558,28 +8107,14 @@ "jest-get-type": "^28.0.2", "jest-haste-map": "^28.1.3", "jest-matcher-utils": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3", - "natural-compare": "^1.4.0", - "pretty-format": "^28.1.3", - "semver": "^7.3.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" + "jest-message-util": "^28.1.3", + "jest-util": "^28.1.3", + "natural-compare": "^1.4.0", + "pretty-format": "^28.1.3", + "semver": "^7.3.5" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, "node_modules/jest-snapshot/node_modules/chalk": { @@ -8597,22 +8132,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/jest-snapshot/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-snapshot/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==" - }, "node_modules/jest-snapshot/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -8659,20 +8178,6 @@ "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, - "node_modules/jest-util/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/jest-util/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -8688,22 +8193,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/jest-util/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-util/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==" - }, "node_modules/jest-util/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -8739,20 +8228,6 @@ "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, - "node_modules/jest-validate/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/jest-validate/node_modules/camelcase": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", @@ -8779,22 +8254,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/jest-validate/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-validate/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==" - }, "node_modules/jest-validate/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -8832,20 +8291,6 @@ "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, - "node_modules/jest-watcher/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/jest-watcher/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -8861,22 +8306,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/jest-watcher/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-watcher/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==" - }, "node_modules/jest-watcher/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -11074,6 +10503,15 @@ "node": ">=8" } }, + "node_modules/pngjs": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-5.0.0.tgz", + "integrity": "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==", + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/possible-typed-array-names": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", @@ -11280,6 +10718,150 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/qrcode": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.4.tgz", + "integrity": "sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==", + "license": "MIT", + "dependencies": { + "dijkstrajs": "^1.0.1", + "pngjs": "^5.0.0", + "yargs": "^15.3.1" + }, + "bin": { + "qrcode": "bin/qrcode" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/qrcode.react": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/qrcode.react/-/qrcode.react-4.2.0.tgz", + "integrity": "sha512-QpgqWi8rD9DsS9EP3z7BT+5lY5SFhsqGjpgW5DY/i3mK4M9DTBNz3ErMi8BWYEfI3L0d8GIbGmcdFAS1uIRGjA==", + "license": "ISC", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/qrcode/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/qrcode/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/qrcode/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/qrcode/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/qrcode/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/qrcode/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==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/qrcode/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==", + "license": "ISC" + }, + "node_modules/qrcode/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==", + "license": "MIT", + "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/qrcode/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==", + "license": "ISC", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -11388,6 +10970,7 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "peer": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -11489,6 +11072,7 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "peer": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -11653,6 +11237,20 @@ "react-dom": "^15.5.x || ^16.x || ^17.x || ^18.x" } }, + "node_modules/react-qr-barcode-scanner": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/react-qr-barcode-scanner/-/react-qr-barcode-scanner-2.1.8.tgz", + "integrity": "sha512-REbb+BWmPjvYIAZi6/iYrRupnK4e8d39m1YExhXk+XkKnz/aU/JembC1s+6ZO6jGVXnsGkh25Dwctcrm1HsK4g==", + "license": "MIT", + "dependencies": { + "@zxing/library": "^0.21.3", + "react-webcam": "^7.2.0" + }, + "peerDependencies": { + "react": ">=18.0.0", + "react-dom": ">=18.0.0" + } + }, "node_modules/react-quill": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/react-quill/-/react-quill-2.0.0.tgz", @@ -11695,6 +11293,7 @@ "version": "6.23.1", "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.23.1.tgz", "integrity": "sha512-utP+K+aSTtEdbWpC+4gxhdlPFwuEfDKq8ZrPFU65bbRJY+l706qjR7yaidBpo3MSeA/fzwbXWbKBI6ftOnP3OQ==", + "peer": true, "dependencies": { "@remix-run/router": "1.16.1", "react-router": "6.23.1" @@ -11863,6 +11462,16 @@ "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0" } }, + "node_modules/react-webcam": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/react-webcam/-/react-webcam-7.2.0.tgz", + "integrity": "sha512-xkrzYPqa1ag2DP+2Q/kLKBmCIfEx49bVdgCCCcZf88oF+0NPEbkwYk3/s/C7Zy0mhM8k+hpdNkBLzxg8H0aWcg==", + "license": "MIT", + "peerDependencies": { + "react": ">=16.2.0", + "react-dom": ">=16.2.0" + } + }, "node_modules/react-youtube": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/react-youtube/-/react-youtube-10.1.0.tgz", @@ -12085,6 +11694,12 @@ "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==", + "license": "ISC" + }, "node_modules/resolve": { "version": "2.0.0-next.5", "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", @@ -12313,6 +11928,7 @@ "version": "1.77.2", "resolved": "https://registry.npmjs.org/sass/-/sass-1.77.2.tgz", "integrity": "sha512-eb4GZt1C3avsX3heBNlrc7I09nyT00IUuo4eFhAbeXWU2fvA7oXI53SxODVAA+zgZCk9aunAZgO+losjR3fAwA==", + "peer": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", "immutable": "^4.0.0", @@ -13034,6 +12650,15 @@ "node": ">=0.10.0" } }, + "node_modules/ts-custom-error": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/ts-custom-error/-/ts-custom-error-3.3.1.tgz", + "integrity": "sha512-5OX1tzOjxWEgsr/YEUWSuPrQ00deKLh6D7OTWcvNHm12/7QPyRh8SYpyWvA4IZv8H/+GQWQEh/kwo95Q9OVW1A==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/tslib": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", @@ -13418,6 +13043,7 @@ "integrity": "sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "esbuild": "^0.21.3", "postcss": "^8.4.43", @@ -13626,6 +13252,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/which-module": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", + "license": "ISC" + }, "node_modules/which-typed-array": { "version": "1.1.15", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", @@ -13771,36 +13403,6 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi-cjs/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==" - }, "node_modules/wrap-ansi/node_modules/ansi-regex": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", @@ -13890,6 +13492,7 @@ "version": "0.18.5", "resolved": "https://registry.npmjs.org/xlsx/-/xlsx-0.18.5.tgz", "integrity": "sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ==", + "license": "Apache-2.0", "dependencies": { "adler-32": "~1.3.0", "cfb": "~1.2.1", diff --git a/package.json b/package.json index 9eb84216..ebe1627f 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,7 @@ "date-fns": "^3.6.0", "framer-motion": "^11.2.10", "html2canvas": "^1.4.1", + "html5-qrcode": "^2.3.8", "js-confetti": "^0.12.0", "load-script": "^2.0.0", "lucide-react": "^0.379.0", @@ -36,6 +37,8 @@ "motion": "^11.13.1", "nanoid": "^5.0.7", "prop-types": "^15.8.1", + "qrcode": "^1.5.4", + "qrcode.react": "^4.2.0", "react": "^18.2.0", "react-avatar-editor": "^13.0.2", "react-blurhash": "^0.3.0", @@ -52,6 +55,7 @@ "react-loading-indicators": "^0.2.3", "react-loading-skeleton": "^3.4.0", "react-oauth": "^0.0.1", + "react-qr-barcode-scanner": "^2.1.8", "react-quill": "^2.0.0", "react-router-dom": "^6.23.0", "react-router-hash-link": "^2.4.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6db197a2..85b5a747 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -65,6 +65,9 @@ importers: html2canvas: specifier: ^1.4.1 version: 1.4.1 + html5-qrcode: + specifier: ^2.3.8 + version: 2.3.8 js-confetti: specifier: ^0.12.0 version: 0.12.0 @@ -86,6 +89,12 @@ importers: prop-types: specifier: ^15.8.1 version: 15.8.1 + qrcode: + specifier: ^1.5.4 + version: 1.5.4 + qrcode.react: + specifier: ^4.2.0 + version: 4.2.0(react@18.3.1) react: specifier: ^18.2.0 version: 18.3.1 @@ -134,6 +143,9 @@ importers: react-oauth: specifier: ^0.0.1 version: 0.0.1 + react-qr-barcode-scanner: + specifier: ^2.1.8 + version: 2.1.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-quill: specifier: ^2.0.0 version: 2.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -1212,6 +1224,13 @@ packages: '@wojtekmaj/date-utils@1.5.1': resolution: {integrity: sha512-+i7+JmNiE/3c9FKxzWFi2IjRJ+KzZl1QPu6QNrsgaa2MuBgXvUy4gA1TVzf/JMdIIloB76xSKikTWuyYAIVLww==} + '@zxing/library@0.21.3': + resolution: {integrity: sha512-hZHqFe2JyH/ZxviJZosZjV+2s6EDSY0O24R+FQmlWZBZXP9IqMo7S3nb3+2LBWxodJQkSurdQGnqE7KXqrYgow==} + engines: {node: '>= 10.4.0'} + + '@zxing/text-encoding@0.9.0': + resolution: {integrity: sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA==} + abbrev@1.1.1: resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} @@ -1550,6 +1569,9 @@ packages: resolution: {integrity: sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==} engines: {node: 10.* || >= 12.*} + cliui@6.0.0: + resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} + cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} @@ -1692,6 +1714,10 @@ packages: supports-color: optional: true + decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + decompress-response@6.0.0: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} engines: {node: '>=10'} @@ -1748,6 +1774,9 @@ packages: resolution: {integrity: sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dijkstrajs@1.0.3: + resolution: {integrity: sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==} + dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -2284,6 +2313,9 @@ packages: resolution: {integrity: sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA==} engines: {node: '>=8.0.0'} + html5-qrcode@2.3.8: + resolution: {integrity: sha512-jsr4vafJhwoLVEDW3n1KvPnCCXWaQfRng0/EEYk1vNcQGcG/htAdhJX0be8YyqMoSz7+hZvOZSTAepsabiuhiQ==} + http-cache-semantics@4.1.1: resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} @@ -3287,6 +3319,10 @@ packages: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} + pngjs@5.0.0: + resolution: {integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==} + engines: {node: '>=10.13.0'} + possible-typed-array-names@1.0.0: resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} engines: {node: '>= 0.4'} @@ -3351,6 +3387,16 @@ packages: resolution: {integrity: sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==} engines: {node: '>=12.20'} + qrcode.react@4.2.0: + resolution: {integrity: sha512-QpgqWi8rD9DsS9EP3z7BT+5lY5SFhsqGjpgW5DY/i3mK4M9DTBNz3ErMi8BWYEfI3L0d8GIbGmcdFAS1uIRGjA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + qrcode@1.5.4: + resolution: {integrity: sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==} + engines: {node: '>=10.13.0'} + hasBin: true + queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -3501,6 +3547,12 @@ packages: react: ^15.5.x || ^16.x || ^17.x || ^18.x react-dom: ^15.5.x || ^16.x || ^17.x || ^18.x + react-qr-barcode-scanner@2.1.8: + resolution: {integrity: sha512-REbb+BWmPjvYIAZi6/iYrRupnK4e8d39m1YExhXk+XkKnz/aU/JembC1s+6ZO6jGVXnsGkh25Dwctcrm1HsK4g==} + peerDependencies: + react: '>=18.0.0' + react-dom: '>=18.0.0' + react-quill@2.0.0: resolution: {integrity: sha512-4qQtv1FtCfLgoD3PXAur5RyxuUbPXQGOHgTlFie3jtxp43mXDtzCKaOgQ3mLyZfi1PUlyjycfivKelFhy13QUg==} peerDependencies: @@ -3589,6 +3641,12 @@ packages: react: ^16.0.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 + react-webcam@7.2.0: + resolution: {integrity: sha512-xkrzYPqa1ag2DP+2Q/kLKBmCIfEx49bVdgCCCcZf88oF+0NPEbkwYk3/s/C7Zy0mhM8k+hpdNkBLzxg8H0aWcg==} + peerDependencies: + react: '>=16.2.0' + react-dom: '>=16.2.0' + react-youtube@10.1.0: resolution: {integrity: sha512-ZfGtcVpk0SSZtWCSTYOQKhfx5/1cfyEW1JN/mugGNfAxT3rmVJeMbGpA9+e78yG21ls5nc/5uZJETE3cm3knBg==} engines: {node: '>= 14.x'} @@ -3647,6 +3705,9 @@ packages: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} + require-main-filename@2.0.0: + resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + resolve-alpn@1.2.1: resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} @@ -4004,6 +4065,10 @@ packages: resolution: {integrity: sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==} engines: {node: '>=0.10.0'} + ts-custom-error@3.3.1: + resolution: {integrity: sha512-5OX1tzOjxWEgsr/YEUWSuPrQ00deKLh6D7OTWcvNHm12/7QPyRh8SYpyWvA4IZv8H/+GQWQEh/kwo95Q9OVW1A==} + engines: {node: '>=14.0.0'} + tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} @@ -4193,6 +4258,9 @@ packages: resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} engines: {node: '>= 0.4'} + which-module@2.0.1: + resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} + which-typed-array@1.1.15: resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} engines: {node: '>= 0.4'} @@ -4226,6 +4294,10 @@ packages: resolution: {integrity: sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==} engines: {node: '>=0.8'} + wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -4253,6 +4325,9 @@ packages: engines: {node: '>=0.8'} hasBin: true + y18n@4.0.3: + resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} @@ -4267,10 +4342,18 @@ packages: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} + yargs-parser@18.1.3: + resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} + engines: {node: '>=6'} + yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} + yargs@15.4.1: + resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} + engines: {node: '>=8'} + yargs@17.7.2: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} @@ -5392,6 +5475,15 @@ snapshots: '@wojtekmaj/date-utils@1.5.1': {} + '@zxing/library@0.21.3': + dependencies: + ts-custom-error: 3.3.1 + optionalDependencies: + '@zxing/text-encoding': 0.9.0 + + '@zxing/text-encoding@0.9.0': + optional: true + abbrev@1.1.1: {} acorn-jsx@5.3.2(acorn@8.12.0): @@ -5833,6 +5925,12 @@ snapshots: optionalDependencies: '@colors/colors': 1.5.0 + cliui@6.0.0: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + cliui@8.0.1: dependencies: string-width: 4.2.3 @@ -5965,6 +6063,8 @@ snapshots: dependencies: ms: 2.1.2 + decamelize@1.2.0: {} + decompress-response@6.0.0: dependencies: mimic-response: 3.1.0 @@ -6012,6 +6112,8 @@ snapshots: diff-sequences@28.1.1: {} + dijkstrajs@1.0.3: {} + dir-glob@3.0.1: dependencies: path-type: 4.0.0 @@ -6696,6 +6798,8 @@ snapshots: css-line-break: 2.1.0 text-segmentation: 1.0.3 + html5-qrcode@2.3.8: {} + http-cache-semantics@4.1.1: {} http-proxy-agent@5.0.0: @@ -7928,6 +8032,8 @@ snapshots: dependencies: find-up: 4.1.0 + pngjs@5.0.0: {} + possible-typed-array-names@1.0.0: {} postcss-value-parser@4.2.0: {} @@ -7984,6 +8090,16 @@ snapshots: dependencies: escape-goat: 4.0.0 + qrcode.react@4.2.0(react@18.3.1): + dependencies: + react: 18.3.1 + + qrcode@1.5.4: + dependencies: + dijkstrajs: 1.0.3 + pngjs: 5.0.0 + yargs: 15.4.1 + queue-microtask@1.2.3: {} quick-lru@5.1.1: {} @@ -8154,6 +8270,13 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) + react-qr-barcode-scanner@2.1.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@zxing/library': 0.21.3 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-webcam: 7.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-quill@2.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@types/quill': 1.3.10 @@ -8280,6 +8403,11 @@ snapshots: react-dom: 18.3.1(react@18.3.1) scriptjs: 2.5.9 + react-webcam@7.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-youtube@10.1.0(react@18.3.1): dependencies: fast-deep-equal: 3.1.3 @@ -8348,6 +8476,8 @@ snapshots: require-from-string@2.0.2: {} + require-main-filename@2.0.0: {} + resolve-alpn@1.2.1: {} resolve-cwd@3.0.0: @@ -8738,6 +8868,8 @@ snapshots: dependencies: escape-string-regexp: 1.0.5 + ts-custom-error@3.3.1: {} + tslib@2.6.2: {} tslib@2.6.3: {} @@ -8946,6 +9078,8 @@ snapshots: is-weakmap: 2.0.2 is-weakset: 2.0.3 + which-module@2.0.1: {} + which-typed-array@1.1.15: dependencies: available-typed-arrays: 1.0.7 @@ -8976,6 +9110,12 @@ snapshots: word@0.3.0: {} + wrap-ansi@6.2.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 @@ -9014,6 +9154,8 @@ snapshots: wmf: 1.0.2 word: 0.3.0 + y18n@4.0.3: {} + y18n@5.0.8: {} yallist@3.1.1: {} @@ -9022,8 +9164,27 @@ snapshots: yaml@1.10.2: {} + yargs-parser@18.1.3: + dependencies: + camelcase: 5.3.1 + decamelize: 1.2.0 + yargs-parser@21.1.1: {} + yargs@15.4.1: + dependencies: + cliui: 6.0.0 + decamelize: 1.2.0 + find-up: 4.1.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + require-main-filename: 2.0.0 + set-blocking: 2.0.0 + string-width: 4.2.3 + which-module: 2.0.1 + y18n: 4.0.3 + yargs-parser: 18.1.3 + yargs@17.7.2: dependencies: cliui: 8.0.1 diff --git a/src/App.jsx b/src/App.jsx index 952b2ac1..4684d98b 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -40,8 +40,8 @@ const Team = lazy(() => import("./pages/Team/Team")); const Alumni = lazy(() => import("./pages/Alumni/Alumni")); const Profile = lazy(() => import("./pages/Profile/Profile")); const Blog = lazy(() => import("./pages/Blog/Blog")); -const Omega = lazy(() => import("./pages/LiveEvents/Omega/Omega")); -// const Pixel_AI_Hack = lazy(() => import("./pages/LiveEvents/Pixel_AI_Hack/Pixel_AI_Hack")); +// const Omega = lazy(() => import("./pages/LiveEvents/Omega/Omega")); + const Signup = lazy(() => import("./pages/Authentication/Signup/Signup")); const ForgotPassword = lazy(() => @@ -59,27 +59,28 @@ const Login = lazy(() => import("./pages/Authentication/Login/Login")); const OTPInput = lazy(() => import("./authentication/Login/ForgotPassword/OTPInput") ); +const AttendancePage = lazy(() => import('./pages/AttendancePage/AttendancePage')); const MainLayout = () => { const location = useLocation(); - const isPixel_AI_HackPage = location.pathname === "/Pixel_AI_Hack"; + const isomegaPage = location.pathname === "/omega"; - // useEffect(() => { - // if (isPixel_AI_HackPage) { - // document.body.style.backgroundColor = "#000026"; - // } else { - // document.body.style.backgroundColor = ""; - // } + useEffect(() => { + if (isomegaPage) { + document.body.style.backgroundColor = "#000000"; + } else { + document.body.style.backgroundColor = ""; + } - // return () => { - // document.body.style.backgroundColor = ""; - // }; - // }, [isPixel_AI_HackPage]); + return () => { + document.body.style.backgroundColor = ""; + }; + }, [isomegaPage]); return (
-
+
@@ -111,8 +112,7 @@ function App() { {/* } /> */} } /> } /> - } /> - {/* }/> */} + {/* } /> */} {/* Route After Login */} {authCtx.isLoggedIn && ( }> @@ -140,6 +140,32 @@ function App() { authCtx.user.access === "SENIOR_EXECUTIVE_CREATIVE") && ( } /> )} + {/* Certificates Route */} + + {authCtx.user.access === "ADMIN" && ( + } /> + )} + + {authCtx.user.access === "ADMIN" && ( + } + /> + )} + + {authCtx.user.access === "ADMIN" && ( + } + /> + )} + + {authCtx.user.access === "ADMIN" && ( + } + /> + )} )} {authCtx.user.access === "USER" && - authCtx.user.email == "srex@fedkiit.com" && ( + authCtx.user.email == "attendance@fedkiit.com" && ( ]} /> )} + } /> )} { @@ -40,6 +44,7 @@ const EventCard = (props) => { const { info } = data; const authCtx = useContext(AuthContext); const [isOpen, setOpen] = useState(false); + const [isQRModalOpen, setQRModalOpen] = useState(false); const [isHovered, setisHovered] = useState(false); const [remainingTime, setRemainingTime] = useState(""); const [btnTxt, setBtnTxt] = useState("Register Now"); @@ -51,6 +56,7 @@ const EventCard = (props) => { const [navigatePath, setNavigatePath] = useState("/"); const [isLocked, setIsLocked] = useState(false); const [alert, setAlert] = useState(null); + const [isTeamDetailsOpen, setIsTeamDetailsOpen] = useState(false); useEffect(() => { if (shouldNavigate) { @@ -258,6 +264,30 @@ const EventCard = (props) => { setOpen(false); }; + const handleQRCode = () => { + if (authCtx.isLoggedIn && authCtx.user.regForm && authCtx.user.regForm.includes(data.id)) { + setQRModalOpen(!isQRModalOpen); + } else if (!authCtx.isLoggedIn) { + setAlert({ + type: "info", + message: "Please login to access attendance QR code.", + position: "bottom-right", + duration: 3000, + }); + } else { + setAlert({ + type: "info", + message: "You need to register for this event first to get the attendance QR code.", + position: "bottom-right", + duration: 3000, + }); + } + }; + + const handleCloseQRModal = () => { + setQRModalOpen(false); + }; + const isValiedState = () => { if ( btnTxt === "Closed" || @@ -383,6 +413,21 @@ const EventCard = (props) => { />
)} + {type === "ongoing" && authCtx.isLoggedIn && authCtx.user.regForm && authCtx.user.regForm.includes(data.id) && ( +
+ +
+ )}
@@ -467,17 +512,30 @@ const EventCard = (props) => { // } > {btnTxt === "Closed" ? ( - <> -
Closed
- - - ) : btnTxt === "Already Registered" ? ( - <> -
Registered
- + <> +
Closed
+ + +) : btnTxt === "Already Registered" ? ( + info.participationType === "Team" ? ( // Show Team Details only for team events + <> +
setIsTeamDetailsOpen(true)} + > + Team Details +
+ + ) : ( + <> +
Registered
+ + ) + + ) : btnTxt === "Locked" ? ( <>
Locked
@@ -509,6 +567,8 @@ const EventCard = (props) => {
)} + +
@@ -536,6 +596,9 @@ const EventCard = (props) => { {isOpen && type === "ongoing" && ( )} + {isQRModalOpen && type === "ongoing" && ( + + )} {enableEdit && isHovered && authCtx.user.access === "ADMIN" && (
setisHovered(true)} @@ -578,6 +641,15 @@ const EventCard = (props) => { />
)} + + {/* Team Details Modal */} + setIsTeamDetailsOpen(false)} + formId={data.id} + eventTitle={info.eventTitle} + /> +
); diff --git a/src/components/EventCard/styles/EventCard.module.scss b/src/components/EventCard/styles/EventCard.module.scss index c8b70801..1ed1b89d 100644 --- a/src/components/EventCard/styles/EventCard.module.scss +++ b/src/components/EventCard/styles/EventCard.module.scss @@ -114,6 +114,33 @@ width: 1rem; } +.qrCode { + background: rgba(15, 15, 15, 0.5); + backdrop-filter: blur(1.8663231134414673px); + border: 1px solid rgb(143, 139, 139); + color: #f97507; + position: absolute; + top: 3.5rem; + right: 1rem; + text-align: center; + border-radius: 7px; + font-size: 0.75rem; + font-weight: 800; + padding: 0.5rem; + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + transition: all 0.3s ease; + + +} + +.qrIcon { + height: 1rem; + width: 1rem; +} + .price p { display: flex; align-items: center; @@ -180,19 +207,19 @@ ) ); display: inline-flex; - padding: 0.6rem 0.8rem; + padding: 0.6rem ; justify-content: center; align-items: center; - margin-top: 1rem; - gap: 0.3rem; - // width: 10rem; + margin-top: 0rem; + gap: 0rem; cursor: progress; outline: none; border: none; font-size: 0.9rem; - color: #fff; + color: #ffffff; } + .backtxt { width: 90%; margin-inline: auto; @@ -245,6 +272,8 @@ a { width: 44%; } + + @media (max-width: 600px) { .backbtn { margin-top: 0.2rem; @@ -286,4 +315,4 @@ a { align-items: center; margin-top: 0.1rem; } -} +} \ No newline at end of file diff --git a/src/components/LiveEvents/Accordian/Accordian.jsx b/src/components/LiveEvents/Accordian/Accordian.jsx index 2720207d..4d9e1e83 100644 --- a/src/components/LiveEvents/Accordian/Accordian.jsx +++ b/src/components/LiveEvents/Accordian/Accordian.jsx @@ -48,7 +48,7 @@ const Accordion = ({ data }) => { } transition={{ duration: 0.6, ease: "easeOut" }} > -
+
{
diff --git a/src/data/Carousel.json b/src/data/Carousel.json index a6da4b36..91a93109 100644 --- a/src/data/Carousel.json +++ b/src/data/Carousel.json @@ -1,17 +1,18 @@ [ { - "image": "https://res.cloudinary.com/dm6jd6bhk/image/upload/v1723491234/WebImages/pdamxjoydih8u126tcin.jpg" + "image": "https://cdn.prod.website-files.com/6891df87cfba687a7fd80202/68ad5c933de15739388e7d58_IMG-20250821-WA0042.jpg" + }, { - "image": "https://res.cloudinary.com/dm6jd6bhk/image/upload/v1723474147/WebImages/gkj4lcjlclqtal2ywsgy.jpg" + "image": "https://cdn.prod.website-files.com/6891df87cfba687a7fd80202/68ad5c923a6883f39fa0f16f_IMG-20250821-WA0048.jpg" }, { - "image": "https://res.cloudinary.com/dm6jd6bhk/image/upload/v1723474144/WebImages/g702ehalm27csrqq84pa.jpg" + "image": "https://res.cloudinary.com/dm6jd6bhk/image/upload/v1723491234/WebImages/pdamxjoydih8u126tcin.jpg" }, { - "image": "https://res.cloudinary.com/dm6jd6bhk/image/upload/v1723474145/WebImages/q9hc1sidzihgh43wtrw5.jpg" + "image": "https://res.cloudinary.com/ddx6avza4/image/upload/v1756233848/filename_xim4ah.jpg" }, { - "image": "https://res.cloudinary.com/dm6jd6bhk/image/upload/v1723490913/WebImages/ijleazx6xkrsb8nsnu54.jpg" + "image": "https://res.cloudinary.com/ddx6avza4/image/upload/v1756233685/IMG_4985_hq0qfv.jpg" } ] diff --git a/src/data/SocialLink.json b/src/data/SocialLink.json index edeed898..b32c611c 100644 --- a/src/data/SocialLink.json +++ b/src/data/SocialLink.json @@ -1,10 +1,10 @@ { "instagramTopPost": "https://www.instagram.com/p/C_NcMspy94V/?utm_source=ig_web_copy_link&igsh=MzRlODBiNWFlZA==", - "instagramBottomPost": "https://www.instagram.com/p/C_D1KOoSt7c/?utm_source=ig_web_copy_link&igsh=MzRlODBiNWFlZA==", - "instagramReel": "https://www.instagram.com/reel/C_NWmC_SBH5/?utm_source=ig_web_copy_link&igsh=MzRlODBiNWFlZA==", + "instagramBottomPost": "https://www.instagram.com/p/DNBKQZXzDvn/?igsh=MTM4c2N6c2ZpMXcxeA==", + "instagramReel": "https://www.instagram.com/p/DM5azT6TVt4/?igsh=MXI1eHBodjU3cHB5OA%3D%3D", "linkedInPost": { - "url": "https://www.linkedin.com/embed/feed/update/urn:li:share:7232779054104387585", - "postUrl": "https://www.linkedin.com/posts/fedkiit_fedpreneurshow-omega4-fedkiit-activity-7232779055119351810-JXC2?utm_source=share&utm_medium=member_desktop" + "url": "https://www.linkedin.com/embed/feed/update/urn:li:share:7358731261688827904", + "postUrl": "https://www.linkedin.com/posts/fedkiit_were-excited-to-welcome-unstop-as-the-platform-activity-7358731264897478657-BKWI?utm_source=share&utm_medium=member_desktop&rcm=ACoAAEGVnCgBVHbcyHMpjs36i2Lkz8H7ZXtJp4Y" } } \ No newline at end of file diff --git a/src/data/Sponser.json b/src/data/Sponser.json index 0afce6fd..9de63e67 100644 --- a/src/data/Sponser.json +++ b/src/data/Sponser.json @@ -1,4 +1,25 @@ [ + { + "image": "https://cdn.prod.website-files.com/6898a84f39288fa31fb19eb3/68b1b1e566f93e724d817493_eef89a14894ab60c2de4591433117cb8_347615ad16304501c571bf1208b83615bc2eb3b7.jpg" + }, + { + "image": "https://cdn.prod.website-files.com/6898a84f39288fa31fb19eb3/68b1b277c3dff77928f42d07_42506cd40d9f845726c5b38fa6135dab_1737828471512.jpeg" + }, + { + "image": "https://cdn.prod.website-files.com/6898a84f39288fa31fb19eb3/6898aa1700b8583e9b0cea09_9a90e8c4f7933718410931fff16e1d67d0b1a728%20(1)-modified.png" + }, + { + "image": "https://cdn.prod.website-files.com/6898a84f39288fa31fb19eb3/68b1b4a473e0c91daf83aee0_SR%20burger%20point%202.png" + }, + + { + "image": "https://cdn.prod.website-files.com/6898a84f39288fa31fb19eb3/6898a9a97a1a9e6121d28cfb_988e7f74979dc9924fdc07590a81526d0d19ddc4.png" + }, + + { + "image": "https://cdn.prod.website-files.com/6898a84f39288fa31fb19eb3/68b1b4713f09aa52852051a1_Adda%20Cafe%20-%20Logo%202.png" + }, + { "image": "https://res.cloudinary.com/dm6jd6bhk/image/upload/v1723474142/WebImages/idm0kbdoybdmiklcgvkv.png" }, diff --git a/src/data/liveEvents/omega/Accordion.json b/src/data/liveEvents/omega/Accordion.json index e4b8b448..1e742fb8 100644 --- a/src/data/liveEvents/omega/Accordion.json +++ b/src/data/liveEvents/omega/Accordion.json @@ -1,46 +1,89 @@ [ { - "title": "How to register?", - "content": "Be updated with our Instagram posts and FED site. A registration link will be provided once the registrations are on, or you can scan the QR code provided on our official Instagram account: https://www.instagram.com/fedkiit/." + "title": "What is Omega 5.0?", + "content": "Omega is FED’s flagship event, consisting of four unique segments focusing on developing entrepreneurship, strategic thinking, innovation, and leadership skills. It's open to students from KIIT and beyond." }, { - "title": "What is Omega?", - "content": "Omega is FED’s flagship event consisting of four different segments, focusing on the development of entrepreneurship and other skills." + "title": "Who can participate in Omega 5.0?", + "content": "Anyone can participate! You can register as an individual or as part of a team. You don’t have to be a KIIT student; students from other institutions are welcome too." }, { - "title": "What are the rewards?", - "content": "We have exciting prizes for the winners. Be updated with all our announcements and discover for yourself what exciting things we have in store for you all." + "title": "How can I register for Omega 5.0?", + "content": "The registration link is already available on our official Instagram page (@fedkiit). You can also register directly by visiting our website (fedkiit.com). Simply use the 'Sign in with Google' option to complete your registration quickly and securely!" + }, + { + "title": "Can the registration payment be done via the website?", + "content": "Yes, participants can easily register and pay directly on the official website." + }, + { + "title": "What is the early bird offer?", + "content": "Register before 10th August 2025 to avail the early bird price of ₹89 (instead of ₹129)." + }, + { + "title": "Is there a deadline for registration?", + "content": "Yes, check the official social media or website for the exact registration deadlines. Early bird offers end on 10th August 2025." + }, + { + "title": "Where do I find the schedule for the event?", + "content": "The main event will be held on 16th and 17th August.\nTIMINGS:\n10:00 AM – 2:00 PM\n3:00 PM – 6:00 PM" + }, + { + "title": "What are the main events in Omega 5.0?", + "content": "Fedpreneur Show (The FED Show): 16th Aug\nFed Premier League (FPL): 16th Aug\nStrategic Pivot Challenge: 17th Aug\nInnovate X Hackathon: 17th Aug" + }, + { + "title": "Can a single participant take part in all the events?", + "content": "Yes, contestants may compete in one or all events, alone or with a team." + }, + { + "title": "What is the Fedpreneur (FED) Show?", + "content": "This is a special segment where entrepreneurial journeys, stories, and strategies are shared and discussed, offering insights into starting up and innovating." + }, + { + "title": "What is the Fed Premier League (FPL)?", + "content": "An imitation of the Indian Premier League (IPL) cricket auction process, designed for a fun, team-based strategic experience." + }, + { + "title": "What is the Strategic Pivot Challenge?", + "content": "A competition requiring participants to solve unique and realistic business challenges using critical thinking and quick decision-making." + }, + { + "title": "What is Innovate X Hackathon?", + "content": "A hackathon challenging teams and individuals to come up with innovative solutions for real-world problems in a creative environment." + }, + { + "title": "How is this year’s Pitchers event different from previous editions?", + "content": "This year, Pitchers will involve analyzing failed business ideas and pitching innovative solutions to improve or revive them." }, { "title": "Is it necessary that all the team members belong to KIIT only?", - "content": "No, there is no such specific condition. You are free to select your teammates." + "content": "No. Teams can be made up of students from KIIT or any other institution." }, - - { - "title": "What is FPL?", - "content": "It is an imitation of Indian Premier League cricket auctions." + "title": "What is the maximum or minimum team size?", + "content": "Except for Fedpreneur Show, the rest are group events. But if you register alone and can’t find a friend to attend the event, don’t worry—we will combine you with someone prior to the event." }, { - "title": "How is the Pitchers event this year different from that of the previous editions?", - "content": "This time, the Pitchers can pitch as well as invest in other ideas." + "title": "What are the rewards/prizes?", + "content": "Exciting prizes await the winners! Stay connected with our official announcements for detailed updates about prizes." }, { - "title": "How to connect with the Organising Committee from the FED website?", - "content": "Our website has all the info related to our members, and you can directly head to any of our members' social media accounts to connect with them. If you have any doubts, you can ask us on https://www.instagram.com/fedkiit/ or visit https://www.fedkiit.com/ (our official website)." + "title": "How can I connect with the Organising Committee?", + "content": "All the organizing members’ details are available on the website. You can also reach out via our official Instagram or website for any queries." }, { - "title": "Is it possible for a single participant to participate in all the events of Omega?", - "content": "Yes, contestants can participate alone or as a team." + "title": "Where can I get the latest updates about Omega and its rounds?", + "content": "Follow @fedkiit on Instagram and keep checking fedkiit.com for real-time updates." }, { - "title": "How long will the events last on the given dates?", - "content": "DATES: 16th and 17th of August. TIMINGS: 9:00 AM – 2:00 PM, 3:00 PM – 6:00 PM." + "title": "Where will the events be conducted?", + "content": "The event locations will be shared soon." }, { - "title": "Can the registration payment be done via the website?", - "content": "Participants can register from the website itself." + "title": "What do I need to bring on event day?", + "content": "Bring a valid ID and any materials specified in your event’s instructions." } ] + \ No newline at end of file diff --git a/src/data/liveEvents/omega/Speakers.json b/src/data/liveEvents/omega/Speakers.json new file mode 100644 index 00000000..aa18f554 --- /dev/null +++ b/src/data/liveEvents/omega/Speakers.json @@ -0,0 +1,27 @@ +[ + { + "name": "Navan Jaiswal", + "designation": "Co-Founder, CirclePe", + "image": "https://cdn.prod.website-files.com/663d1907e337de23e83c30b2/6896dceb9827aec266ae2793_navan2%201.png" + }, + { + "name": "Akhil Tripathi", + "designation": "Co-Founder, SciAstra", + + "image": "https://cdn.prod.website-files.com/6898a84f39288fa31fb19eb3/6898aad13c4123f89f32e2f7_spkr.png" + + + }, + { + "name": "Niket Raj Dwivedi", + "designation": "Co-Founder, Medial", + "image": "https://cdn.prod.website-files.com/663d1907e337de23e83c30b2/68979f6415a0720cda755e01_image%204445%20(1).png" + }, + { + "name": "Biswajit Swain", + "designation": "Co-Founder, Coratia Technologies", + "image": "https://cdn.prod.website-files.com/663d1907e337de23e83c30b2/6897a1070178c4724ba2e4d5_Group%201171275127%20(1).png" + + } + +] \ No newline at end of file diff --git a/src/data/liveEvents/omega/Sponsor.json b/src/data/liveEvents/omega/Sponsor.json index b2f70bc5..b9781063 100644 --- a/src/data/liveEvents/omega/Sponsor.json +++ b/src/data/liveEvents/omega/Sponsor.json @@ -1,12 +1,29 @@ [ { - "image": "https://ucarecdn.com/89def985-c8ff-440e-90ea-0159a410c9c0/" + "image": "https://cdn.prod.website-files.com/6891df87cfba687a7fd80202/6894c270e31a5b614a55a4e8_unstop.png" }, { - "image": "https://ucarecdn.com/1f48ea80-f710-4ce1-ac09-5d72b42c9b8d/" + "image": "https://cdn.prod.website-files.com/6898a84f39288fa31fb19eb3/6898a8fe9671b22673e0f203_6894c26fb6206100bba45491_unlox.png" + }, + + + { + "image": "https://cdn.prod.website-files.com/6898a84f39288fa31fb19eb3/6898aa1700b8583e9b0cea09_9a90e8c4f7933718410931fff16e1d67d0b1a728%20(1)-modified.png" + }, + { + "image": "https://cdn.prod.website-files.com/6898a84f39288fa31fb19eb3/6898aa9f5a40aef2c05eb0ff_5c8f6c0dde7851b7ca6196a64c62a990e3c0f152-modified.png" + }, + + { + "image": "https://cdn.prod.website-files.com/6898a84f39288fa31fb19eb3/6898a9a97a1a9e6121d28cfb_988e7f74979dc9924fdc07590a81526d0d19ddc4.png" + }, + + { + "image": "https://cdn.prod.website-files.com/6898a84f39288fa31fb19eb3/6898a93894f03e50b49808ed_59482e2954cee1953c2f73d2989e3936c8e5e863.png" } - + + ] diff --git a/src/features/Modals/Event/QRCodeModal/QRCodeModal.jsx b/src/features/Modals/Event/QRCodeModal/QRCodeModal.jsx new file mode 100644 index 00000000..46e3b5b2 --- /dev/null +++ b/src/features/Modals/Event/QRCodeModal/QRCodeModal.jsx @@ -0,0 +1,142 @@ +import React, { useState, useEffect, useContext } from 'react'; +import { X } from 'lucide-react'; +import { QRCodeSVG } from 'qrcode.react'; +import AuthContext from '../../../../context/AuthContext'; +import { RecoveryContext } from '../../../../context/RecoveryContext'; +import { api } from '../../../../services'; +import { Alert } from '../../../../microInteraction'; +import style from './styles/QRCodeModal.module.scss'; + +const QRCodeModal = ({ onClose, eventId, onAttendanceMarked }) => { + const [qrCodeData, setQrCodeData] = useState(null); + const [isLoading, setIsLoading] = useState(true); + const [error, setError] = useState(null); + const [attendanceMarked, setAttendanceMarked] = useState(false); + const authCtx = useContext(AuthContext); + const recoveryCtx = useContext(RecoveryContext); + + useEffect(() => { + fetchAttendanceCode(); + }, [eventId]); + + useEffect(() => { + if (onAttendanceMarked) { + setAttendanceMarked(true); + } + }, [onAttendanceMarked]); + + const fetchAttendanceCode = async () => { + try { + setIsLoading(true); + setError(null); + + const teamCode = recoveryCtx.teamCode; + + let url = `/api/form/attendanceCode/${eventId}`; + if (teamCode && teamCode.trim() !== '') { + url += `?teamCode=${encodeURIComponent(teamCode)}`; + } + + const token = localStorage.getItem('token'); + + const response = await api.get(url, { + headers: { + 'Authorization': token + } + }); + + if (response.status === 200) { + setQrCodeData(response.data.attendanceToken); + } else { + throw new Error('Failed to fetch attendance code'); + } + } catch (error) { + setError(error?.response?.data?.message || 'Failed to generate QR code. Please try again.'); + } finally { + setIsLoading(false); + } + }; + + const handleClose = () => { + onClose(); + }; + + const handleRetry = () => { + fetchAttendanceCode(); + }; + + const handleAttendanceMarked = () => { + setAttendanceMarked(true); + }; + + const handleOK = () => { + onClose(); + }; + + const handleScanNewAttendee = () => { + setAttendanceMarked(false); + setQrCodeData(null); + fetchAttendanceCode(); + }; + + return ( +
+
+
+
+
+ +
+
Attendance QR Code
+
+ +
+ {isLoading ? ( +
+
+

Generating QR Code...

+
+ ) : error ? ( +
+

{error}

+ +
+ ) : qrCodeData ? ( +
+
+ +
+ +
+

+ Show this QR code to event organizers for attendance verification. +

+

+ This attendance QR code can be used only once. Do not share it with others.

+
+
+ ) : ( +
+

No attendance code available

+
+ )} +
+
+
+ ); +}; + +export default QRCodeModal; \ No newline at end of file diff --git a/src/features/Modals/Event/QRCodeModal/index.jsx b/src/features/Modals/Event/QRCodeModal/index.jsx new file mode 100644 index 00000000..94894e0b --- /dev/null +++ b/src/features/Modals/Event/QRCodeModal/index.jsx @@ -0,0 +1 @@ +export { default } from './QRCodeModal'; \ No newline at end of file diff --git a/src/features/Modals/Event/QRCodeModal/styles/QRCodeModal.module.scss b/src/features/Modals/Event/QRCodeModal/styles/QRCodeModal.module.scss new file mode 100644 index 00000000..18b8f56e --- /dev/null +++ b/src/features/Modals/Event/QRCodeModal/styles/QRCodeModal.module.scss @@ -0,0 +1,396 @@ +.qrContainer { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 50; + display: flex; + justify-content: center; + align-items: center; + padding: 1rem; +} + +.overlay { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: rgba(0, 0, 0, 0.5); + backdrop-filter: blur(5px); + z-index: 5; +} + +.maindiv { + z-index: 1000; + border-radius: 16px; + padding: 2rem; + position: relative; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + background: rgba(42, 42, 42, 0.95); + border: 2px solid #444; + width: 100%; + max-width: 450px; + min-height: 400px; + box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3); +} + +.header { + position: relative; + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 2rem; + width: 100%; +} + +.closebtn { + cursor: pointer; + position: absolute; + right: 0; + top: 0; + z-index: 20; + font-size: 1.2rem; + color: #ffffff; + transition: color 0.3s ease; + padding: 0.5rem; + + &:hover { + color: #D14206; + transition: .2s linear; + } +} + +.title{ + font-weight:700; + margin-left:6.5rem; + font-size:1rem; + background: linear-gradient( + 260deg, + rgba(255, 190, 11, 0.84) -29.7%, + rgba(244, 43, 3, 0.84) 128.34% +); +color: transparent; +-webkit-background-clip: text; +background-clip: text; +} + + +.content { + flex: 1; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + text-align: center; + width: 100%; +} + +.loadingContainer { + display: flex; + flex-direction: column; + align-items: center; + gap: 1rem; + color: #f97507; + + p { + margin: 0; + font-size: 1rem; + } +} + +.spinner { + width: 40px; + height: 40px; + border: 3px solid rgba(249, 117, 7, 0.3); + border-top: 3px solid #f97507; + border-radius: 50%; + animation: spin 1s linear infinite; +} + +@keyframes spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } +} + +.errorContainer { + display: flex; + flex-direction: column; + align-items: center; + gap: 1rem; + color: #ff6b6b; + + p { + margin: 0; + font-size: 1rem; + } +} + +.retryBtn { + background: linear-gradient(135deg, #f97507, #ff8c42); + border: none; + border-radius: 8px; + padding: 0.75rem 1.5rem; + color: white; + font-weight: 600; + cursor: pointer; + transition: transform 0.2s ease; + + +} + +.qrContent { + display: flex; + flex-direction: column; + align-items: center; + gap: 1.5rem; + width: 100%; +} + +.qrWrapper { + padding: 1.5rem; + border-radius: 12px; + display: flex; + justify-content: center; + background-color: #ffffff; + align-items: center; + backdrop-filter: blur(10px); +} + +.qrCode { + display: block; +} + +.codeInfo { + display: flex; + flex-direction: column; + align-items: center; + gap: 0.5rem; + background: rgba(250, 250, 250, 0.1); + padding: 1rem; + border-radius: 8px; + width: 100%; +} + +.codeLabel { + margin: 0; + font-size: 0.9rem; + color: #f97507; + font-weight: 600; +} + +.codeValue { + margin: 0; + font-size: 1.2rem; + font-weight: 700; + color: #f97507; + letter-spacing: 1px; + font-family: 'Courier New', monospace; + transition: color 0.2s ease; + + &:hover { + color: #ff8c42; + } +} + +.instruction { + margin: 0; + font-size: 0.9rem; + color: #ccc; + line-height: 1.4; +} + +.noCodeContainer { + display: flex; + flex-direction: column; + align-items: center; + gap: 1rem; + color: #ffa500; + + p { + margin: 0; + font-size: 1rem; + } +} + +.successContainer { + display: flex; + flex-direction: column; + align-items: center; + gap: 1.5rem; + color: #4CAF50; + text-align: center; + + h3 { + margin: 0; + font-size: 1.5rem; + font-weight: 600; + color: #4CAF50; + } + + p { + margin: 0; + font-size: 1rem; + color: #ccc; + } +} + +.successIcon { + font-size: 3rem; + color: #4CAF50; + background: rgba(76, 175, 80, 0.1); + border-radius: 50%; + width: 80px; + height: 80px; + display: flex; + align-items: center; + justify-content: center; + border: 3px solid #4CAF50; +} + +.buttonGroup { + display: flex; + gap: 1rem; + margin-top: 1rem; +} + +.okBtn { + background: linear-gradient(135deg, #4CAF50, #45a049); + border: none; + border-radius: 8px; + padding: 0.75rem 1.5rem; + color: white; + font-weight: 600; + cursor: pointer; + transition: transform 0.2s ease; + + &:hover { + transform: translateY(-2px); + } +} + +.scanNewBtn { + background: linear-gradient(135deg, #f97507, #ff8c42); + border: none; + border-radius: 8px; + padding: 0.75rem 1.5rem; + color: white; + font-weight: 600; + cursor: pointer; + transition: transform 0.2s ease; + + &:hover { + transform: translateY(-2px); + } +} + +// Responsive design +@media (max-width: 768px) { + .qrContainer { + padding: 0.5rem; + } + + .maindiv { + width: 100%; + padding: 1.5rem; + min-height: 350px; + border-radius: 12px; + } + + .title { + font-size: 1.3rem; + } + + .qrWrapper { + padding: 1rem; + } + + .qrCode { + width: 180px; + height: 180px; + } +} + +@media (max-width: 480px) { + .qrContainer { + padding: 0.25rem; + } + + .maindiv { + padding: 1rem; + min-height: 320px; + } + + .title { + font-size: 1.2rem; + } + + .header { + margin-bottom: 1.5rem; + } + + .qrWrapper { + padding: 0.75rem; + } + + .qrCode { + width: 160px; + height: 160px; + } + + .codeInfo { + padding: 0.75rem; + } + + .instruction { + font-size: 0.85rem; + } + + .successContainer { + gap: 1rem; + + h3 { + font-size: 1.3rem; + } + + p { + font-size: 0.9rem; + } + } + + .successIcon { + width: 60px; + height: 60px; + font-size: 2rem; + } + + .buttonGroup { + flex-direction: column; + gap: 0.75rem; + } + + .okBtn, .scanNewBtn { + padding: 0.6rem 1.2rem; + font-size: 0.9rem; + } +} + +@media (max-width: 360px) { + .maindiv { + padding: 0.75rem; + min-height: 300px; + } + + .title { + font-size: 1.1rem; + } + + .qrCode { + width: 140px; + height: 140px; + } +} \ No newline at end of file diff --git a/src/features/Modals/Event/TeamDetailsModal/TeamDetailsModal.jsx b/src/features/Modals/Event/TeamDetailsModal/TeamDetailsModal.jsx new file mode 100644 index 00000000..0315153d --- /dev/null +++ b/src/features/Modals/Event/TeamDetailsModal/TeamDetailsModal.jsx @@ -0,0 +1,221 @@ +import React, { useState, useEffect } from "react"; +import PropTypes from "prop-types"; +import { MdClose, MdGroups, MdPerson, MdEmail, MdSchool, MdCalendarToday } from "react-icons/md"; +import { FaCopy, FaCheck } from "react-icons/fa"; +import { api } from "../../../../services"; +import { Alert, MicroLoading } from "../../../../microInteraction"; +import styles from "./style/TeamDetailsModal.module.scss"; + +const TeamDetailsModal = ({ isOpen, onClose, formId, eventTitle }) => { + const [teamDetails, setTeamDetails] = useState(null); + const [isLoading, setIsLoading] = useState(false); + const [error, setError] = useState(null); + const [copiedCode, setCopiedCode] = useState(false); + + useEffect(() => { + if (isOpen && formId) { + fetchTeamDetails(); + } + }, [isOpen, formId]); + + useEffect(() => { + if (error) { + Alert({ + type: "error", + message: error, + position: "bottom-right", + duration: 3000, + }); + setError(null); + } + }, [error]); + + const fetchTeamDetails = async () => { + try { + setIsLoading(true); + setError(null); + + const response = await api.get(`/api/form/teamDetails/${formId}`, { + headers: { + Authorization: `Bearer ${localStorage.getItem("token")}`, + }, + }); + + if (response.status === 200) { + setTeamDetails(response.data.data); + } else { + setError(response.data.message || "Failed to fetch team details"); + } + } catch (err) { + console.error("Error fetching team details:", err); + setError( + err.response?.data?.message || "Failed to fetch team details. Please try again." + ); + } finally { + setIsLoading(false); + } + }; + + const copyTeamCode = async () => { + try { + await navigator.clipboard.writeText(teamDetails.teamCode); + setCopiedCode(true); + setTimeout(() => setCopiedCode(false), 2000); + + Alert({ + type: "success", + message: "Team code copied to clipboard!", + position: "bottom-right", + duration: 2000, + }); + } catch (err) { + console.error("Failed to copy team code:", err); + setError("Failed to copy team code to clipboard"); + } + }; + + const handleBackdropClick = (e) => { + if (e.target === e.currentTarget) { + onClose(); + } + }; + + if (!isOpen) return null; + + return ( +
+
+
+

Team Details

+ +
+ +
+ {isLoading ? ( +
+ +

Loading team details...

+
+ ) : teamDetails ? ( + <> +
+

{eventTitle || teamDetails.eventTitle}

+
+ +
+
+ +

Team Information

+
+ +
+
+ Team Name: + {teamDetails.teamName} +
+ +
+ Team Code: +
+ {teamDetails.teamCode} + +
+
+ +
+ Team Size: + + {teamDetails.teamSize} / {teamDetails.maxTeamSize} + +
+
+
+ +
+
+ +

Team Members ({teamDetails.members.length})

+
+ +
+ {teamDetails.members.map((member, index) => ( +
+
+ {member.img ? ( + {member.name} + ) : ( +
+ {member.name?.charAt(0)?.toUpperCase() || "?"} +
+ )} +
+ +
+
{member.name || "Unknown"}
+ +
+
+ + {member.email} +
+ + {member.rollNumber && ( +
+ + Roll: {member.rollNumber} +
+ )} + + {member.college && ( +
+ + {member.college} +
+ )} + + {member.year && ( +
+ + Year: {member.year} +
+ )} +
+
+
+ ))} +
+
+ + ) : ( +
+

No team details available

+
+ )} +
+ +
+ +
+
+
+ ); +}; + +TeamDetailsModal.propTypes = { + isOpen: PropTypes.bool.isRequired, + onClose: PropTypes.func.isRequired, + formId: PropTypes.string.isRequired, + eventTitle: PropTypes.string, +}; + +export default TeamDetailsModal; \ No newline at end of file diff --git a/src/features/Modals/Event/TeamDetailsModal/index.jsx b/src/features/Modals/Event/TeamDetailsModal/index.jsx new file mode 100644 index 00000000..4e2040b1 --- /dev/null +++ b/src/features/Modals/Event/TeamDetailsModal/index.jsx @@ -0,0 +1 @@ +export { default } from './TeamDetailsModal'; \ No newline at end of file diff --git a/src/features/Modals/Event/TeamDetailsModal/style/TeamDetailsModal.module.scss b/src/features/Modals/Event/TeamDetailsModal/style/TeamDetailsModal.module.scss new file mode 100644 index 00000000..e82c50f0 --- /dev/null +++ b/src/features/Modals/Event/TeamDetailsModal/style/TeamDetailsModal.module.scss @@ -0,0 +1,373 @@ +.modalOverlay { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: rgba(0, 0, 0, 0.7); + display: flex; + justify-content: center; + align-items: center; + z-index: 1000; + padding: 20px; +} + +.modal { + background: rgb(28, 28, 28); + border-radius: 12px; + max-width: 600px; + width: 100%; + max-height: 90vh; + overflow-y: auto; + scrollbar-width: none; + box-shadow: 0 20px 40px rgba(0, 0, 0, 0.3); + animation: slideIn 0.3s ease-out; +} + +@keyframes slideIn { + from { + opacity: 0; + transform: translateY(-20px) scale(0.95); + } + to { + opacity: 1; + transform: translateY(0) scale(1); + } +} + +.modalHeader { + display: flex; + justify-content: space-between; + align-items: center; + padding: 0px 15px; + border-bottom: 1px solid #000000; + background: linear-gradient(135deg, #f97507 0%, #ff6b35 100%); + color: white; + border-radius: 12px 12px 0 0; + + h2 { + margin: 0; + font-size: 1.5rem; + font-weight: 600; + } +} + +.closeButton { + background: none; + border: none; + color: rgb(0, 0, 0); + cursor: pointer; + padding: 8px ; + border-radius: 50%; + transition: background-color 0.2s; + display: flex; + align-items: center; + justify-content: center; + + &:hover { + background-color: rgba(255, 255, 255, 0.2); + } +} + +.modalContent { + padding: 24px; +} + +.loadingContainer { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: 40px 20px; + text-align: center; + + p { + margin-top: 16px; + color: #6b7280; + font-size: 1rem; + } +} + +.eventInfo { + text-align: center; + margin-bottom: 24px; + padding: 16px; + background: none; + border-radius: 8px; + + h3 { + margin: 0; + background: linear-gradient( + rgba(244, 43, 3, 0.84) 0%, + rgba(255, 190, 11, 0.84) 100% + ); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + font-size: 1.25rem; + font-weight: 600; + } +} + +.teamInfo { + margin-bottom: 24px; + padding: 20px; + background: #232323; + border-radius: 8px; + border: 1px solid #dd5c00; +} + +.teamHeader { + display: flex; + align-items: center; + gap: 12px; + margin-bottom: 16px; + + h4 { + margin: 0; + color: #c8c8c8; + font-size: 1.125rem; + font-weight: 600; + } +} + +.teamDetails { + display: flex; + flex-direction: column; + gap: 16px; +} + +.teamDetailItem { + display: flex; + justify-content: space-between; + align-items: center; + padding: 12px 16px; + background: rgb(29, 29, 29); + border-radius: 6px; + border: 1px solid #585858; + + .label { + font-weight: 600; + color: #777676; + min-width: 100px; + } + + .value { + color: #cc5c06; + font-weight: 500; + } +} + +.teamCodeContainer { + display: flex; + align-items: center; + gap: 12px; +} + +.teamCode { + font-family: 'Courier New', monospace; + font-weight: 600; + color: #f97507; + background: #474747; + padding: 6px 12px; + border-radius: 4px; + border: 1px solid #da7603; + font-size: 0.875rem; +} + +.copyButton { + background: #f97507; + color: white; + border: none; + padding: 8px; + border-radius: 4px; + cursor: pointer; + transition: background-color 0.2s; + display: flex; + align-items: center; + justify-content: center; + + &:hover { + background: #ea580c; + } + + &:active { + transform: scale(0.95); + } +} + +.membersSection { + margin-bottom: 24px; +} + +.membersHeader { + display: flex; + align-items: center; + gap: 12px; + margin-bottom: 16px; + + h4 { + margin: 0; + color: #d3d1d1; + font-size: 1.125rem; + font-weight: 600; + } +} + +.membersList { + display: flex; + flex-direction: column; + gap: 16px; +} + +.memberCard { + display: flex; + gap: 16px; + padding: 16px; + background: #232323; + border-radius: 8px; + border: 1px solid #e27100; + transition: box-shadow 0.2s; + + &:hover { + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); + } +} + +.memberAvatar { + flex-shrink: 0; + width: 60px; + height: 60px; + border-radius: 50%; + overflow: hidden; + border: 2px solid #f97507; + + img { + width: 100%; + height: 100%; + object-fit: cover; + } +} + +.avatarPlaceholder { + width: 100%; + height: 100%; + background: linear-gradient(135deg, #f97507 0%, #ff6b35 100%); + color: white; + display: flex; + align-items: center; + justify-content: center; + font-size: 1.5rem; + font-weight: 600; +} + +.memberInfo { + flex: 1; + min-width: 0; +} + +.memberName { + margin: 0 0 8px 0; + color: #afafaf; + font-size: 1.125rem; + font-weight: 600; +} + +.memberDetails { + display: flex; + flex-direction: column; + gap: 6px; +} + +.memberDetail { + display: flex; + align-items: center; + gap: 8px; + color: #6b7280; + font-size: 0.875rem; + + svg { + color: #9ca3af; + flex-shrink: 0; + } +} + +.errorContainer { + text-align: center; + padding: 40px 20px; + color: #6b7280; + + p { + margin: 0; + font-size: 1rem; + } +} + +.modalFooter { + padding: 20px 24px; + border-top: 1px solid #202020; + display: flex; + justify-content: flex-end; + background: #131313; + border-radius: 0 0 12px 12px; +} + +.closeBtn { + background: #d06202; + color: white; + border: none; + padding: 10px 20px; + border-radius: 6px; + cursor: pointer; + font-size: 0.875rem; + font-weight: 500; + transition: background-color 0.2s; + + &:hover { + background: #be4f01; + } +} + +// Responsive design +@media (max-width: 640px) { + .modal { + max-width: 95vw; + max-height: 65vh; + margin: 10px; + } + + .modalContent { + padding: 16px; + } + + .modalHeader { + padding: 0px 20px; + + h2 { + font-size: 1.25rem; + } + } + + .teamDetailItem { + flex-direction: column; + align-items: flex-start; + gap: 8px; + + .label { + min-width: auto; + } + } + + .memberCard { + flex-direction: column; + text-align: center; + gap: 12px; + } + + .memberAvatar { + align-self: center; + } + + .memberDetails { + align-items: center; + } +} \ No newline at end of file diff --git a/src/features/Modals/Profile/Admin/PreviewForm.jsx b/src/features/Modals/Profile/Admin/PreviewForm.jsx index eec6f48a..1d4ce420 100644 --- a/src/features/Modals/Profile/Admin/PreviewForm.jsx +++ b/src/features/Modals/Profile/Admin/PreviewForm.jsx @@ -163,7 +163,6 @@ const PreviewForm = ({ useEffect(() => { if (isSuccess) { - const participationType = eventData?.participationType; const successMessage = eventData?.successMessage; console.log(participationType); @@ -173,7 +172,7 @@ const PreviewForm = ({ setTeamCode(code); setTeamName(team); } - if (successMessage){ + if (successMessage) { setSuccessMessage(successMessage); } navigate("/Events"); @@ -343,10 +342,9 @@ const PreviewForm = ({ }; const handleSubmit = async () => { - if (!currentSection || !areRequiredFieldsFilled()) { - return; - } + return; + } const formData = new FormData(); const mediaFields = filterMediaFields() || []; @@ -421,7 +419,7 @@ const PreviewForm = ({ setcode(teamCode); // console.log("saved context teamCode:",recoveryCtx.teamCode) } - if (successMessage){ + if (successMessage) { setMessage(successMessage); } // console.log("consoling teamdata:", teamName, teamCode); @@ -489,38 +487,46 @@ const PreviewForm = ({ const renderPaymentScreen = () => { const { eventType, receiverDetails, eventAmount } = formData; - const handleDownloadQR = () => { - const link = document.createElement("a"); - const imageUrl = - typeof receiverDetails.media === "string" - ? receiverDetails.media - : URL.createObjectURL(receiverDetails.media); - - link.href = imageUrl; - link.download = "qr-code.png"; - document.body.appendChild(link); - link.click(); - document.body.removeChild(link); + const handleDownloadQR = async () => { + try { + let imageUrl = + typeof receiverDetails.media === "string" + ? receiverDetails.media + : URL.createObjectURL(receiverDetails.media); + + let blobUrl = imageUrl; + + if (typeof receiverDetails.media === "string") { + const response = await fetch(imageUrl); + const blob = await response.blob(); + blobUrl = URL.createObjectURL(blob); + } + + const link = document.createElement("a"); + link.href = blobUrl; + link.download = "qr-code.png"; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + + if (typeof receiverDetails.media !== "string") { + URL.revokeObjectURL(blobUrl); + } + } catch (error) { + console.error("Error downloading QR code:", error); + alert("Failed to download QR code."); + } }; - const handleShareQR = async () => { - const imageUrl = - typeof receiverDetails.media === "string" - ? receiverDetails.media - : URL.createObjectURL(receiverDetails.media); - - if (navigator.share) { - try { - await navigator.share({ - title: "Payment QR Code", - text: `Make the payment of ₹${eventAmount} using this QR or UPI: ${receiverDetails.upi}`, - url: imageUrl, + const handleCopyUPIID = () => { + if (receiverDetails.upi) { + navigator.clipboard.writeText(receiverDetails.upi) + .then(() => { + alert("UPI ID copied to clipboard!"); + }) + .catch(() => { + alert("Failed to copy UPI ID."); }); - } catch (error) { - console.error("Error sharing:", error); - } - } else { - alert("Share not supported in this browser."); } }; @@ -551,10 +557,10 @@ const PreviewForm = ({ /> )} - {/* ✅ Download & Share Buttons */} + {/* ✅ Download & Copy Buttons */}
- +

Make the payment of{" "} - - ₹{eventAmount} - {" "} - using QR-Code or UPI Id{" "} - {receiverDetails.upi} + ₹{eventAmount}{" "} + using QR-Code or Pay using UPI ID:{" "} + {receiverDetails.upi} (No Refund Policy)

); @@ -733,4 +737,4 @@ const PreviewForm = ({ ); }; -export default PreviewForm; \ No newline at end of file +export default PreviewForm; diff --git a/src/features/Modals/index.jsx b/src/features/Modals/index.jsx index 6f0fc365..cdb77e37 100644 --- a/src/features/Modals/index.jsx +++ b/src/features/Modals/index.jsx @@ -9,9 +9,9 @@ export { default as EventModal } from './Event/EventModal/EventModal'; export { default as LiveEventPopup } from './Event/LiveEventPopup/LiveEventPopup'; export { default as ShareModal } from './Event/ShareModal/ShareModal'; export { default as EventStats } from './Event/EventStats/EventStats'; +export { default as TeamDetailsModal } from './Event/TeamDetailsModal'; // Admin and Form Modals export { default as PreviewForm } from './Profile/Admin/PreviewForm'; export { default as SectionModal } from './Profile/Admin/SectionModal'; - diff --git a/src/index.scss b/src/index.scss index b046cb21..5970d3b3 100644 --- a/src/index.scss +++ b/src/index.scss @@ -35,6 +35,11 @@ body { overflow: hidden; margin-top: 90px; } + +.page.omega-page { + background-color: #000000; +} + .authpage { display: flex; flex-direction: column; diff --git a/src/layouts/Navbar/Navbar.jsx b/src/layouts/Navbar/Navbar.jsx index 435c4f97..896b78bf 100644 --- a/src/layouts/Navbar/Navbar.jsx +++ b/src/layouts/Navbar/Navbar.jsx @@ -16,6 +16,20 @@ const Navbar = () => { const authCtx = useContext(AuthContext); const location = useLocation(); const navigate = useNavigate(); + const isOmegaActive = activeLink === "/omega"; + +useEffect(() => { + if (isOmegaActive) { + document.body.style.backgroundColor = "#000000"; + } else { + document.body.style.backgroundColor = ""; + } + + return () => { + document.body.style.backgroundColor = ""; + }; + }, [isOmegaActive]); + // const handleScroll = () => { // if (window.scrollY > lastScrollY.current) { @@ -79,8 +93,8 @@ useEffect(() => { useEffect(() => { let currentPath = location.pathname; - if (/\/Pixel_AI_Hack|\/Pixel_AI_Hack|\/Pixel_AI_Hack|\/Pixel_AI_Hack/i.test(currentPath)) { - currentPath = "/Pixel_AI_Hack"; // Normalize Pixel_AI_Hack path + if (/\/omega|\/omega|\/omega|\/omega/i.test(currentPath)) { + currentPath = "/omega"; // Normalize omega path } setActiveLink(currentPath); }, [location]); @@ -115,8 +129,7 @@ useEffect(() => { window.removeEventListener("scroll", handleNavbarBlur); }; }, []); - const isOmegaActive = activeLink === "/Omega"; - const isPixel_AI_HackActive = activeLink === "/Pixel_AI_Hack"; + return (