diff --git a/package-lock.json b/package-lock.json index dcfd0b7b..c5098011 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", @@ -1541,20 +1545,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 +1560,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 +1626,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 +1641,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 +1769,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 +1784,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 +1880,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 +1895,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 +1935,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 +1950,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", @@ -3426,6 +3280,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", @@ -3551,6 +3427,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 +3702,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 +3717,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", @@ -4565,36 +4426,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 +4481,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", @@ -4933,6 +4782,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 +4949,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", @@ -5579,21 +5443,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 +5459,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 +6451,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 +7376,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 +7391,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 +7443,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 +7458,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 +7521,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 +7536,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 +7569,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 +7584,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 +7629,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 +7644,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 +7737,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 +7752,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 +7790,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 +7805,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 +7891,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 +7906,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 +7972,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 +7987,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 +8038,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 +8053,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 +8095,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 +8120,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 +8166,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 +8181,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 +8216,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 +8242,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 +8279,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 +8294,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 +10491,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 +10706,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", @@ -11653,6 +11223,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", @@ -11863,6 +11447,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 +11679,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", @@ -13034,6 +12634,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", @@ -13626,6 +13235,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 +13386,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", 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 905dbaa5..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 omega = lazy(() => import("./pages/LiveEvents/omega/omega")); +// const Omega = lazy(() => import("./pages/LiveEvents/Omega/Omega")); + const Signup = lazy(() => import("./pages/Authentication/Signup/Signup")); const ForgotPassword = lazy(() => @@ -59,6 +59,7 @@ 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(); @@ -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/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 62cb381e..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,64 +487,48 @@ const PreviewForm = ({ const renderPaymentScreen = () => { const { eventType, receiverDetails, eventAmount } = formData; -const handleDownloadQR = async () => { - try { - let imageUrl = - typeof receiverDetails.media === "string" - ? receiverDetails.media - : URL.createObjectURL(receiverDetails.media); + const handleDownloadQR = async () => { + try { + let imageUrl = + typeof receiverDetails.media === "string" + ? receiverDetails.media + : URL.createObjectURL(receiverDetails.media); - let blobUrl = imageUrl; + let blobUrl = imageUrl; - if (typeof receiverDetails.media === "string") { - // Fetch image and convert to blob for remote URLs - const response = await fetch(imageUrl); - const blob = await response.blob(); - blobUrl = URL.createObjectURL(blob); - } + 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); + const link = document.createElement("a"); + link.href = blobUrl; + link.download = "qr-code.png"; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); - // Revoke object URL to free memory - if (typeof receiverDetails.media !== "string") { - URL.revokeObjectURL(blobUrl); + if (typeof receiverDetails.media !== "string") { + URL.revokeObjectURL(blobUrl); + } + } catch (error) { + console.error("Error downloading QR code:", error); + alert("Failed to download QR code."); } - } catch (error) { - console.error("Error downloading QR code:", error); - alert("Failed to download QR code."); - } -}; - - -const handleShareQR = () => { - // 🔁 Replace these with your actual values - const upiID = "8709217658@superyes"; // e.g., rudrika123@oksbi - const name = "Mr ANURAG PRASOON"; // e.g., Rudrika - const amount = "89"; // e.g., ₹89 - - // ✅ UPI deep link format - const upiLink = `upi://pay?pa=${encodeURIComponent( - upiID - )}&pn=${encodeURIComponent(name)}&am=${encodeURIComponent( - amount - )}&cu=INR`; - - // 🔁 Optional: Mobile-only guard - if (!/Android|iPhone/i.test(navigator.userAgent)) { - alert("UPI payment redirection works only on mobile devices."); - return; - } - - // 🔗 Redirect to the UPI payment app - window.location.href = upiLink; -}; - + }; + const handleCopyUPIID = () => { + if (receiverDetails.upi) { + navigator.clipboard.writeText(receiverDetails.upi) + .then(() => { + alert("UPI ID copied to clipboard!"); + }) + .catch(() => { + alert("Failed to copy UPI ID."); + }); + } + }; if (eventType === "Paid" && currentSection.name === "Payment Details") { return ( @@ -575,10 +557,10 @@ const handleShareQR = () => { /> )} - {/* ✅ 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)

); @@ -757,4 +737,4 @@ const handleShareQR = () => { ); }; -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/layouts/Navbar/Navbar.jsx b/src/layouts/Navbar/Navbar.jsx index b688a8cd..896b78bf 100644 --- a/src/layouts/Navbar/Navbar.jsx +++ b/src/layouts/Navbar/Navbar.jsx @@ -212,7 +212,7 @@ useEffect(() => { Event -
  • + {/*
  • { > Omega -
  • + */}
  • { const [designation, setDesignation] = useState(""); @@ -26,7 +26,11 @@ const Sidebar = ({ activepage, handleChange }) => { useEffect(() => { const access = authCtx.user.access; - if (access === "ADMIN") { + const email = authCtx.user.email; // Assuming email is available in authCtx.user + + if (email === "attendance@fedkiit.com") { + setDesignation("Attendance Only"); + } else if (access === "ADMIN") { setDesignation("Admin"); } else if (access === "ALUMNI") { setDesignation("Alumni"); @@ -35,7 +39,7 @@ const Sidebar = ({ activepage, handleChange }) => { } else { setDesignation("Member"); } - }, [authCtx.user.access]); + }, [authCtx.user.access, authCtx.user.email]); const handleLogout = () => { navigate("/"); @@ -62,9 +66,40 @@ const Sidebar = ({ activepage, handleChange }) => { setimagePrv(url); }; + // Check if user is attendance-only + const isAttendanceOnly = authCtx.user.email === "attendance@fedkiit.com"; - const renderBlogMenu = () => ( -
    { + const isMobile = window.innerWidth <= 768; + + if (isMobile) { + return ( +
    handleChange("Attendance")} + style={{ + background: + activepage === "Attendance" ? "var(--primary)" : "transparent", + WebkitBackgroundClip: + activepage === "Attendance" ? "text" : "initial", + backgroundClip: activepage === "Attendance" ? "text" : "initial", + color: activepage === "Attendance" ? "transparent" : "inherit", + }} + > + {" "} + Attendance +
    + ); + } + + return ( +
    handleChange("Blogs")} style={{ background: activepage === "Blogs" ? "var(--primary)" : "transparent", @@ -82,7 +117,9 @@ const Sidebar = ({ activepage, handleChange }) => { />{" "} Blogs
    - ) + ); + }; + const renderAdminMenu = () => ( <>
    { />{" "} Form
    - +
    handleChange("Members")} style={{ @@ -143,14 +180,78 @@ const Sidebar = ({ activepage, handleChange }) => { />{" "} Members
    + +
    handleChange("Attendance")} + style={{ + background: + activepage === "Attendance" ? "var(--primary)" : "transparent", + WebkitBackgroundClip: + activepage === "Attendance" ? "text" : "initial", + backgroundClip: activepage === "Attendance" ? "text" : "initial", + color: activepage === "Attendance" ? "transparent" : "inherit", + marginLeft: "-6px", + }} + > + {" "} + Attendance +
    ); + // Render attendance-only menu + const renderAttendanceOnlyMenu = () => ( +
    handleChange("Attendance")} + style={{ + background: activepage === "Attendance" ? "var(--primary)" : "transparent", + WebkitBackgroundClip: activepage === "Attendance" ? "text" : "initial", + backgroundClip: activepage === "Attendance" ? "text" : "initial", + color: activepage === "Attendance" ? "transparent" : "inherit", + }} + > + {" "} + Attendance +
    + ); + + const renderCertificateMenu = () => ( +
    handleChange("Certificates")} + style={{ + background: activepage === "Certificates" ? "var(--primary)" : "transparent", + WebkitBackgroundClip: activepage === "Certificates" ? "text" : "initial", + backgroundClip: activepage === "Certificates" ? "text" : "initial", + color: activepage === "Certificates" ? "transparent" : "inherit", + }} + > + {" "} + Certificates +
    + ); + return ( <>
    - {/* */}
    handleChange("Profile")} @@ -172,7 +273,7 @@ const Sidebar = ({ activepage, handleChange }) => { setFile={setSelectedFile} /> )} - {authCtx.user.access !== "USER" && ( + {authCtx.user.access !== "USER" && !isAttendanceOnly && ( <>
    {

    {designation}

    +
    - {designation === "Admin" && renderAdminMenu() } - {(designation === "Admin" || authCtx.user.access === "SENIOR_EXECUTIVE_CREATIVE") && renderBlogMenu() } - {designation !== "Admin" && ( -
    handleChange("events")} - style={{ color: activepage === "events" ? "#FF8A00" : "white" }} - > - - Event - - -
    - + {isAttendanceOnly ? ( + // Show only Attendance menu for attendance@fedkiit.com + renderAttendanceOnlyMenu() + ) : ( + // Original menu logic for other users + <> + {designation === "Admin" && renderAdminMenu()} + {(designation === "Admin" || + authCtx.user.access === "SENIOR_EXECUTIVE_CREATIVE") && + renderBlogMenu()} + {designation !== "Admin" && ( +
    handleChange("events")} + style={{ color: activepage === "events" ? "#FF8A00" : "white" }} + > + + Event + +
    + )} + {authCtx.user.access !== "USER" && renderCertificateMenu()} + )} + + {/* Logout is always available for all users */}
    { ); }; -export default Sidebar; +export default Sidebar; \ No newline at end of file diff --git a/src/pages/AttendancePage/AttendancePage.jsx b/src/pages/AttendancePage/AttendancePage.jsx new file mode 100644 index 00000000..06486c43 --- /dev/null +++ b/src/pages/AttendancePage/AttendancePage.jsx @@ -0,0 +1,429 @@ +import React, { useState, useEffect, useContext } from "react"; +import { EventCard } from "../../components"; +import { Button } from "../../components/Core"; +import AuthContext from "../../context/AuthContext"; +import { api } from "../../services"; +import styles from "./styles/AttendancePage.module.scss"; +import { IoClose } from "react-icons/io5"; +import { FaDownload } from "react-icons/fa"; +import { Alert, ComponentLoading } from "../../microInteraction"; +import { Html5QrcodeScanner, Html5QrcodeScanType } from "html5-qrcode"; + +const AttendancePage = () => { + const [ongoingEvents, setOngoingEvents] = useState([]); + const [pastEvents, setPastEvents] = useState([]); + const [isLoading, setIsLoading] = useState(true); + const [error, setError] = useState(null); + const [showScanner, setShowScanner] = useState(false); + const [selectedEventId, setSelectedEventId] = useState(null); + const [scanner, setScanner] = useState(null); + const [isScanning, setIsScanning] = useState(false); + const [showSuccessModal, setShowSuccessModal] = useState(false); + const [attendedUser, setAttendedUser] = useState(null); + const [hasShownAlert, setHasShownAlert] = useState(false); + const [isSuccess, setIsSuccess] = useState(false); + const authCtx = useContext(AuthContext); + + useEffect(() => { + const fetchEvents = async () => { + try { + const response = await api.get("/api/form/getAllForms"); + if (response.status === 200) { + const fetchedEvents = response.data.events; + + // sort events by priority, date, and title + const sortedEvents = fetchedEvents.sort((a, b) => { + const priorityA = parseInt(a.info.eventPriority, 10); + const priorityB = parseInt(b.info.eventPriority, 10); + const dateA = new Date(a.info.eventDate); + const dateB = new Date(b.info.eventDate); + const titleA = a.info.eventTitle || ""; + const titleB = b.info.eventTitle || ""; + + if (priorityA !== priorityB) return priorityA - priorityB; + if (dateA.getTime() !== dateB.getTime()) return dateA - dateB; + return titleA.localeCompare(titleB); + }); + + const ongoing = sortedEvents.filter(e => !e.info.isEventPast); + const past = sortedEvents + .filter(e => e.info.isEventPast) + .sort((a, b) => new Date(b.info.eventDate) - new Date(a.info.eventDate)); + + setOngoingEvents(ongoing); + setPastEvents(past); + } else { + setError("Error fetching events"); + } + } catch (err) { + console.error("Error fetching events:", err); + setError("Error fetching events"); + } finally { + setIsLoading(false); + } + }; + fetchEvents(); + }, []); + + const initializeScanner = () => { + try { + const qrScanner = new Html5QrcodeScanner( + "qr-reader", + { + fps: 10, + qrbox: { width: 250, height: 250 }, + aspectRatio: 1, + supportedScanTypes: [Html5QrcodeScanType.SCAN_TYPE_CAMERA] + }, + false + ); + + qrScanner.render(onScanSuccess, onScanFailure); + setScanner(qrScanner); + } catch (error) { + console.error("Error initializing scanner:", error); + if (!hasShownAlert) { + Alert({ + type: "error", + message: "Failed to initialize QR scanner", + position: "top-right", + }); + setHasShownAlert(true); + } + setShowScanner(false); + } + }; + + const onScanSuccess = async (decodedText) => { + setIsScanning(true); + console.log("QR Code scanned successfully:", decodedText); + console.log("Selected Event ID:", selectedEventId); + + try { + // jwt token from qr code + const response = await api.post( + `/api/form/markAttendance`, + { + formId: selectedEventId, + token: decodedText, + }, + { + headers: { + Authorization: `Bearer ${authCtx.token}`, + }, + } + ); + + if (response.status === 200) { + // store user details + setAttendedUser(response.data.user || response.data); + setIsSuccess(true); + if (scanner) { + scanner.clear(); + } + setShowSuccessModal(true); + setIsScanning(false); + + // show success alert + Alert({ + type: "success", + message: "Attendance marked successfully!", + position: "top-right", + }); + + return; // exit early + } + } catch (error) { + console.error("Error marking attendance:", error); + let errorMessage = "Failed to verify QR code"; + + if (error.response?.status === 401) { + errorMessage = "Invalid or expired QR code"; + } else if (error.response?.status === 400) { + errorMessage = error.response?.data?.message || "Invalid request"; + } else if (error.response?.status === 404) { + errorMessage = "Attendance record not found"; + } else if (error.response?.status === 403) { + errorMessage = "You don't have permission to mark attendance"; + } else if (error.response?.data?.message) { + errorMessage = error.response.data.message; + } + + // show error alert + if (!hasShownAlert) { + Alert({ + type: "error", + message: errorMessage, + position: "top-right", + }); + setHasShownAlert(true); + } + } finally { + setIsScanning(false); + } + }; + + const onScanFailure = (error) => { + console.warn(`QR Code scanning failed: ${error}`); + }; + + const handleScanQR = (eventId) => { + setSelectedEventId(eventId); + setShowScanner(true); + setHasShownAlert(false); // reset alert state + setIsSuccess(false); // reset success state + }; + + const handleCloseSuccessModal = () => { + setShowSuccessModal(false); + setAttendedUser(null); + // auto open scanner for next scan + setTimeout(() => { + setShowScanner(true); + setHasShownAlert(false); // reset alert state + setIsSuccess(false); // reset success state + }, 100); + }; + + + + const handleDownloadAttendance = async (eventId) => { + try { + const response = await api.get(`/api/form/export-attendance/${eventId}?format=xlsx`, { + headers: { Authorization: `Bearer ${authCtx.token}` }, + responseType: "blob", + }); + const blob = new Blob([response.data], { type: "text/xlsx" }); + const url = window.URL.createObjectURL(blob); + const link = document.createElement("a"); + link.href = url; + link.setAttribute("download", `attendance_${eventId}.xlsx`); + document.body.appendChild(link); + link.click(); + link.remove(); + window.URL.revokeObjectURL(url); + + Alert({ + type: "success", + message: "Attendance file downloaded successfully!", + position: "top-right", + }); + } catch (error) { + let errorMessage = "Failed to download attendance file"; + + if (error.response?.status === 403) { + errorMessage = "You don't have permission to download attendance data"; + } else if (error.response?.status === 404) { + errorMessage = "Attendance data not found for this event"; + } else if (error.response?.data?.message) { + errorMessage = error.response.data.message; + } + + // show error alert + if (!isSuccess && !hasShownAlert) { + Alert({ + type: "error", + message: errorMessage, + position: "top-right", + }); + setHasShownAlert(true); + } + console.error("Download error:", error); + } + }; + + const renderOngoingActions = (event) => ( +
    + + + +
    + ); + + const renderPastActions = (event) => ( +
    + +
    + ); + + useEffect(() => { + if (showScanner) { + initializeScanner(); + } + return () => { + if (scanner) { + try { + scanner.clear(); + } catch (error) { + console.error("Error clearing scanner in cleanup:", error); + } + } + }; + }, [showScanner]); + + if (isLoading) { + return ( + + ); + } + + if (error) { + return
    {error}
    ; + } + + return ( +
    +

    Event Attendance

    + + {showScanner && ( +
    +
    + +

    Scan QR Code

    +
    + {isScanning && ( +
    +
    Processing QR Code...
    +
    + )} +
    +
    +
    +
    + )} + + {/* Success Modal */} + {showSuccessModal && attendedUser && ( +
    +
    + +
    +
    +

    Attendance Marked Successfully!

    + +
    + +
    +
    +
    +
    + )} + + {/* Ongoing Events */} + {ongoingEvents.length > 0 && ( + <> +

    Ongoing Events

    +
    + {ongoingEvents.map((event) => ( +
    + { }} // fixed + customStyles={{ + eventname: { fontSize: "1.2rem" }, + registerbtn: { width: "8rem", fontSize: ".721rem" }, + eventnamep: { fontSize: "0.7rem" }, + }} + /> +
    + ))} +
    + + )} + + {/* Past Events */} + {pastEvents.length > 0 && ( + <> +

    Past Events

    +
    + {pastEvents.map((event) => ( +
    + { }} // fixed + customStyles={{ + eventname: { fontSize: "1.2rem" }, + registerbtn: { width: "8rem", fontSize: ".721rem" }, + eventnamep: { fontSize: "0.7rem" }, + }} + /> +
    + ))} +
    + + )} +
    + ); +}; + +export default AttendancePage; \ No newline at end of file diff --git a/src/pages/AttendancePage/styles/AttendancePage.module.scss b/src/pages/AttendancePage/styles/AttendancePage.module.scss new file mode 100644 index 00000000..d8031fb0 --- /dev/null +++ b/src/pages/AttendancePage/styles/AttendancePage.module.scss @@ -0,0 +1,196 @@ +.container { + padding: 20px; + + h2 { + color: var(--primary); + margin-bottom: 20px; + } +} + +.eventGrid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); + gap: 20px; + padding: 20px; +} + +.eventWrapper { + position: relative; +} + +.actionButtons { + display: flex; + justify-content: space-between; + gap: 10px; + margin-top: 10px; + padding: 10px; + + button { + flex: 1; + padding: 8px; + border-radius: 4px; + font-size: 14px; + + &:hover { + transform: translateY(-2px); + transition: transform 0.2s ease; + } + + &:last-child { + background: #FF8A00; + color: white; + + &:hover { + background: rgba(255, 138, 0, 0.9); + } + } + } +} + +.scannerModal { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba(0, 0, 0, 0.85); + display: flex; + justify-content: center; + align-items: center; + z-index: 1000; +} + +.scannerContent { + background: #1a1a1a; + padding: 2rem; + border-radius: 10px; + width: 90%; + max-width: 500px; + position: relative; + + .closeButton { + position: absolute; + top: 4px; + right: 6px; + border: none; + border-radius: 50%; + width: 34px; + height: 34px; + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + color: white; + font-size: 1.2rem; + background: transparent; + + &:hover { + color: #D14206; + transition: .2s linear; + + } +} + + .scannerTitle { + color: white; + text-align: center; + margin-bottom: 1rem; + font-size: 1.2rem; + } + + .scannerArea { + border: 2px solid var(--primary); + border-radius: 8px; + overflow: hidden; + margin: 1rem 0; + + #qr-reader { + width: 100%; + + video { + width: 100% !important; + border-radius: 6px; + } + + button { + padding: 8px 16px; + background: var(--primary); + color: white; + border: none; + border-radius: 4px; + margin: 8px; + cursor: pointer; + + &:hover { + opacity: 0.9; + } + } + } + } +} + +.successContent { + text-align: center; + color: white; + + .successIcon { + font-size: 3rem; + color: #FF8A00; + margin-bottom: 1rem; + } + + .successTitle { + color: white; + margin-bottom: 1.5rem; + font-size: 1.3rem; + } + + + + .buttonGroup { + display: flex; + gap: 1rem; + justify-content: center; + margin-top: 2rem; + + button { + min-width: 120px; + border-radius: 6px; + font-weight: 600; + transition: all 0.2s ease; + + + } + } +} + +.scanningOverlay { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba(0, 0, 0, 0.8); + display: flex; + align-items: center; + justify-content: center; + z-index: 10; + border-radius: 8px; + + .scanningText { + color: white; + font-size: 1.1rem; + font-weight: 600; + } +} + +@keyframes fadeInScale { + 0% { + opacity: 0; + transform: scale(0.5); + } + 100% { + opacity: 1; + transform: scale(1); + } +} diff --git a/src/pages/Event/Event.jsx b/src/pages/Event/Event.jsx index fdd7cb6e..6c1accbf 100644 --- a/src/pages/Event/Event.jsx +++ b/src/pages/Event/Event.jsx @@ -190,7 +190,7 @@ const Event = () => { return ( <> -

    Register Yourself for OMEGA 5.0 to Unlock All Three Events Under OMEGA

    + {isOpen && ( )} diff --git a/src/pages/LiveEvents/Omega/Omega.jsx b/src/pages/LiveEvents/Omega/Omega.jsx index e597607a..b45e5dd6 100644 --- a/src/pages/LiveEvents/Omega/Omega.jsx +++ b/src/pages/LiveEvents/Omega/Omega.jsx @@ -1,179 +1,179 @@ -import { useContext, useEffect, useState } from "react"; -import { api } from "../../../services/index.jsx"; -import AuthContext from "../../../context/AuthContext.jsx"; -import { motion } from "framer-motion"; -import { Element } from "react-scroll"; -import { useInView } from "react-intersection-observer"; -import styles from "./styles/Omega.module.scss"; -import Hero from "../../../sections/LiveEvents/Omega/Hero/Hero.jsx"; -import Accordion from "../../../components/LiveEvents/Accordian/Accordian.jsx"; -import data from "../../../data/liveEvents/omega/Accordion.json"; -import Sponsors from "../../../sections/LiveEvents/Omega/Sponsors/Sponsors.jsx"; -import Event from "../../../sections/LiveEvents/Omega/Event/Event.jsx"; -import FedShow from "../../../sections/LiveEvents/Omega/FedShow/FedShow.jsx"; -import TeamImage from "../../../sections/LiveEvents/Omega/TeamImage/TeamImage.jsx"; -import Attend from "../../../sections/LiveEvents/Omega/Attend/Attend.jsx"; -import ChatBot from "../../../features/ChatBot/ChatBot.jsx"; - -function Omega() { - useEffect(() => { - window.scrollTo(0, 0); - }, []); - - useEffect(() => { - const originalBackgroundColor = document.body.style.backgroundColor; - document.body.style.backgroundColor = "#000000"; +// import { useContext, useEffect, useState } from "react"; +// import { api } from "../../../services/index.jsx"; +// import AuthContext from "../../../context/AuthContext.jsx"; +// import { motion } from "framer-motion"; +// import { Element } from "react-scroll"; +// import { useInView } from "react-intersection-observer"; +// import styles from "./styles/Omega.module.scss"; +// import Hero from "../../../sections/LiveEvents/Omega/Hero/Hero.jsx"; +// import Accordion from "../../../components/LiveEvents/Accordian/Accordian.jsx"; +// import data from "../../../data/liveEvents/omega/Accordion.json"; +// import Sponsors from "../../../sections/LiveEvents/Omega/Sponsors/Sponsors.jsx"; +// import Event from "../../../sections/LiveEvents/Omega/Event/Event.jsx"; +// import FedShow from "../../../sections/LiveEvents/Omega/FedShow/FedShow.jsx"; +// import TeamImage from "../../../sections/LiveEvents/Omega/TeamImage/TeamImage.jsx"; +// import Attend from "../../../sections/LiveEvents/Omega/Attend/Attend.jsx"; +// import ChatBot from "../../../features/ChatBot/ChatBot.jsx"; + +// function Omega() { +// useEffect(() => { +// window.scrollTo(0, 0); +// }, []); + +// useEffect(() => { +// const originalBackgroundColor = document.body.style.backgroundColor; +// document.body.style.backgroundColor = "#000000"; - return () => { - document.body.style.backgroundColor = originalBackgroundColor; - }; - }, []); - - const authCtx = useContext(AuthContext); - const [eventName, setEventName] = useState(""); - const [ongoingEvents, setOngoingEvents] = useState([]); - const [isRegisteredInRelatedEvents, setIsRegisteredInRelatedEvents] = - useState(false); - - const { ref: teamImageRef, inView: teamImageInView } = useInView({ - threshold: 0.1, - triggerOnce: true, - }); - - useEffect(() => { - const fetchEvents = async () => { - try { - const response = await api.get("/api/form/getAllForms"); - if (response.status === 200) { - const fetchedEvents = response.data.events; - const sortedEvents = fetchedEvents.sort((a, b) => { - // Extract priority and event dates - const priorityA = parseInt(a.info.eventPriority, 10); - const priorityB = parseInt(b.info.eventPriority, 10); - const dateA = new Date(a.info.eventDate); - const dateB = new Date(b.info.eventDate); - const titleA = a.info.eventTitle || ""; - const titleB = b.info.eventTitle || ""; - - // compare by priority (lower priority first) - if (priorityA !== priorityB) { - return priorityA - priorityB; - } - - // If priorities are the same, compare by date (earliest date first) - if (dateA.getTime() !== dateB.getTime()) { - return dateA.getTime() - dateB.getTime(); - } - - // If both priority and date are the same, compare alphabetically by title - return titleA.localeCompare(titleB); - }); - - // Separate ongoing and past events - const ongoing = sortedEvents.filter( - (event) => !event.info.isEventPast - ); - - // Set state with the sorted events - setOngoingEvents(ongoing); - } else { - console.error("Error fetching events:", response.data.message); - } - } catch (error) { - console.error("Error fetching events:", error); - } - }; - - fetchEvents(); - }, []); - - useEffect(() => { - const eventWithNullRelated = ongoingEvents.find( - (event) => event.info.relatedEvent === "null" - ); - - // Store the event's name or title for display - const eventName = eventWithNullRelated - ? eventWithNullRelated.info.eventTitle - : ""; - setEventName(eventName); - }, [ongoingEvents]); - - useEffect(() => { - const registeredEventIds = authCtx.user.regForm || []; - "Registered Events", registeredEventIds; - - const relatedEventIds = ongoingEvents - .map((event) => event.info.relatedEvent) // Extract relatedEvent IDs - .filter((id) => id !== null && id !== undefined && id !== "null") // Filter out null, undefined, and 'null' - .filter((id, index, self) => self.indexOf(id) === index); // Remove duplicates - - // console.log("Related Event IDs", relatedEventIds); - - let isRegisteredInRelatedEvents = false; - if (registeredEventIds.length > 0 && relatedEventIds.length > 0) { - isRegisteredInRelatedEvents = relatedEventIds.some((relatedEventId) => - registeredEventIds.includes(relatedEventId) - ); - } - - if (isRegisteredInRelatedEvents) { - setIsRegisteredInRelatedEvents(true); - } - }, [ongoingEvents, authCtx.user.regForm]); - - return ( -
    -
    - - { +// document.body.style.backgroundColor = originalBackgroundColor; +// }; +// }, []); + +// const authCtx = useContext(AuthContext); +// const [eventName, setEventName] = useState(""); +// const [ongoingEvents, setOngoingEvents] = useState([]); +// const [isRegisteredInRelatedEvents, setIsRegisteredInRelatedEvents] = +// useState(false); + +// const { ref: teamImageRef, inView: teamImageInView } = useInView({ +// threshold: 0.1, +// triggerOnce: true, +// }); + +// useEffect(() => { +// const fetchEvents = async () => { +// try { +// const response = await api.get("/api/form/getAllForms"); +// if (response.status === 200) { +// const fetchedEvents = response.data.events; +// const sortedEvents = fetchedEvents.sort((a, b) => { +// // Extract priority and event dates +// const priorityA = parseInt(a.info.eventPriority, 10); +// const priorityB = parseInt(b.info.eventPriority, 10); +// const dateA = new Date(a.info.eventDate); +// const dateB = new Date(b.info.eventDate); +// const titleA = a.info.eventTitle || ""; +// const titleB = b.info.eventTitle || ""; + +// // compare by priority (lower priority first) +// if (priorityA !== priorityB) { +// return priorityA - priorityB; +// } + +// // If priorities are the same, compare by date (earliest date first) +// if (dateA.getTime() !== dateB.getTime()) { +// return dateA.getTime() - dateB.getTime(); +// } + +// // If both priority and date are the same, compare alphabetically by title +// return titleA.localeCompare(titleB); +// }); + +// // Separate ongoing and past events +// const ongoing = sortedEvents.filter( +// (event) => !event.info.isEventPast +// ); + +// // Set state with the sorted events +// setOngoingEvents(ongoing); +// } else { +// console.error("Error fetching events:", response.data.message); +// } +// } catch (error) { +// console.error("Error fetching events:", error); +// } +// }; + +// fetchEvents(); +// }, []); + +// useEffect(() => { +// const eventWithNullRelated = ongoingEvents.find( +// (event) => event.info.relatedEvent === "null" +// ); + +// // Store the event's name or title for display +// const eventName = eventWithNullRelated +// ? eventWithNullRelated.info.eventTitle +// : ""; +// setEventName(eventName); +// }, [ongoingEvents]); + +// useEffect(() => { +// const registeredEventIds = authCtx.user.regForm || []; +// "Registered Events", registeredEventIds; + +// const relatedEventIds = ongoingEvents +// .map((event) => event.info.relatedEvent) // Extract relatedEvent IDs +// .filter((id) => id !== null && id !== undefined && id !== "null") // Filter out null, undefined, and 'null' +// .filter((id, index, self) => self.indexOf(id) === index); // Remove duplicates + +// // console.log("Related Event IDs", relatedEventIds); + +// let isRegisteredInRelatedEvents = false; +// if (registeredEventIds.length > 0 && relatedEventIds.length > 0) { +// isRegisteredInRelatedEvents = relatedEventIds.some((relatedEventId) => +// registeredEventIds.includes(relatedEventId) +// ); +// } + +// if (isRegisteredInRelatedEvents) { +// setIsRegisteredInRelatedEvents(true); +// } +// }, [ongoingEvents, authCtx.user.regForm]); + +// return ( +//
    +//
    + +// - - -
    - - - - - - - +// +// +//
    +// +// +// + +// +// +// - - - -
    - -
    -
    - ); -} - -export default Omega; +// > +// +// +// +//
    +// +//
    +//
    +// ); +// } + +// export default Omega; diff --git a/src/pages/LiveEvents/Omega/styles/Omega.module.scss b/src/pages/LiveEvents/Omega/styles/Omega.module.scss index b0aad108..71a0fa66 100644 --- a/src/pages/LiveEvents/Omega/styles/Omega.module.scss +++ b/src/pages/LiveEvents/Omega/styles/Omega.module.scss @@ -2,25 +2,25 @@ -.imageContainer { - height: 100%; - background-image: url('https://ucarecdn.com/376d0a3a-5958-465b-9f2c-69610d307916/'); - background-size: cover; - background-position: center; - background-repeat: no-repeat; -} +// .imageContainer { +// height: 100%; +// background-image: url('https://cdn.prod.website-files.com/6891df87cfba687a7fd80202/6894c43e74ee408d8b7f56db_Group%201171275099%20(1).png'); +// background-size: cover; +// background-position: center; +// background-repeat: no-repeat; +// } - @media (max-width: 480px){ +// @media (max-width: 480px){ -.imageContainer { - height: 100%; +// .imageContainer { +// height: 100%; - background-image: url('https://ucarecdn.com/376d0a3a-5958-465b-9f2c-69610d307916/'); +// background-image: url('https://cdn.prod.website-files.com/6891df87cfba687a7fd80202/6894c43e74ee408d8b7f56db_Group%201171275099%20(1).png'); - background-position: 13% 20%; - background-repeat: no-repeat; -} +// background-position: 13% 20%; +// background-repeat: no-repeat; +// } - } \ No newline at end of file +// } \ No newline at end of file diff --git a/src/pages/Team/Team.jsx b/src/pages/Team/Team.jsx index ce4e195c..796677d8 100644 --- a/src/pages/Team/Team.jsx +++ b/src/pages/Team/Team.jsx @@ -5,12 +5,9 @@ import styles from "./styles/Team.module.scss"; import { TeamCard } from "../../components"; import { FaRegArrowAltCircleRight } from "react-icons/fa"; import useWindowWidth from "../../utils/hooks/useWindowWidth"; -import MemberData from "../../data/Team.json"; -import AccessTypes from "../../data/Access.json"; import { ComponentLoading } from "../../microInteraction"; import { ChatBot } from "../../features"; - const Team = () => { useEffect(() => { window.scrollTo(0, 0); @@ -31,33 +28,24 @@ const Team = () => { const validMembers = response.data.data.filter( (member) => member.name !== null ); + const sortedMembers = validMembers.sort((a, b) => { - if (b.year !== a.year) { - return b.year - a.year; - } + if (b.year !== a.year) return b.year - a.year; return a.name.localeCompare(b.name); }); + setTeamMembers(sortedMembers); } else { - console.error("Error fetching team members:", response.data.message); setError({ message: "Sorry for the inconvenience, we are having issues fetching our Team Members", }); } } catch (error) { - console.error("Error fetching team members:", error); setError({ message: "Sorry for the inconvenience, we are having issues fetching our Team Members", }); - // const testMembers = MemberData.sort((a, b) => { - // if (b.year !== a.year) { - // return b.year - a.year; - // } - // return a.name.localeCompare(b.name); - // }); - // setTeamMembers(testMembers); } finally { setIsLoading(false); } @@ -78,24 +66,12 @@ const Team = () => { message: "Sorry for the inconvenience, we are having issues fetching our Team Members", }); - console.error("Error fetching Access Types:", response.data.message); - // const testAccess = AccessTypes.data; - // const filteredAccess = testAccess.filter( - // (accessType) => !["ADMIN", "USER", "ALUMNI"].includes(accessType) - // ); - // setAccess(filteredAccess); } } catch (error) { setError({ message: "Sorry for the inconvenience, we are having issues fetching our Team Members", }); - console.error("Error fetching Access Types:", error); - // const testAccess = AccessTypes.data; - // const filteredAccess = testAccess.filter( - // (accessType) => !["ADMIN", "USER", "ALUMNI"].includes(accessType) - // ); - // setAccess(filteredAccess); } }; @@ -103,7 +79,7 @@ const Team = () => { fetchTeamMembers(); }, []); - // Define the director access codes in the desired order + const boardAccessCodes = [ "PRESIDENT", "VICEPRESIDENT", @@ -121,7 +97,6 @@ const Team = () => { "DEPUTY_DIRECTOR_HUMAN_RESOURCE", ]; - // Function to extract team name from SENIOR_EXECUTIVE access codes const extractTeamFromAccess = (access) => { if (access.startsWith("SENIOR_EXECUTIVE_")) { return access.replace("SENIOR_EXECUTIVE_", ""); @@ -129,7 +104,6 @@ const Team = () => { return access; }; - // Function to get display role name const getDisplayRole = (access) => { const teamCode = extractTeamFromAccess(access); let role = teamCode @@ -138,8 +112,7 @@ const Team = () => { (word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase() ) .join(" "); - - // Ensure consistent capitalization for role names + switch (role.toLowerCase()) { case "pr and finance": role = "PR And Finance"; @@ -147,33 +120,26 @@ const Team = () => { case "human resource": role = "Human Resource"; break; - // Add other cases if needed for consistent capitalization } return role; }; - // Separate directors from other members const directorsAndAbove = teamMembers .filter((member) => boardAccessCodes.includes(member.access)) - .sort((a, b) => { - const aIndex = boardAccessCodes.indexOf(a.access); - const bIndex = boardAccessCodes.indexOf(b.access); - - return aIndex - bIndex; // Sort by access code order - - // return a.name.localeCompare(b.name); // Sort alphabetically within the same role - }); + .sort( + (a, b) => + boardAccessCodes.indexOf(a.access) - boardAccessCodes.indexOf(b.access) + ); const otherMembers = teamMembers.filter( (member) => !boardAccessCodes.includes(member.access) ); - // Create a role map for non-director roles const roleMap = access.reduce((map, code) => { if (!boardAccessCodes.includes(code)) { const displayRole = getDisplayRole(code); const teamCode = extractTeamFromAccess(code); - + if (!map[displayRole]) { map[displayRole] = []; } @@ -184,26 +150,20 @@ const Team = () => { const teamByRole = Object.keys(roleMap) .map((role) => { - const members = otherMembers.filter((member) => + const members = otherMembers.filter((member) => roleMap[role].includes(member.access) ); - // Sort members: Senior Executives first, then others - const seniorExecutives = members.filter((member) => - member.access.startsWith("SENIOR_EXECUTIVE_") || - member.extra?.designation === "Senior Executive" + const seniorExecutives = members.filter((member) => + member.access.startsWith("SENIOR_EXECUTIVE_") ); - const otherMembersWithoutSenior = members.filter((member) => - !member.access.startsWith("SENIOR_EXECUTIVE_") && - member.extra?.designation !== "Senior Executive" + const others = members.filter( + (member) => !member.access.startsWith("SENIOR_EXECUTIVE_") ); - return { - role, - members: [...seniorExecutives, ...otherMembersWithoutSenior], - }; + return { role, members: [...seniorExecutives, ...others] }; }) - .filter((roleGroup) => roleGroup.members.length > 0) + .filter((group) => group.members.length > 0) .sort((a, b) => { const order = [ "Technical", @@ -216,35 +176,27 @@ const Team = () => { return order.indexOf(a.role) - order.indexOf(b.role); }); - const TeamSection = ({ title, members, isDirector }) => { + const TeamSection = ({ title, members }) => { const membersPerRow = windowWidth < 500 ? 2 : 4; - const remainderMembersCount = members.length % membersPerRow; - const lastRowMembers = - remainderMembersCount > 0 ? members.slice(-remainderMembersCount) : []; - const otherMembers = - remainderMembersCount > 0 - ? members.slice(0, -remainderMembersCount) - : members; + const remainder = members.length % membersPerRow; + + const lastRow = remainder ? members.slice(-remainder) : []; + const mainRows = remainder ? members.slice(0, -remainder) : members; + return ( -
    +
    {title &&

    {title}

    } -
    - {otherMembers.map((member, idx) => ( - + +
    + {mainRows.map((m, idx) => ( + ))}
    - {lastRowMembers.length > 0 && ( + + {lastRow.length > 0 && (
    - {lastRowMembers.map((member, idx) => ( - + {lastRow.map((m, idx) => ( + ))}
    )} @@ -254,7 +206,8 @@ const Team = () => { return (
    - + +

    Meet Our{" "} { Team

    +

    We are a tight-knit community of passionate people devoted to bringing - about vibrant and awe-inspiring changes in the field of - Entrepreneurship. The pillars of our crew are the Marketing group, the - Creative group, the Technical group, and the Operations group. + vibrant and awe-inspiring changes in the field of Entrepreneurship.

    +
    - {/*
    */} {isLoading ? ( ) : ( <> + +
    +
    +
    + FIC +
    + +
    +

    DR. VISHAL PRADHAN

    +

    FACULTY IN CHARGE

    + +
    +

    + "As FIC of FED, my vision is to ignite curiosity, nurture + confidence, and inspire students to rise beyond limits—so + they walk into KIIT as learners and grow into innovators who + shape the world." +

    +
    +
    +
    +
    + {error &&
    {error.message}
    } - + + Board Of + + Directors + + + } + members={directorsAndAbove} +/>
    @@ -304,34 +295,31 @@ const Team = () => {
    - {teamByRole.map( - (section, index) => - section.members.length > 0 && ( - - Team - - {section.role} - - - } - members={section.members} - isDirector={false} - /> - ) - )} + + {teamByRole.map((group, i) => ( + + Team + + {group.role} + + + } + members={group.members} + /> + ))} )}
    ); }; -export default Team; \ No newline at end of file +export default Team; diff --git a/src/pages/Team/styles/Team.module.scss b/src/pages/Team/styles/Team.module.scss index e20c3e79..2989482d 100644 --- a/src/pages/Team/styles/Team.module.scss +++ b/src/pages/Team/styles/Team.module.scss @@ -145,6 +145,139 @@ strong { left: 0; } +//* Outer dark box */ +.FICwrapper { + background: #0d0d0d; /* same as TEAM page background */ + padding: 50px; + border-radius: 20px; + max-width: 1150px; + min-height: 220px; + margin: 30px auto; + box-shadow: 0 0 40px rgba(0, 0, 0, 0.4); + +} + +/* Grid layout */ +.FICsection { + display: grid; + grid-template-columns: 300px 1fr; + gap: 50px; + align-items: center; +} + +/* Left Image */ + .image img { + display: flex; + justify-content: center; /* centers horizontally */ + align-items: center; + width: 180px; + height: 180px; + border-radius: 0%; + object-fit: cover; + box-shadow: 0 10px 40px rgba(255, 138, 0, 0.2); + border: 3px solid rgba(255, 138, 0, 0.4); + transition: transform 0.3s ease, box-shadow 0.3s ease; +} + +.FICsection .image img:hover { + transform: scale(1.05); + box-shadow: 0 15px 60px rgba(255, 138, 0, 0.4); +} + +/* Text Block */ +.textBlock { + text-align: left; /* ensures all text aligns left */ +} + +/* Name */ +.name { + font-size: 32px; + font-weight: 800; + color: #FF8A00; + margin: 0; +} + +/* Role title */ +.role { + font-size: 14px; + font-weight: 600; + letter-spacing: 2px; + color: #FF8A00; + margin-top: 8px; + text-transform: uppercase; +} + +/* Intro & Vision */ +.intro, +.vision { + margin-top: 25px; + font-style: italic +} + +.intro p, +.vision p { + font-size: 16px; + line-height: 1.8; + color: #e0e0e0; + margin: 0; +} + +/* Responsive */ +@media (max-width: 768px) { + .FICsection { + grid-template-columns: 1fr; + text-align: left; + } + + .FICsection .image { + margin-bottom: 20px; + } + + .FICsection .image img { + width: 220px; + height: 220px; + } + + .name { + font-size: 26px; + } +} + +@media (max-width: 480px) { + .FICwrapper { + max-width: 350px; + } + + .FICsection { + grid-template-columns: 1fr; + } + + .FICsection .image { + margin-bottom: 20px; + margin:0 auto; + } + + .FICsection .image img { + width: 150px; + height: 150px; + text-align: center; + } + + .vision { + font-size: 18px; + text-align: center; + } + + .name { + font-size: 22px; + text-align: center; + } + + .role{ + text-align: center; + align-items: center; + } +} /* Responsive styles */ diff --git a/src/sections/LiveEvents/Omega/Attend/Attend.jsx b/src/sections/LiveEvents/Omega/Attend/Attend.jsx index fd0c4ce5..656fedad 100644 --- a/src/sections/LiveEvents/Omega/Attend/Attend.jsx +++ b/src/sections/LiveEvents/Omega/Attend/Attend.jsx @@ -34,10 +34,10 @@ function Attend() {
    - - - - + + + +
    diff --git a/src/sections/LiveEvents/Omega/Attend/styles/Attend.module.scss b/src/sections/LiveEvents/Omega/Attend/styles/Attend.module.scss index 75108445..c7300353 100644 --- a/src/sections/LiveEvents/Omega/Attend/styles/Attend.module.scss +++ b/src/sections/LiveEvents/Omega/Attend/styles/Attend.module.scss @@ -7,7 +7,7 @@ display: flex; flex-direction: column; background-image: - url('https://ucarecdn.com/acba11db-2395-4837-a842-bfa45b1af8ed/'); + url('https://cdn.prod.website-files.com/6891df87cfba687a7fd80202/6894c399bdd958e9c06c9875_events.png'); background-size: cover; background-position: center; diff --git a/src/sections/LiveEvents/Omega/Event/styles/Event.module.scss b/src/sections/LiveEvents/Omega/Event/styles/Event.module.scss index 08049945..f9d3f8e1 100644 --- a/src/sections/LiveEvents/Omega/Event/styles/Event.module.scss +++ b/src/sections/LiveEvents/Omega/Event/styles/Event.module.scss @@ -8,7 +8,7 @@ background-color: black; background-image: - url('https://ucarecdn.com/8e7a7a91-e675-466b-9fa6-2351e2525d4f/'); + url('https://cdn.prod.website-files.com/6891df87cfba687a7fd80202/6894c399bdd958e9c06c9875_events.png'); background-size: cover; background-position: center; background-repeat: no-repeat; diff --git a/src/sections/LiveEvents/Omega/FedShow/FedShow.jsx b/src/sections/LiveEvents/Omega/FedShow/FedShow.jsx index f50886e2..0a32a1a0 100644 --- a/src/sections/LiveEvents/Omega/FedShow/FedShow.jsx +++ b/src/sections/LiveEvents/Omega/FedShow/FedShow.jsx @@ -6,6 +6,8 @@ import { FaCalendarAlt, FaClock, FaMapMarkerAlt } from "react-icons/fa"; import { parse, differenceInMilliseconds } from "date-fns"; import fedShowImg from "../../../../assets/images/fedShow.svg"; import styles from "./styles/FedShow.module.scss"; +import speakersData from "../../../../data/liveEvents/omega/Speakers.json"; + function FedShow() { const [remainingTime, setRemainingTime] = useState(""); @@ -142,9 +144,29 @@ function FedShow() { {remainingTime ? `${remainingTime}` : btnTxt} +
    + +

    + OUR SPEAKERS +

    +
    + + {speakersData.map((speaker, index) => ( +
    + {speaker.name} +

    {speaker.name}

    +

    {speaker.designation}

    +
    + ))} +
    + ); } diff --git a/src/sections/LiveEvents/Omega/FedShow/styles/FedShow.module.scss b/src/sections/LiveEvents/Omega/FedShow/styles/FedShow.module.scss index a1748205..34769efe 100644 --- a/src/sections/LiveEvents/Omega/FedShow/styles/FedShow.module.scss +++ b/src/sections/LiveEvents/Omega/FedShow/styles/FedShow.module.scss @@ -280,3 +280,54 @@ font-size: 85%; } } +.speakersContainer { + display: flex; + flex-wrap: wrap; + gap: 20px; + justify-content: center; // Center the cards in the row +} + +.speakerCard { + width: 250px; + padding: 40px; + border-radius: 10px; + text-align: center; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); +} + +.speakerImage { + width: 100%; + height: auto; + border-radius: 8px; +} + +.speakerName { + font-size: 18px; + margin: 10px 0 5px; + font-weight: bold; +} + +.speakerDesignation { + font-size: 14px; + color: #828282; +} +.heading { + font-size: 2rem; + font-weight: bold; + margin-bottom: 20px; + padding-top: 60px; +} + +.our { + color: white; + padding-right: 2px; +} + +.speakers { + 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; +} \ No newline at end of file diff --git a/src/sections/LiveEvents/Omega/Hero/Hero.jsx b/src/sections/LiveEvents/Omega/Hero/Hero.jsx index 3d6fb302..147062cf 100644 --- a/src/sections/LiveEvents/Omega/Hero/Hero.jsx +++ b/src/sections/LiveEvents/Omega/Hero/Hero.jsx @@ -64,7 +64,7 @@ function Hero({ ongoingEvents, isRegisteredInRelatedEvents, eventName }) { (e) => e.info.relatedEvent === "null" )?.id; if (relatedEventId) { - setNavigatePath(`/Events/${relatedEventId}/Form`); + setNavigatePath(`/Events/6890fd2b2ee5496826b3a5a9/Form`); //hardcoded path for Omega 5.0 setShouldNavigate(true); } setTimeout(() => { @@ -184,7 +184,9 @@ function Hero({ ongoingEvents, isRegisteredInRelatedEvents, eventName }) { ]); return ( +
    + -

    FED PRESENTS

    + +

    FEDKIIT PRESENTS

    @@ -204,10 +207,59 @@ function Hero({ ongoingEvents, isRegisteredInRelatedEvents, eventName }) { style={{ perspective: 1000 }} > Hero + +
    + + + + POWERED BY + + + +
    + Remax Logo + + + +
    + REMAX + TEMPLE CITY +
    +
    + +
    + + + + + +

    Empowering Entrepreneurs, Energizing the Future

    diff --git a/src/sections/LiveEvents/Omega/Sponsors/styles/Sponsors.module.scss b/src/sections/LiveEvents/Omega/Sponsors/styles/Sponsors.module.scss index e5d02119..9831d5af 100644 --- a/src/sections/LiveEvents/Omega/Sponsors/styles/Sponsors.module.scss +++ b/src/sections/LiveEvents/Omega/Sponsors/styles/Sponsors.module.scss @@ -34,11 +34,11 @@ } .sponsor { - margin: 20px; + margin: 40px; } .sponsor img { - max-width: 80px; + max-width: 90px; height: auto; } diff --git a/src/sections/LiveEvents/Omega/TeamImage/TeamImage.jsx b/src/sections/LiveEvents/Omega/TeamImage/TeamImage.jsx index f9923680..36523008 100644 --- a/src/sections/LiveEvents/Omega/TeamImage/TeamImage.jsx +++ b/src/sections/LiveEvents/Omega/TeamImage/TeamImage.jsx @@ -5,7 +5,7 @@ import styles from "./styles/TeamImage.module.scss" const TeamImage = () => { return (
    - +
    ) } diff --git a/src/sections/Profile/Admin/Form/CertificatesForm/CertificatesForm.jsx b/src/sections/Profile/Admin/Form/CertificatesForm/CertificatesForm.jsx index be18fa09..3f36f08f 100644 --- a/src/sections/Profile/Admin/Form/CertificatesForm/CertificatesForm.jsx +++ b/src/sections/Profile/Admin/Form/CertificatesForm/CertificatesForm.jsx @@ -203,7 +203,11 @@ const CertificatesForm = () => { const response = await api.post( "/api/certificate/addCertificateTemplate", - formData + + formData, + { + headers: { Authorization: `Bearer ${authCtx.token}` }, + } ); if (response.status !== 200) { diff --git a/src/sections/Profile/Admin/Form/NewForm/NewForm.jsx b/src/sections/Profile/Admin/Form/NewForm/NewForm.jsx index c7e4b16d..777ceb8d 100644 --- a/src/sections/Profile/Admin/Form/NewForm/NewForm.jsx +++ b/src/sections/Profile/Admin/Form/NewForm/NewForm.jsx @@ -722,6 +722,24 @@ function NewForm() { operator: "match", message: "UTR Number/Transaction ID must contain only numbers", }, + { + _id: nanoid(), + name: "Terms & Conditions", + type: "radio", + value: + "I acknowledge that all payments made are non-refundable once the form is submitted. For any further assistance contact fedkiit@gmail.com", + isRequired: true, + validations: [ + { + _id: nanoid(), + type: "length", + value: 1, + operator: "===", + message: + "You need to agree to the terms and conditions to proceed.", + }, + ], + }, ], }, ], diff --git a/src/sections/Profile/Admin/View/VerifyCertificate/VerifyCertificate.jsx b/src/sections/Profile/Admin/View/VerifyCertificate/VerifyCertificate.jsx index 8f054c7f..4107f771 100644 --- a/src/sections/Profile/Admin/View/VerifyCertificate/VerifyCertificate.jsx +++ b/src/sections/Profile/Admin/View/VerifyCertificate/VerifyCertificate.jsx @@ -129,7 +129,7 @@ const VerifyCertificate = () => { Email: {certificateData.email} - + {/* Event Date: {new Date(certificateData.date).toLocaleDateString("en-US", { @@ -138,7 +138,7 @@ const VerifyCertificate = () => { day: "numeric", })} - + */} diff --git a/src/sections/Profile/Admin/View/VerifyCertificate/styles/VerifyCertificate.module.scss b/src/sections/Profile/Admin/View/VerifyCertificate/styles/VerifyCertificate.module.scss index 7354ccc2..4d730096 100644 --- a/src/sections/Profile/Admin/View/VerifyCertificate/styles/VerifyCertificate.module.scss +++ b/src/sections/Profile/Admin/View/VerifyCertificate/styles/VerifyCertificate.module.scss @@ -50,7 +50,7 @@ $shadow: 0 8px 24px rgba(0, 0, 0, 0.2); align-items: center; img { - max-width: 100%; + max-width: 95%; border-radius: $border-radius; box-shadow: $shadow; border: 2px solid $accent-color; @@ -59,6 +59,13 @@ $shadow: 0 8px 24px rgba(0, 0, 0, 0.2); &:hover { transform: scale(1.02); } + @media(max-width: 390px) { + padding: 0.1rem; + width: 85%; + + + } + } } @@ -69,17 +76,31 @@ $shadow: 0 8px 24px rgba(0, 0, 0, 0.2); padding: 2rem; border-radius: $border-radius; box-shadow: $shadow; - display: flex; + display:inline-flexbox; + width:100%; flex-direction: column; justify-content: space-between; + + @media(max-width: 480px) { + padding: 1.0rem; + margin-top: 2rem; + + } + @media(max-width: 390px) { + padding: 0rem; + width:95%; + margin-left: 9px; + margin-top: 2rem; + + } } .detailsTable { width: 100%; - // margin-bottom: 2rem; + margin-bottom: 2rem; th, td { - padding: 0.75rem; + padding: 0.95rem; text-align: left; } @@ -108,6 +129,10 @@ $shadow: 0 8px 24px rgba(0, 0, 0, 0.2); font-weight: 600; font-size: 1rem; + @media(max-width: 390px) { + padding: 0.1rem; + margin-left: 2px; + } svg { font-size: 1.25rem; } @@ -116,7 +141,7 @@ $shadow: 0 8px 24px rgba(0, 0, 0, 0.2); .downloadBtn { background-color: $accent-color; color: white; - padding: 0.7rem 1.3rem; + padding: 0.5rem 1.2rem; font-size: 1rem; font-weight: 600; border: none; @@ -132,9 +157,10 @@ $shadow: 0 8px 24px rgba(0, 0, 0, 0.2); @media (max-width: 480px) { flex-direction: column; - align-items: flex-start; + align-items:center; gap: 1rem; } + } .loadingContainer, .errorContainer { diff --git a/src/sections/Profile/General/CertificatesView/CertificatesView.jsx b/src/sections/Profile/General/CertificatesView/CertificatesView.jsx index 6ff3c47c..27c706c4 100644 --- a/src/sections/Profile/General/CertificatesView/CertificatesView.jsx +++ b/src/sections/Profile/General/CertificatesView/CertificatesView.jsx @@ -16,6 +16,7 @@ const Events = () => { const analyticsPath = "/profile/events/Analytics"; const createCertificatesPath = "/profile/events/createCertificates"; const viewCertificatesPath = "/profile/events/viewCertificates"; + const analyticsAccessRoles = [ "PRESIDENT", diff --git a/src/sections/Profile/General/CertificatesView/styles/CertificatesView.module.scss b/src/sections/Profile/General/CertificatesView/styles/CertificatesView.module.scss index a6e25039..ee19232a 100644 --- a/src/sections/Profile/General/CertificatesView/styles/CertificatesView.module.scss +++ b/src/sections/Profile/General/CertificatesView/styles/CertificatesView.module.scss @@ -1,5 +1,5 @@ .participatedEvents { - color: #ffffff; + color: #e2e2e2; font-family: rubik; font-weight: 300; display: flex;