From 9e266e2e1c7d90b8de9ccc5b442bf466b8f8f2a9 Mon Sep 17 00:00:00 2001 From: sagar takle Date: Fri, 31 Jan 2025 19:38:07 +0530 Subject: [PATCH 1/5] Task #234321 fix: [FE] Teacher Page - Design & API Integration (#145) * Task #234321 fix: Teacher Page - Design & API Integration * Task #234321 fix: Teacher ui changes * Task #234321 fix: [FE] Teacher Page - Design & API Integration * fix:UI of subject filter * fix: student search + sort + filter by subject --------- Co-authored-by: deepali chavhan Co-authored-by: sagar --- package-lock.json | 272 +++++++++++++++++- public/locales/en/translation.json | 70 +++-- src/App.jsx | 10 +- src/components/common/ActionSheet.tsx | 48 ++++ src/components/common/cards/ClassCard.tsx | 121 ++++++++ src/components/common/cards/SubjectGrid.tsx | 170 +++++++++++ src/components/common/icons/Icon.tsx | 10 + .../common/layout/BottomComponent.tsx | 2 +- src/components/common/layout/Header.tsx | 169 +++++------ src/components/common/layout/layout.tsx | 13 +- src/pages/Home.tsx | 6 +- src/pages/leaderboard/LeaderBoardScreen.tsx | 95 +++++- src/pages/teacher/ClassDetails.tsx | 99 +++++++ src/pages/teacher/TeacherPage.tsx | 135 +++++++++ src/pages/teacher/class/Students.tsx | 252 ++++++++++++++++ src/pages/videos/SearchPage.tsx | 1 + src/pages/videos/WatchScreen.tsx | 4 + src/routes/teacherAuth.tsx | 19 ++ src/services/home.ts | 78 +++-- src/services/utilService.ts | 3 + src/utils/constants/url-constants.json | 8 +- src/utils/theme.tsx | 1 + 22 files changed, 1413 insertions(+), 173 deletions(-) create mode 100644 src/components/common/ActionSheet.tsx create mode 100644 src/components/common/cards/ClassCard.tsx create mode 100644 src/components/common/cards/SubjectGrid.tsx create mode 100644 src/pages/teacher/ClassDetails.tsx create mode 100644 src/pages/teacher/TeacherPage.tsx create mode 100644 src/pages/teacher/class/Students.tsx create mode 100644 src/routes/teacherAuth.tsx diff --git a/package-lock.json b/package-lock.json index 01ddfb7..72c6cee 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,18 +14,29 @@ "@chakra-ui/system": "^2.6.2", "@emotion/react": "^11.13.3", "@emotion/styled": "^11.13.0", - "@reduxjs/toolkit": "^2.2.7", + "@fingerprintjs/fingerprintjs": "^4.5.1", + "@fontsource/inter": "^5.1.0", + "@reduxjs/toolkit": "^2.5.1", + "@sentry/react": "^8.41.0", "@types/react-router-dom": "^5.3.3", "apexcharts": "^3.54.0", "axios": "^1.7.7", "chakra-react-select": "^4.9.2", "embla-carousel-react": "^8.3.1", "framer-motion": "^11.11.10", + "i18next": "^23.16.4", + "is-mobile": "^5.0.0", "json-schema": "^0.4.0", + "jwt-decode": "^4.0.0", + "lodash": "^4.17.21", + "moment": "^2.30.1", "react": "^18.3.1", "react-apexcharts": "^1.4.1", "react-dom": "^18.3.1", + "react-i18next": "^15.1.1", "react-intersection-observer": "^9.13.1", + "react-modal": "^3.16.1", + "react-redux": "^9.2.0", "react-router-dom": "^6.27.0", "react-slick": "^0.30.2", "react-spring": "^9.7.4", @@ -36,7 +47,7 @@ "devDependencies": { "@eslint/js": "^9.13.0", "@types/node": "^22.9.0", - "@types/react": "^18.3.11", + "@types/react": "^18.3.12", "@types/react-dom": "^18.3.1", "@vitejs/plugin-react": "^4.3.3", "eslint": "^9.13.0", @@ -2883,6 +2894,14 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/@fingerprintjs/fingerprintjs": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@fingerprintjs/fingerprintjs/-/fingerprintjs-4.5.1.tgz", + "integrity": "sha512-hKJaRoLHNeUUPhb+Md3pTlY/Js2YR4aXjroaDHpxrjoM8kGnEFyZVZxXo6l3gRyKnQN52Uoqsycd3M73eCdMzw==", + "dependencies": { + "tslib": "^2.4.1" + } + }, "node_modules/@floating-ui/core": { "version": "1.6.8", "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.8.tgz", @@ -2905,6 +2924,11 @@ "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.8.tgz", "integrity": "sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==" }, + "node_modules/@fontsource/inter": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@fontsource/inter/-/inter-5.1.1.tgz", + "integrity": "sha512-weN3E+rq0Xb3Z93VHJ+Rc7WOQX9ETJPTAJ+gDcaMHtjft67L58sfS65rAjC5tZUXQ2FdZ/V1/sSzCwZ6v05kJw==" + }, "node_modules/@humanfs/core": { "version": "0.19.0", "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.0.tgz", @@ -3703,9 +3727,9 @@ } }, "node_modules/@reduxjs/toolkit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.3.0.tgz", - "integrity": "sha512-WC7Yd6cNGfHx8zf+iu+Q1UPTfEcXhQ+ATi7CV1hlrSAaQBdlPzg7Ww/wJHNQem7qG9rxmWoFCDCPubSvFObGzA==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.5.1.tgz", + "integrity": "sha512-UHhy3p0oUpdhnSxyDjaRDYaw8Xra75UiLbCiRozVPHjfDwNYkh0TsVm/1OmTW8Md+iDAJmYPWUKMvsMc2GtpNg==", "dependencies": { "immer": "^10.0.3", "redux": "^5.0.1", @@ -3713,7 +3737,7 @@ "reselect": "^5.1.0" }, "peerDependencies": { - "react": "^16.9.0 || ^17.0.0 || ^18", + "react": "^16.9.0 || ^17.0.0 || ^18 || ^19", "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0" }, "peerDependenciesMeta": { @@ -4034,6 +4058,91 @@ "win32" ] }, + "node_modules/@sentry-internal/browser-utils": { + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/browser-utils/-/browser-utils-8.52.0.tgz", + "integrity": "sha512-ojFldpRpGrgacIQMbbMZeqLYetNJJ61n+Pz29FpggaIRrbkq84ocoy4FCy+9BuLo6ywgxtUFrjOXD9pPRcZtUA==", + "dependencies": { + "@sentry/core": "8.52.0" + }, + "engines": { + "node": ">=14.18" + } + }, + "node_modules/@sentry-internal/feedback": { + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-8.52.0.tgz", + "integrity": "sha512-r62Ufg4uGlvQsQ+nRSiq9y0ieVFRlZvUaoT/zMjmPuMg29O9rRAMdPJuiCpBH4++x8KJoJ9c2HBRizn6/3uc5Q==", + "dependencies": { + "@sentry/core": "8.52.0" + }, + "engines": { + "node": ">=14.18" + } + }, + "node_modules/@sentry-internal/replay": { + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/replay/-/replay-8.52.0.tgz", + "integrity": "sha512-b4hQPni1G2tcV5XuAPSV4RTX3vqPXO9RfUXLuTBzOTNzBHDoj8nQv0yVvcysGy5tBAuVRo5ya5A+PG/iC6FA9A==", + "dependencies": { + "@sentry-internal/browser-utils": "8.52.0", + "@sentry/core": "8.52.0" + }, + "engines": { + "node": ">=14.18" + } + }, + "node_modules/@sentry-internal/replay-canvas": { + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-8.52.0.tgz", + "integrity": "sha512-4ES2uCUb9yEO1cbg15UBqiYU/syQYj5GviI+TvYvnPX3I8K2mK941ZRqfHh2HpFMhMxLgfX4jDqDGizNhXWdqg==", + "dependencies": { + "@sentry-internal/replay": "8.52.0", + "@sentry/core": "8.52.0" + }, + "engines": { + "node": ">=14.18" + } + }, + "node_modules/@sentry/browser": { + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-8.52.0.tgz", + "integrity": "sha512-7JpJ9zpInozBzy61eJf/6RPHoKUCFcoFuKd9rttkN1gyY9xkU1cQK+x1f0deiIHnF9ydftmDtXW+kGFI/+xqtw==", + "dependencies": { + "@sentry-internal/browser-utils": "8.52.0", + "@sentry-internal/feedback": "8.52.0", + "@sentry-internal/replay": "8.52.0", + "@sentry-internal/replay-canvas": "8.52.0", + "@sentry/core": "8.52.0" + }, + "engines": { + "node": ">=14.18" + } + }, + "node_modules/@sentry/core": { + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-8.52.0.tgz", + "integrity": "sha512-2j3B7IKmseTKFm6AyheJ+RSgXqIsx+3blFSuxpkdvsEt60Lbzva2uDkCENfBDOclioo1kvHgsyuXLfWW4A+wwA==", + "engines": { + "node": ">=14.18" + } + }, + "node_modules/@sentry/react": { + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@sentry/react/-/react-8.52.0.tgz", + "integrity": "sha512-7tbRuTFOgKLM2fM5/TjrfDWbkqOOsxkb2QldnAUHTAcArIx77DpsurAgEx5L9lqn+UAhuw1X2IGbzk9fVV/ZDQ==", + "dependencies": { + "@sentry/browser": "8.52.0", + "@sentry/core": "8.52.0", + "hoist-non-react-statics": "^3.3.2" + }, + "engines": { + "node": ">=14.18" + }, + "peerDependencies": { + "react": "^16.14.0 || 17.x || 18.x || 19.x" + } + }, "node_modules/@sinclair/typebox": { "version": "0.27.8", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", @@ -4275,6 +4384,11 @@ "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", "dev": true }, + "node_modules/@types/use-sync-external-store": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz", + "integrity": "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==" + }, "node_modules/@types/webxr": { "version": "0.5.20", "resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.5.20.tgz", @@ -6333,6 +6447,11 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, + "node_modules/exenv": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/exenv/-/exenv-1.2.2.tgz", + "integrity": "sha512-Z+ktTxTwv9ILfgKCk32OX3n/doe+OcLTRtqK9pcL+JsP3J1/VW8Uvl4ZjLlKqeW4rzK4oesDOGMEMRIZqtP4Iw==" + }, "node_modules/exponential-backoff": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", @@ -7002,6 +7121,14 @@ "react-is": "^16.7.0" } }, + "node_modules/html-parse-stringify": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz", + "integrity": "sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==", + "dependencies": { + "void-elements": "3.1.0" + } + }, "node_modules/http-errors": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", @@ -7036,6 +7163,28 @@ "node": ">=10.17.0" } }, + "node_modules/i18next": { + "version": "23.16.8", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.16.8.tgz", + "integrity": "sha512-06r/TitrM88Mg5FdUXAKL96dJMzgqLE5dv3ryBAra4KCwD9mJ4ndOTS95ZuymIGoE+2hzfdaMak2X11/es7ZWg==", + "funding": [ + { + "type": "individual", + "url": "https://locize.com" + }, + { + "type": "individual", + "url": "https://locize.com/i18next.html" + }, + { + "type": "individual", + "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" + } + ], + "dependencies": { + "@babel/runtime": "^7.23.2" + } + }, "node_modules/idb": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", @@ -7368,6 +7517,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-mobile": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-mobile/-/is-mobile-5.0.0.tgz", + "integrity": "sha512-Tz/yndySvLAEXh+Uk8liFCxOwVH6YutuR74utvOcu7I9Di+DwM0mtdPVZNaVvvBUM2OXxne/NhOs1zAO7riusQ==" + }, "node_modules/is-module": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", @@ -8039,6 +8193,14 @@ "node": ">=4.0" } }, + "node_modules/jwt-decode": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-4.0.0.tgz", + "integrity": "sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==", + "engines": { + "node": ">=18" + } + }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -8146,8 +8308,7 @@ "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "node_modules/lodash.debounce": { "version": "4.0.8", @@ -8781,6 +8942,14 @@ "mkdirp": "bin/cmd.js" } }, + "node_modules/moment": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", + "engines": { + "node": "*" + } + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -9586,6 +9755,27 @@ } } }, + "node_modules/react-i18next": { + "version": "15.4.0", + "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-15.4.0.tgz", + "integrity": "sha512-Py6UkX3zV08RTvL6ZANRoBh9sL/ne6rQq79XlkHEdd82cZr2H9usbWpUNVadJntIZP2pu3M2rL1CN+5rQYfYFw==", + "dependencies": { + "@babel/runtime": "^7.25.0", + "html-parse-stringify": "^3.0.1" + }, + "peerDependencies": { + "i18next": ">= 23.2.3", + "react": ">= 16.8.0" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, "node_modules/react-intersection-observer": { "version": "9.13.1", "resolved": "https://registry.npmjs.org/react-intersection-observer/-/react-intersection-observer-9.13.1.tgz", @@ -9661,6 +9851,26 @@ "react": "^18.3.1" } }, + "node_modules/react-lifecycles-compat": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" + }, + "node_modules/react-modal": { + "version": "3.16.3", + "resolved": "https://registry.npmjs.org/react-modal/-/react-modal-3.16.3.tgz", + "integrity": "sha512-yCYRJB5YkeQDQlTt17WGAgFJ7jr2QYcWa1SHqZ3PluDmnKJ/7+tVU+E6uKyZ0nODaeEj+xCpK4LcSnKXLMC0Nw==", + "dependencies": { + "exenv": "^1.2.0", + "prop-types": "^15.7.2", + "react-lifecycles-compat": "^3.0.0", + "warning": "^4.0.3" + }, + "peerDependencies": { + "react": "^0.14.0 || ^15.0.0 || ^16 || ^17 || ^18 || ^19", + "react-dom": "^0.14.0 || ^15.0.0 || ^16 || ^17 || ^18 || ^19" + } + }, "node_modules/react-native": { "version": "0.76.0", "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.76.0.tgz", @@ -9774,6 +9984,28 @@ "loose-envify": "^1.1.0" } }, + "node_modules/react-redux": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.2.0.tgz", + "integrity": "sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g==", + "dependencies": { + "@types/use-sync-external-store": "^0.0.6", + "use-sync-external-store": "^1.4.0" + }, + "peerDependencies": { + "@types/react": "^18.2.25 || ^19", + "react": "^18.0 || ^19", + "redux": "^5.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "redux": { + "optional": true + } + } + }, "node_modules/react-refresh": { "version": "0.14.2", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", @@ -11531,6 +11763,14 @@ } } }, + "node_modules/use-sync-external-store": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.4.0.tgz", + "integrity": "sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -11641,6 +11881,14 @@ "integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==", "peer": true }, + "node_modules/void-elements": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", + "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/walker": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", @@ -11650,6 +11898,14 @@ "makeerror": "1.0.12" } }, + "node_modules/warning": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", diff --git a/public/locales/en/translation.json b/public/locales/en/translation.json index e7c3f5a..cabd96c 100644 --- a/public/locales/en/translation.json +++ b/public/locales/en/translation.json @@ -7,16 +7,16 @@ "LOGIN_FORGOT_PASSWORD": "FORGOT PASSWORD?", "LOGIN_YOUR_PASSWORD_IS_CREATED_IN_THE_FORMAT_AS_SHOWN_BELOW": "Your password is created in the format as shown below", "LOGIN_PASSWORD_EXAMPLE_EXPLANATION_KA": "If your name is Anish Kumar, and your date of birth is 30-12-1988, then your password will be ", - "LOGIN_USERNAME_EXAMPLE_EXPLANATION_KA" : "If your name is Anish Kumar, and your date of birth is 30-12-1988, then your password will be ", + "LOGIN_USERNAME_EXAMPLE_EXPLANATION_KA": "If your name is Anish Kumar, and your date of birth is 30-12-1988, then your password will be ", "LOGIN_ENTER_USER_NAME": "Enter Username", "LOGIN_FORGOT_USERNAME": "FORGOT USERNAME?", "LOGIN_YOUR_USERNAME_IS_CREATED_IN_THE_FORMAT_AS_SHOWN_BELOW": "Your username is created in the format as shown below", "LOGIN_USERNAME": "Username", "LOGIN_PASSWORD": "Password", "LOGIN": "LOGIN", - "LOGIN_INVALID_PASSWORD" : "Incorrect password", - "LOGIN_INVALID_USER_NAME" : "Incorrect username", - "LOGIN_REQUIRED_FIELD" : "This is Required Field", + "LOGIN_INVALID_PASSWORD": "Incorrect password", + "LOGIN_INVALID_USER_NAME": "Incorrect username", + "LOGIN_REQUIRED_FIELD": "This is Required Field", "POPUP_FIRST_TWO_LETTERS_OF_YOUR_FIRST_NAME": "First 2 letters of your first name", "POPUP_FIRST_TWO_LETTERS_OF_YOUR_LAST_NAME": "First 2 letters of your last name", @@ -29,32 +29,42 @@ "HOME_LEARN_SOMETHING_NOW": "Learn Something Now", "HOME_SEARCH": "Search...", "HOME_WATCH": "WATCH", - "POPUP_CONFIRM_LOGOUT" : "LOGGING OUT ?", - "POPUP_CONFIRM_MSG" : "Don’t worry, your progress will be saved the next time you log back in.", - "POPUP_LOGOUT" : "LOGOUT", - "HOME_NO_VIDEOS_AVAILABLE" : "No Videos Availabe to show", - "SEE_ALL_RESULTS" : "See all results", - "NO_PROGRAM_FOUND" : "No active program available at the moment. Please check back later or contact system administrator", - "NO_SCHOOL_FOUND" : "Your profile is not mapped to any school. Please contact system administrator.", - "NO_BOARD_FOUND" : "Your profile is not mapped to any board. Please contact system administrator.", - "NO_CLASS_FOUND" : "Your profile is not mapped to any class. Please contact system administrator.", - "LEADERBOARD" : "LEADERBOARD", - "LEADERBOARD_NAME" : "NAME", + "POPUP_CONFIRM_LOGOUT": "LOGGING OUT ?", + "POPUP_CONFIRM_MSG": "Don’t worry, your progress will be saved the next time you log back in.", + "POPUP_LOGOUT": "LOGOUT", + "HOME_NO_VIDEOS_AVAILABLE": "No Videos Availabe to show", + "SEE_ALL_RESULTS": "See all results", + "NO_PROGRAM_FOUND": "No active program available at the moment. Please check back later or contact system administrator", + "NO_SCHOOL_FOUND": "Your profile is not mapped to any school. Please contact system administrator.", + "NO_BOARD_FOUND": "Your profile is not mapped to any board. Please contact system administrator.", + "NO_CLASS_FOUND": "Your profile is not mapped to any class. Please contact system administrator.", + "LEADERBOARD": "LEADERBOARD", + "LEADERBOARD_NAME": "NAME", "LEADERBOARD_RANK": "RANK", - "LEADERBOARD_COINS" : "COINS", - "LEADERBOARD_YOUR_COINS" : "YOUR COINS", - "LEADERBOARD_YOUR_RANK" : "YOUR RANK", - "LEADERBOARD_VIEW_HISTORY" : "View History", - "LEADERBOARD_COINS_HISTORY" : "Coins History", - "LEADERBOARD_CLOSE" : "Close", - "LEADERBOARD_CONIS_FOR_QUIZ" : "coins for quiz", - "LEADERBOARD_VIEW" : "View", + "LEADERBOARD_COINS": "COINS", + "LEADERBOARD_YOUR_COINS": "YOUR COINS", + "LEADERBOARD_YOUR_RANK": "YOUR RANK", + "LEADERBOARD_VIEW_HISTORY": "View History", + "LEADERBOARD_COINS_HISTORY": "Coins History", + "LEADERBOARD_CLOSE": "Close", + "LEADERBOARD_CONIS_FOR_QUIZ": "coins for quiz", + "LEADERBOARD_VIEW": "View", "LEADERBOARD_HOW_YOU_STAND_WITH_OTHER": "See how you stand with others", - "LEADERBOARD_SCHOOL" : "School", - "LEADERBOARD_CLASS" : "Class", - "LEADERBOARD_BOARD" : "Board", - "LEADERBOARD_DEFAULT" : "(default)", - "LEADERBOARD_APPLY" : "Apply", - "HOME_RECENTLY_SEARCHED" : "RECENTLY SEARCHED" - + "LEADERBOARD_SCHOOL": "School", + "LEADERBOARD_CLASS": "Class", + "LEADERBOARD_BOARD": "Board", + "LEADERBOARD_DEFAULT": "(default)", + "LEADERBOARD_APPLY": "Apply", + "HOME_RECENTLY_SEARCHED": "RECENTLY SEARCHED", + "TEACHER_PAGE_VIEW_YOUR_IMPACT": "View your impact!", + "TEACHER_OVERALL_PROGRESS": "OVERALL PROGRESS", + "TEACHER_STUDENT_PROGRESS": "Student Progress", + "TEACHER_COMPLETION_RATE": "COMPLETION RATE", + "TEACHER_SEARCH_STUDENT": "Search student", + "TEACHER_SORT": "SORT", + "TEACHER_A_Z": "A-Z", + "TEACHER_Z_A": "Z-A", + "TEACHER_COMPLETIOIN_RATE_HIGH": "Completion Rate (High - Low)", + "TEACHER_COMPLETIOIN_RATE_LOW": "Completion Rate (Low - High)", + "TEACHER_APPLY": "APPLY" } diff --git a/src/App.jsx b/src/App.jsx index be9b682..614073a 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -13,6 +13,8 @@ import Loading from "./components/common/Loading"; import customTheme from "./utils/theme"; import FingerprintJS from "@fingerprintjs/fingerprintjs"; import { checkUserDetails } from "./services/auth/auth"; +import teacherAuthRoutes from "./routes/teacherAuth"; +import { jwtDecode } from "jwt-decode"; const theme = extendTheme(customTheme); @@ -24,7 +26,13 @@ function AppRouter() { const navigate = useNavigate(); useEffect(() => { if (token && token !== "not-logged-in") { - setRoutes(authRoutes); + const tokenDecoded = jwtDecode(token); + const roles = tokenDecoded?.resource_access?.["hasura-app"]?.roles; + if (authUser && Array.isArray(roles) && roles.includes("teacher")) { + setRoutes(teacherAuthRoutes); + } else if (authRoutes) { + setRoutes(authRoutes); + } } else { setRoutes(guestRoutes); } diff --git a/src/components/common/ActionSheet.tsx b/src/components/common/ActionSheet.tsx new file mode 100644 index 0000000..79c8344 --- /dev/null +++ b/src/components/common/ActionSheet.tsx @@ -0,0 +1,48 @@ +import React, { ReactNode, memo } from "react"; +import { + Drawer, + DrawerOverlay, + DrawerContent, + DrawerCloseButton, + DrawerHeader, + DrawerBody, +} from "@chakra-ui/react"; +import useDeviceSize from "./layout/useDeviceSize"; +import IconByName from "./icons/Icon"; + +type RectComponentProps = { + isOpen: boolean; + onClose: () => void; + headerComponent?: ReactNode; + children?: ReactNode; +}; + +const ActionSheet: React.FC = memo( + ({ isOpen, onClose, headerComponent, children }) => { + const { width } = useDeviceSize(); + + return ( + + + + + {headerComponent && {headerComponent}} + {children} + + + ); + } +); + +export default ActionSheet; diff --git a/src/components/common/cards/ClassCard.tsx b/src/components/common/cards/ClassCard.tsx new file mode 100644 index 0000000..2ea3138 --- /dev/null +++ b/src/components/common/cards/ClassCard.tsx @@ -0,0 +1,121 @@ +import React, { memo } from "react"; +import { Box, Progress, Text, HStack, VStack } from "@chakra-ui/react"; +import IconByName from "../icons/Icon"; +import { useTranslation } from "react-i18next"; +import SubjectGrid from "./SubjectGrid"; +import { use } from "i18next"; + +interface ClassCardProps { + title: boolean; + selectedSubject?: string | null; + subjectClick?: (subject: string) => void; + data: any; + onClick?: () => void; +} + +const ClassCard: React.FC = memo( + ({ title, data, onClick, subjectClick, selectedSubject }) => { + const { t } = useTranslation(); + const [selectedSubjectNew, setSelectedSubject] = React.useState< + string | undefined + >(undefined); + + React.useEffect(() => { + setSelectedSubject(selectedSubject || ""); + }, [selectedSubject]); + + const onSelectSubject = (subject: string) => { + setSelectedSubject(subject); + subjectClick?.(subject); + }; + return ( + + + {/* Class Header */} + {title && ( + + + + {data?.title} + + + + + + {t("TEACHER_OVERALL_PROGRESS")} + + + {/* Overall Progress Bar with Percentage */} + + + + + + {data?.classCompletionPercentage} + + + % + + + + + )} + + + + ); + } +); + +export default ClassCard; diff --git a/src/components/common/cards/SubjectGrid.tsx b/src/components/common/cards/SubjectGrid.tsx new file mode 100644 index 0000000..ffaf516 --- /dev/null +++ b/src/components/common/cards/SubjectGrid.tsx @@ -0,0 +1,170 @@ +import { HStack, Image, Progress, VStack } from "@chakra-ui/react"; +import React, { memo } from "react"; +import english from "../../../assets/icons/english_icon.svg"; +import kannada from "../../../assets/icons/kannada_icon.svg"; +import math from "../../../assets/icons/maths_icon.svg"; +import odia from "../../../assets/icons/odiya_icon.svg"; +import physics from "../../../assets/icons/physics_icon.svg"; +import IconByName from "../icons/Icon"; +import CustomHeading from "../typography/Heading"; +import { chunk } from "lodash"; + +const subjectIcons = { + science: { icon: physics, label: "Science" }, + mathematics: { icon: math, label: "Math" }, + math: { icon: math, label: "Math" }, + english: { icon: english, label: "English" }, + kannada: { icon: kannada, label: "Kannada" }, + odia: { icon: odia, label: "Odia" }, +}; + +interface SubjectGridProps { + subjects: any[]; + selectedSubject?: string | null; + onSelectSubject?: (subject: string) => void; + isClickable: boolean; + isAllSubjectPersentage?: number; +} + +const SubjectGrid: React.FC = memo( + ({ + subjects, + selectedSubject, + onSelectSubject, + isClickable, + isAllSubjectPersentage, + }) => { + const [subjectItems, setSubjects] = React.useState>([]); + const handleSelectSubject = (subject: string) => { + onSelectSubject?.(subject); + }; + React.useEffect(() => { + if (!subjects) return; + let newSubject = [...subjects]; + if (isAllSubjectPersentage) { + newSubject = [ + { + subject: "all", + percentage: isAllSubjectPersentage, + isClickable, + }, + ...newSubject, + ]; + } + const data = chunk(newSubject, 4); + setSubjects(data); + }, [subjects]); + + return ( + + {subjectItems?.map((subject, index) => ( + } + justifyContent={"space-around"} + > + {subject && + subject?.map( + (subjectRow: any, index: number) => + subjectRow?.subject && ( + + ) + )} + + ))} + + ); + } +); + +export default SubjectGrid; + +const SubjectCard = ({ + isClickable, + percentage, + subject, + selectedSubject, + onSelectSubject, +}: { + percentage: number; + subject: string; + isClickable?: boolean; + selectedSubject?: string; + onSelectSubject?: (subject: string) => void; +}) => { + const handleSelectSubject = (subject: string) => { + if (isClickable) { + onSelectSubject?.(subject); + } + }; + + return ( + handleSelectSubject(subject)} + cursor={isClickable ? "pointer" : "default"} + rounded={subject === selectedSubject ? "1rem" : "16px"} + > + + {subjectIcons[subject?.toLowerCase() as keyof typeof subjectIcons] + ?.icon && ( + {`${subject} + )} + + + {(typeof percentage === "string" && parseInt(percentage) < 100) || + percentage < 100 ? ( + + ) : ( + + )} + + ); +}; diff --git a/src/components/common/icons/Icon.tsx b/src/components/common/icons/Icon.tsx index 2865d2d..8c10bf3 100644 --- a/src/components/common/icons/Icon.tsx +++ b/src/components/common/icons/Icon.tsx @@ -334,6 +334,16 @@ const iconsMap: Record> = { ); }, + SwapVertIcon: ({ color, active, ...props }) => { + return ( + + + + ); + }, ChevronRightIcon, ChevronLeftIcon, ChevronUpIcon, diff --git a/src/components/common/layout/BottomComponent.tsx b/src/components/common/layout/BottomComponent.tsx index 4116c72..c2edbdc 100644 --- a/src/components/common/layout/BottomComponent.tsx +++ b/src/components/common/layout/BottomComponent.tsx @@ -19,7 +19,7 @@ const BottomComponent: React.FC = memo( }) => { return ( void; bottomComponent?: React.ReactNode; progress?: string; - onFilterClick?: (filter: string) => void; selectedView?: any; points?: number; recentSearch?: string[]; @@ -41,6 +39,13 @@ interface HeaderProps { from: string; subject: string; }; + userInfo?: boolean; + onBack?: () => void; + isShowBackButton?: boolean; + headingTitle?: string; + rightComponent?: React.ReactNode; + logoutPopup?: () => void; + setModalContent?: any; } const Header: React.FC = ({ @@ -50,12 +55,18 @@ const Header: React.FC = ({ onSuggestionClick, bottomComponent, progress, - onFilterClick, selectedView, points, recentSearch = [], width, keyDownSearchFilter, + userInfo, + onBack, + isShowBackButton, + headingTitle, + rightComponent, + logoutPopup, + setModalContent, }: HeaderProps) => { const { t } = useTranslation(); const [isOpen, setIsOpen] = useState(false); @@ -64,9 +75,6 @@ const Header: React.FC = ({ const headerParams = new URLSearchParams(location.search); const from = headerParams.get("from"); const navigate = useNavigate(); - const isWatchPage = location.pathname === "/watch"; - const isSearchPage = location.pathname === "/search"; - const isLeaderboardPage = location.pathname === "/leaderboard"; const [isInputFocused, setIsInputFocused] = useState([]); const debouncedSearch = debounce((value: string) => { const trimmedValue = value.trim(); @@ -135,7 +143,6 @@ const Header: React.FC = ({ navigate("/home"); } }; - return ( = ({ align={"stretch"} width={width} > - {isLeaderboardPage && ( - - {/* Back Icon */} - - navigate("/home")} - /> - - - {t("LEADERBOARD")} - - - - - VIEW - - onFilterClick && onFilterClick("dropdown")} - cursor="pointer" - > - - {selectedView || "School" || "Select"}{" "} - - - - - - )} - - {isWatchPage && ( - - + {/* right component */} + {rightComponent && rightComponent} + {/* header */} + + + {isShowBackButton && ( = ({ cursor="pointer" width="2em" height="2em" - onClick={handleBackNavigation} + onClick={onBack} /> + )} + {headingTitle && ( - {t("HOME_WATCH")} + {headingTitle} - - {points && } + )} - )} - {!isWatchPage && !isSearchPage && !isLeaderboardPage && ( + {!userInfo && points && } + + {/* user info */} + {userInfo && ( {/* Left-hand side: Palooza logo */} @@ -235,7 +190,7 @@ const Header: React.FC = ({ {/* Right-hand side: SearchIcon and NotificationIcon */} {points && } - {isScrolled && progress !== "" && ( + {progress && isScrolled && progress !== "" && ( = ({ boxSize="1.5rem" onClick={() => navigate("/home")} /> */} - {isScrolled && !isOpen && ( + {onSearchChange && isScrolled && !isOpen && ( = ({ textTransform="capitalize" /> - {progress !== "" && ( + {progress && progress !== "" && ( @@ -332,12 +287,29 @@ const Header: React.FC = ({ )} + { + logoutPopup?.(); + setModalContent((e: any) => ({ + ...e, + message: "Are you sure you want to logout?", + })); + }} + /> )} + + {/* collapsed search */} = ({ placeholder={t("HOME_SEARCH")} icon={searchIcon} showClearIcon={true} - isBackButton={handleBackNavigation} + isBackButton={handleBackNavigation} onChange={handleSearchChange} onKeyDown={handleKeyDown} suggestions={suggestions || []} @@ -355,25 +327,24 @@ const Header: React.FC = ({ /> - {!isOpen && - !isScrolled && - !isWatchPage && - !isSearchPage && - !isLeaderboardPage && ( - handleInputFocus("input")} - onBlur={(e) => handleInputBlur("input")} - /> - )} + {/* search input */} + {!isOpen && !isScrolled && onSearchChange && ( + handleInputFocus("input")} + onBlur={(e) => handleInputBlur("input")} + /> + )} + + {/* resent search */} {isInputFocused.length > 0 && suggestions?.length === 0 && !isScrolled && ( @@ -432,6 +403,8 @@ const Header: React.FC = ({ )} + + {/* Bottom Component */} {bottomComponent && bottomComponent} ); diff --git a/src/components/common/layout/layout.tsx b/src/components/common/layout/layout.tsx index 11c1454..939e23e 100644 --- a/src/components/common/layout/layout.tsx +++ b/src/components/common/layout/layout.tsx @@ -30,7 +30,6 @@ interface Props { onSubjectSelect?: (subject: string) => void; bottomComponent?: React.ReactNode; progress?: string; - onFilterClick?: (filter: string) => void; selectedView?: any; points?: number; recentSearch?: string[]; @@ -38,6 +37,11 @@ interface Props { from: string; subject: string; }; + userInfo?: boolean; + onBack?: () => void; + isShowBackButton?: boolean; + headingTitle?: string; + rightComponent?: React.ReactNode; }; } @@ -56,7 +60,7 @@ const Layout: React.FC = ({ const footerRef = React.useRef(null); const headerRef = React.useRef(null); - const [modalContent] = useState({ + const [modalContent, setModalContent] = useState({ title: `${t("POPUP_CONFIRM_LOGOUT")}`, message: `${t("POPUP_CONFIRM_MSG")}`, }); @@ -131,7 +135,10 @@ const Layout: React.FC = ({ > {isHeaderVisible && ( -
+
)} {children} diff --git a/src/pages/Home.tsx b/src/pages/Home.tsx index 261d5a2..4aca502 100644 --- a/src/pages/Home.tsx +++ b/src/pages/Home.tsx @@ -229,7 +229,11 @@ export default function Homepage(props: any) { progress: progress, recentSearch: recentSearch, points: authUser?.points, - keyDownSearchFilter: { from : "home" , subject : localStorage.getItem("subject") || ""} + keyDownSearchFilter: { + from: "home", + subject: localStorage.getItem("subject") || "", + }, + userInfo: true, }} > diff --git a/src/pages/leaderboard/LeaderBoardScreen.tsx b/src/pages/leaderboard/LeaderBoardScreen.tsx index c7246b5..d00c21f 100644 --- a/src/pages/leaderboard/LeaderBoardScreen.tsx +++ b/src/pages/leaderboard/LeaderBoardScreen.tsx @@ -29,6 +29,7 @@ import IconByName from "../../components/common/icons/Icon"; import moment from "moment"; import BottomComponent from "../../components/common/layout/BottomComponent"; import Loading from "../../components/common/Loading"; +import { useNavigate } from "react-router-dom"; interface UserData { rank: number; points: number; @@ -64,6 +65,8 @@ const LeaderboardScreen: React.FC = (props: any) => { }; const [bodyHeight, setBodyHeight] = useState(0); const [hasMoreData, setHasMoreData] = useState(true); + const navigate = useNavigate(); + useEffect(() => { impression({ edata: { @@ -189,8 +192,21 @@ const LeaderboardScreen: React.FC = (props: any) => { } /> ), - onFilterClick: () => handleCollapseToggle("view"), selectedView: filter?.type, + userInfo: false, + rightComponent: ( + navigate("/home")} + onFilterClick={() => handleCollapseToggle("view")} + selectedView="Class" + /> + ), + // isLeaderBoardFilters: { + // icon: true, + // heading: t("LEADERBOARD"), + // backTo: "home", + // }, }} > {activeCollapse !== "none" && ( @@ -687,3 +703,80 @@ const PopupCustom: React.FC = ({ ); }; + +interface HeaderWithFiltersProps { + heading: string; + onBack?: () => void; + onFilterClick?: (type: string) => void; + selectedView?: string; + rightComponent?: React.ReactNode; +} + +const HeaderWithFilters: React.FC = ({ + heading, + onBack, + onFilterClick, + selectedView, + rightComponent, +}) => { + return ( + + {/* Back Icon & Heading */} + + + + {heading} + + + + {/* Right Side (Customizable) */} + {rightComponent || ( + + + VIEW + + onFilterClick && onFilterClick("dropdown")} + cursor="pointer" + > + + {selectedView || "School" || "Select"}{" "} + + + + + )} + + ); +}; diff --git a/src/pages/teacher/ClassDetails.tsx b/src/pages/teacher/ClassDetails.tsx new file mode 100644 index 0000000..cceb10e --- /dev/null +++ b/src/pages/teacher/ClassDetails.tsx @@ -0,0 +1,99 @@ +import { Box, Text, VStack } from "@chakra-ui/react"; +import { useEffect, useState } from "react"; +import { useTranslation } from "react-i18next"; +import { useNavigate, useParams } from "react-router-dom"; +import ClassCard from "../../components/common/cards/ClassCard"; +import Layout from "../../components/common/layout/layout"; +import { getTeacherData } from "../../services/home"; +import { impression } from "../../services/telemetry"; +import Students from "./class/Students"; + +export default function ClassDetails(props: any) { + const { t } = useTranslation(); + const [error, setError] = useState(null); + const { authUser } = props; + const { board, schoolUdise, grade, medium, groupId, subject } = useParams(); + const [classDetails, setClassDetails] = useState({}); + const navigate = useNavigate(); + const [selectedSubject, setSelectedSubject] = useState(subject); + + useEffect(() => { + const fetchProgramId = async () => { + try { + const payload = { + groupId: groupId, + schoolUdise: schoolUdise, + grade: String(grade), + medium: medium, + board: board, + }; + let data = await getTeacherData(payload); + const classObj = { + ...data, + subjects: data?.subjectResults || [], + }; + setClassDetails(classObj); + } catch (error) { + console.error("Error fetching program data:", error); + setError(t("An unexpected error occurred. Please try again later.")); + } + }; + + fetchProgramId(); + }, [authUser]); + + useEffect(() => { + impression({ + edata: { + type: "TeacherPage", + pageid: "TeacherPage", + uri: "/teacher", + query: Object.fromEntries( + new URLSearchParams(location.search).entries() + ), + visits: [], + }, + }); + }, []); + + return ( + navigate("/class"), + }} + > + + {error ? ( + + {error} + + ) : ( + + setSelectedSubject(e)} + selectedSubject={selectedSubject || "all"} + /> + {/* Table Section */} + + + )} + + + ); +} diff --git a/src/pages/teacher/TeacherPage.tsx b/src/pages/teacher/TeacherPage.tsx new file mode 100644 index 0000000..6e15d36 --- /dev/null +++ b/src/pages/teacher/TeacherPage.tsx @@ -0,0 +1,135 @@ +import { Center, VStack } from "@chakra-ui/react"; +import React, { useEffect, useState } from "react"; +import { useTranslation } from "react-i18next"; +import { useNavigate } from "react-router-dom"; +import { impression } from "../../services/telemetry"; +import CustomHeading from "../../components/common/typography/Heading"; +import Layout from "../../components/common/layout/layout"; +import ClassCard from "../../components/common/cards/ClassCard"; +import { getTeacherData } from "../../services/home"; +import { checkUserDetails } from "../../services/auth/auth"; + +export default function TeacherHomepage(props: any) { + const { t } = useTranslation(); + const [error, setError] = useState(null); + const navigate = useNavigate(); + const { authUser } = props; + const [classes, setClasses] = useState([]); + const [loading, setLoading] = useState(true); + const fetchTeacherDataForClasses = React.useCallback(async () => { + try { + const result = await checkUserDetails(); + if (!result) { + setError("No class details found."); + return; + } + + const groupMemberships = result?.data?.GroupMemberships || []; + + const classDataArray: any[] = []; + + await Promise.all( + groupMemberships.map(async (classDetail: any) => { + const payload = { + groupId: classDetail?.Group?.groupId, + schoolUdise: classDetail?.School?.udiseCode, + grade: String(classDetail?.Group?.grade), + medium: classDetail?.Group?.medium, + board: classDetail?.Group?.board, + }; + + const data = await getTeacherData(payload); + + // Create class object + const classObj = { + ...data, + subjects: data?.subjectResults || [], + title: `Class ${classDetail?.Group?.grade}`, + groupId: classDetail?.Group?.groupId, + schoolUdise: classDetail?.School?.udiseCode, + grade: String(classDetail?.Group?.grade), + medium: classDetail?.Group?.medium, + board: classDetail?.Group?.board, + }; + + classDataArray.push(classObj); + }) + ); + setClasses(classDataArray); + } catch (error: any) { + setError(`Error fetching teacher data for classes:${error?.message}`); + } finally { + setLoading(false); + } + }, [authUser]); + + useEffect(() => { + fetchTeacherDataForClasses(); + }, [authUser]); + + useEffect(() => { + impression({ + edata: { + type: "TeacherHomepage", + pageid: "TeacherHomepage", + uri: "/teacher", + query: Object.fromEntries( + new URLSearchParams(location.search).entries() + ), + visits: [], + }, + }); + }, []); + + const handleCardClick = (group: any, subject?: any) => { + navigate( + subject + ? `/class/${group.board}/${group.schoolUdise}/${group.grade}/${group.medium}/${group.groupId}/${subject}` + : `/class/${group.board}/${group.schoolUdise}/${group.grade}/${group.medium}/${group.groupId}`, + {} + ); + }; + + return ( + + {error ? ( +
+ + {error} + +
+ ) : ( + + + + + + {classes?.map((group: any) => ( + handleCardClick(group)} + subjectClick={(sub) => handleCardClick(group, sub)} + /> + ))} + + )} +
+ ); +} diff --git a/src/pages/teacher/class/Students.tsx b/src/pages/teacher/class/Students.tsx new file mode 100644 index 0000000..3e799b4 --- /dev/null +++ b/src/pages/teacher/class/Students.tsx @@ -0,0 +1,252 @@ +import { SearchIcon } from "@chakra-ui/icons"; +import { + Button, + Flex, + HStack, + Input, + InputGroup, + InputRightElement, + Radio, + RadioGroup, + Table, + Tbody, + Td, + Text, + Th, + Thead, + Tr, + VStack, +} from "@chakra-ui/react"; +import React, { memo, useState } from "react"; +import { useTranslation } from "react-i18next"; +import ActionSheet from "../../../components/common/ActionSheet"; +import IconByName from "../../../components/common/icons/Icon"; +import CustomHeading from "../../../components/common/typography/Heading"; +import { getTeacherData } from "../../../services/home"; + +interface payload { + groupId: string; + schoolUdise: string; + grade: string; + medium: string; + board: string; + subject?: string; +} + +const subjectSort = [ + { label: "TEACHER_A_Z", value: "a-z" }, + { label: "TEACHER_Z_A", value: "z-a" }, + { label: "TEACHER_COMPLETIOIN_RATE_HIGH", value: "highToLow" }, + { label: "TEACHER_COMPLETIOIN_RATE_LOW", value: "lowToHigh" }, +]; + +const Students: React.FC = (payload) => { + const { t } = useTranslation(); + + const [students, setstudents] = useState | null>(null); + + const [activeCollapse, setActiveCollapse] = useState( + undefined + ); + const [radioSelection, setRadioSelection] = useState( + undefined + ); + const [selectedView, setSelectedView] = useState( + undefined + ); + const [searchText, setSearchText] = useState(""); + + const handleCollapseToggle = (collapse: string) => { + setActiveCollapse(collapse === activeCollapse ? undefined : collapse); + }; + + const handleViewChange = (view: string) => { + setSelectedView(view); + setActiveCollapse(undefined); + }; + + const filterSubjects = (students: Array) => { + const filteredStudents = students.filter((student) => + student.username.toLowerCase().includes(searchText.toLowerCase()) + ); + if (selectedView === "highToLow") { + filteredStudents.sort( + (a, b) => + Number(b.completionPercentage) - Number(a.completionPercentage) + ); + } else if (selectedView === "lowToHigh") { + filteredStudents.sort( + (a, b) => + Number(a.completionPercentage) - Number(b.completionPercentage) + ); + } else if (selectedView === "a-z") { + filteredStudents.sort((a, b) => a.username.localeCompare(b.username)); + } else if (selectedView === "z-a") { + filteredStudents.sort((a, b) => b.username.localeCompare(a.username)); + } + return filteredStudents; + }; + + React.useEffect(() => { + const init = async () => { + let students = await getTeacherData({ + ...payload, + studentProgress: "true", + }); + setstudents( + students?.userCompletionPercentages || students?.classResults || [] + ); + }; + init(); + }, [payload]); + + return ( + + handleCollapseToggle("none")} + headerComponent={ + + + {t("TEACHER_SORT")} + + + } + > + + setRadioSelection(value)} + w="100%" + > + + {subjectSort.map(({ label, value }) => ( + + + {t(label)} + + + ))} + + + + + + {/* Header Section */} + + + + + + + + setSearchText(e.target.value)} + value={searchText} + /> + + + + + + + + + + + + + + {filterSubjects(students || []).map((student, index) => ( + + + + + ))} + +
+ + {t("LEADERBOARD_NAME")} + + + + {t("TEACHER_COMPLETION_RATE")} + +
{student.username}{student.completionPercentage}
+
+ ); +}; + +export default memo(Students); diff --git a/src/pages/videos/SearchPage.tsx b/src/pages/videos/SearchPage.tsx index 2432f5c..a1b033d 100644 --- a/src/pages/videos/SearchPage.tsx +++ b/src/pages/videos/SearchPage.tsx @@ -78,6 +78,7 @@ const SearchPage: React.FC = () => { _header={{ searchTerm: searchTerm, onSearchChange: setSearchTerm, + userInfo: false, }} > {loading && } diff --git a/src/pages/videos/WatchScreen.tsx b/src/pages/videos/WatchScreen.tsx index 86dd994..4f09eed 100644 --- a/src/pages/videos/WatchScreen.tsx +++ b/src/pages/videos/WatchScreen.tsx @@ -158,6 +158,10 @@ const Watch = (prop: any) => { onSelectItem={handleSelectSubject} /> ), + userInfo: false, + isShowBackButton: true, + headingTitle: t("HOME_WATCH"), + onBack: () => navigate("/home"), }} isFooterVisible={false} isHeaderVisible={true} diff --git a/src/routes/teacherAuth.tsx b/src/routes/teacherAuth.tsx new file mode 100644 index 0000000..a0a3cf7 --- /dev/null +++ b/src/routes/teacherAuth.tsx @@ -0,0 +1,19 @@ +import { lazy } from "react"; + +const TeacherHomepage = lazy(() => import("../pages/teacher/TeacherPage")); +const ClassDetails = lazy(() => import("../pages/teacher/ClassDetails")); + +export default [ + { + path: "/class/:board/:schoolUdise/:grade/:medium/:groupId", + component: ClassDetails, + }, + { + path: "/class/:board/:schoolUdise/:grade/:medium/:groupId/:subject", + component: ClassDetails, + }, + { + path: "*", + component: TeacherHomepage, + }, +]; diff --git a/src/services/home.ts b/src/services/home.ts index ab4bcaf..c6528db 100644 --- a/src/services/home.ts +++ b/src/services/home.ts @@ -60,9 +60,7 @@ export const getSubjectList = async () => { }; const response = await fetch( - `${ - import.meta.env.VITE_API_AUTH_URL - }${URL.SUBJECT_LIST}`, + `${import.meta.env.VITE_API_AUTH_URL}${URL.SUBJECT_LIST}`, { method: "POST", headers: headers, @@ -93,36 +91,32 @@ export const getSubjectList = async () => { } }; -export const getLeaderboardFilter = async (payload:any) => { +export const getLeaderboardFilter = async (payload: any) => { try { + const headers = { + Authorization: `Bearer ${localStorage.getItem("token")}`, + "Content-Type": "application/json", + }; - const headers = { - Authorization: `Bearer ${localStorage.getItem("token")}`, - "Content-Type": "application/json", - }; - - const response = await fetch( - `${ - import.meta.env.VITE_API_AUTH_URL - }${URL.LEADERBOARD_FILTER_LIST}`, - { - method: "POST", - headers: headers, - body: JSON.stringify(payload), - } - ); - - if (!response.ok) { - throw new Error("Failed to fetch subject list"); + const response = await fetch( + `${import.meta.env.VITE_API_AUTH_URL}${URL.LEADERBOARD_FILTER_LIST}`, + { + method: "POST", + headers: headers, + body: JSON.stringify(payload), } + ); - const subjectList = await response.json(); + if (!response.ok) { + throw new Error("Failed to fetch subject list"); + } - if (subjectList?.data) { - return _.sortBy(subjectList.data, "rules"); - } + const subjectList = await response.json(); + + if (subjectList?.data) { + return _.sortBy(subjectList.data, "rules"); } - catch (error) { + } catch (error) { console.error("Error in getting subject list:", error); throw error; } @@ -163,4 +157,34 @@ export const getCurrentUserdetail = async ( throw error; } }; +export const getTeacherData = async (payload: any) => { + try { + const headers = { + Authorization: `Bearer ${localStorage.getItem("token")}`, + "Content-Type": "application/json", + }; + + const response = await fetch( + `${import.meta.env.VITE_API_AUTH_URL}${URL.PROGRESS}`, + { + method: "POST", + headers: headers, + body: JSON.stringify(payload), + } + ); + if (!response.ok) { + throw new Error("Failed to fetch user data"); + } + const userData = await response.json(); + + if (userData?.data) { + return userData?.data; + } else { + return []; + } + } catch (error) { + console.error("Error in getting user data:", error); + throw error; + } +}; diff --git a/src/services/utilService.ts b/src/services/utilService.ts index 9793315..b26536d 100644 --- a/src/services/utilService.ts +++ b/src/services/utilService.ts @@ -14,6 +14,9 @@ export function uniqueId(length = 32) { } export function getSid() { + if (!localStorage.getItem("token")) { + return ""; + } const tokenDecoded: any = jwtDecode(localStorage.getItem("token") || ""); const date = new Date( Date.now() + new Date().getTimezoneOffset() * 60 * 1000 diff --git a/src/utils/constants/url-constants.json b/src/utils/constants/url-constants.json index 430caf6..733e9fb 100644 --- a/src/utils/constants/url-constants.json +++ b/src/utils/constants/url-constants.json @@ -9,9 +9,11 @@ "ALT_PROGRAM_BMGS": "/api/v1/altprogram/bmgs", "USER_VALIDATION": "/api/v1/user/validateToken", "SEARCH": "/altprogramassociation/contentSearch", - "CONTENT_LIKE" : "/altprogramassociation/contentLike", - "CONTENT_IS_LIKED" : "/altprogramassociation/isContentLiked", + "CONTENT_LIKE": "/altprogramassociation/contentLike", + "CONTENT_IS_LIKED": "/altprogramassociation/isContentLiked", "LEADERBOARD_FILTER_LIST": "/api/v1/altprogramassociation/leaderBoardPoints", "LEADERBOARD_USER_DATA": "/api/v1/altprogramassociation/getUserPoints", - "RATE_QUIZ": "/altprogramassociation/rateQuiz" + "RATE_QUIZ": "/altprogramassociation/rateQuiz", + "CLASS_PROGRESS": "/api/v1/teacher/classProgress", + "PROGRESS": "/api/v1/teacher/progress" } diff --git a/src/utils/theme.tsx b/src/utils/theme.tsx index d9ace9f..fc1f2d6 100644 --- a/src/utils/theme.tsx +++ b/src/utils/theme.tsx @@ -100,6 +100,7 @@ const customTheme = extendTheme({ borderGrey: "#C5C5C5", lightGrey: "#828282", greenColor: "#219653", + tsSeaBlue20: "#03627C33", }, components: { Table: { From f64a66105d1346bdcfd8ebaaee4a445fc06bf2bf Mon Sep 17 00:00:00 2001 From: deepali-chavhan <140379634+deepali-chavhan@users.noreply.github.com> Date: Mon, 3 Feb 2025 13:37:32 +0530 Subject: [PATCH 2/5] Task #0000 fix: Ui changes and telemetry update for search (#149) Co-authored-by: deepali chavhan --- src/components/common/layout/Header.tsx | 13 ++++++++++--- src/components/common/layout/layout.tsx | 1 + src/pages/Home.tsx | 2 ++ src/pages/leaderboard/LeaderBoardScreen.tsx | 2 +- src/services/telemetry.ts | 14 ++------------ 5 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/components/common/layout/Header.tsx b/src/components/common/layout/Header.tsx index 9f1b289..8fbbf20 100644 --- a/src/components/common/layout/Header.tsx +++ b/src/components/common/layout/Header.tsx @@ -46,6 +46,7 @@ interface HeaderProps { rightComponent?: React.ReactNode; logoutPopup?: () => void; setModalContent?: any; + isSearchBackButtonHidden?: boolean; } const Header: React.FC = ({ @@ -67,6 +68,7 @@ const Header: React.FC = ({ rightComponent, logoutPopup, setModalContent, + isSearchBackButtonHidden, }: HeaderProps) => { const { t } = useTranslation(); const [isOpen, setIsOpen] = useState(false); @@ -317,7 +319,9 @@ const Header: React.FC = ({ placeholder={t("HOME_SEARCH")} icon={searchIcon} showClearIcon={true} - isBackButton={handleBackNavigation} + isBackButton={ + !isSearchBackButtonHidden ? handleBackNavigation : undefined + } onChange={handleSearchChange} onKeyDown={handleKeyDown} suggestions={suggestions || []} @@ -334,7 +338,9 @@ const Header: React.FC = ({ placeholder={t("HOME_SEARCH")} icon={searchIcon} showClearIcon={true} - isBackButton={handleBackNavigation} + isBackButton={ + !isSearchBackButtonHidden ? handleBackNavigation : undefined + } onChange={handleSearchChange} onKeyDown={handleKeyDown} suggestions={suggestions} @@ -347,7 +353,8 @@ const Header: React.FC = ({ {/* resent search */} {isInputFocused.length > 0 && suggestions?.length === 0 && - !isScrolled && ( + !isScrolled && + recentSearch.length > 0 && ( diff --git a/src/pages/leaderboard/LeaderBoardScreen.tsx b/src/pages/leaderboard/LeaderBoardScreen.tsx index d00c21f..9064bc3 100644 --- a/src/pages/leaderboard/LeaderBoardScreen.tsx +++ b/src/pages/leaderboard/LeaderBoardScreen.tsx @@ -384,7 +384,7 @@ const LeaderboardScreen: React.FC = (props: any) => { color="textPrimary" alt="close" cursor="pointer" - width="2em" + width="1em" height="2em" onClick={() => handleCollapseToggle("history")} /> diff --git a/src/services/telemetry.ts b/src/services/telemetry.ts index 1106bcf..43c2bba 100644 --- a/src/services/telemetry.ts +++ b/src/services/telemetry.ts @@ -1,3 +1,4 @@ +import { updateCdataTag } from "../pages/videos/utils"; import { getSid, uniqueId } from "./utilService"; // generate manually const VITE_TELEMETRY_BASE_URL = import.meta.env.VITE_TELEMETRY_BASE_URL; const VITE_TELEMETRY_END_POINT = import.meta.env.VITE_TELEMETRY_END_POINT; @@ -11,18 +12,6 @@ import { merge } from "lodash"; const getDefaultStartEvent = (props: Record = {}) => { const cdataNew = [ - { - id: localStorage.getItem("grade") || "", - type: "grade", - }, - { - id: localStorage.getItem("medium") || "", - type: "medium", - }, - { - id: localStorage.getItem("board") || "", - type: "board", - }, { id: localStorage.getItem("username"), type: "username", @@ -36,6 +25,7 @@ const getDefaultStartEvent = (props: Record = {}) => { type: "program", }, ]; + const updatedContext = updateCdataTag(cdataNew); const defaultEvent = { eid: "START", ets: Date.now(), From 20762215bf2c9b156690eb41bd4c9d7220d6a743 Mon Sep 17 00:00:00 2001 From: sagar takle Date: Tue, 4 Feb 2025 18:56:31 +0530 Subject: [PATCH 3/5] Bugs #0000 Teacher , Task #0000 Optimize and split the sections of the Leaderboard page component, Bug #0000 Leaderboard page users coins list infinity scroll issue (#151) * fix: isShowLogOutButton in teacher layout. * fix: bugs and teacher issue --------- Co-authored-by: sagar --- public/locales/en/translation.json | 6 +- src/assets/images/home-bg.png | Bin 35861 -> 107645 bytes src/components/common/ActionSheet.tsx | 15 +- src/components/common/cards/ClassCard.tsx | 6 +- src/components/common/cards/SubjectGrid.tsx | 2 +- src/components/common/icons/Icon.tsx | 2 +- src/components/common/layout/Header.tsx | 42 +- src/components/common/layout/layout.tsx | 29 +- src/pages/leaderboard/LeaderBoardScreen.tsx | 715 +++----------------- src/pages/leaderboard/Students.tsx | 183 +++++ src/pages/leaderboard/UserCoinInfo.tsx | 414 ++++++++++++ src/pages/teacher/ClassDetails.tsx | 5 + src/pages/teacher/TeacherPage.tsx | 33 +- src/pages/teacher/class/Students.tsx | 12 +- src/utils/theme.tsx | 2 + 15 files changed, 766 insertions(+), 700 deletions(-) create mode 100644 src/pages/leaderboard/Students.tsx create mode 100644 src/pages/leaderboard/UserCoinInfo.tsx diff --git a/public/locales/en/translation.json b/public/locales/en/translation.json index cabd96c..da49f98 100644 --- a/public/locales/en/translation.json +++ b/public/locales/en/translation.json @@ -40,6 +40,7 @@ "NO_CLASS_FOUND": "Your profile is not mapped to any class. Please contact system administrator.", "LEADERBOARD": "LEADERBOARD", "LEADERBOARD_NAME": "NAME", + "LEADERBOARD_NO_DATA": "No more data", "LEADERBOARD_RANK": "RANK", "LEADERBOARD_COINS": "COINS", "LEADERBOARD_YOUR_COINS": "YOUR COINS", @@ -47,7 +48,10 @@ "LEADERBOARD_VIEW_HISTORY": "View History", "LEADERBOARD_COINS_HISTORY": "Coins History", "LEADERBOARD_CLOSE": "Close", - "LEADERBOARD_CONIS_FOR_QUIZ": "coins for quiz", + "LEADERBOARD_QUIZ": "quiz", + "LEADERBOARD_CONTENT": "content", + "LEADERBOARD_CONIS": "coins for", + "LEADERBOARD_SUBJECT": "subject completion", "LEADERBOARD_VIEW": "View", "LEADERBOARD_HOW_YOU_STAND_WITH_OTHER": "See how you stand with others", "LEADERBOARD_SCHOOL": "School", diff --git a/src/assets/images/home-bg.png b/src/assets/images/home-bg.png index 8b962eec048ef92b3edfc82fa421bd0476ea408b..5cda93c9abe14a4454a5b4204a39484754c2246f 100644 GIT binary patch literal 107645 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 z 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 literal 35861 zcmWifcQ_l)8^EKey~SR&iCJ5X*4|shmV{EFHA?NhXKht`k03E>w6;)cmryOLXc2qQ zet-S_ar>UTd+xdUe%?3H#7LWhl!X)k08r@aXqW*2c!mGsm&6bM`9g%h=>G*IUOLvk z000@?{~aEnppfZbCZ4aEwi=*mif!j#g245e;WGdLolbTKB?JJH>vc7rSp?v%^z^jI zO#1L!EUX~*FSBIe&xQ#K0KWyJ`kxUz(+GEyPLfKj;1FT zsTxzjlg)P( z#{58)!hsC+TkpTn|JHHNNE;-g`bT(sNxX7CD8+BL4;>c1SWg4?1PJ^{N3FKA1m}oy z_Wc)zHLBCb1BbEf@emAvH%+OoNJBu>0PT(dITW!fC~jZ-*=wbf454HH?pX zNRgZ@ivl>7k%RRYrONq2uF!q{k4+KZ`Z?|#tg;e;P2RWG3Fo)L-J$UPr!pUuJf1#f zUVk?Gjgg4HUN&$sq9lGgPYKi~QB`8hVD>2>;*Gx)5H1=r)rua}Cp`jy*mhkYUpTTI zneN&jfg1t{v9Ah`PU^{#2f;hz9NEA!A^B||0+dRxcbeR7A*#AGI~m2$lt>fYSylRr z4|!BuY7noz`tTuP+M+NmQM_5UZQ!VF6M{`pfUA!Omb6QMq*h(GH2Y*tLFQgvvqBUUbQ7wwPz7?to?>TzMvW7>~G`>i(#u%JjC9vbvt_q){}8687GHGT`%BjKYEs=amdKK=mR_Tz1{ zMwq9LK+o70(rL1!+V{U9@ft|MS1pl}KhC6I+Dr1Pb37HszA+u7Y`BuzTl)*TuPRz4 zZ@4=ZofQuI=vOpP&d4&1YMPFj?qvo`uqbvl(evv+E`*e@&lpC#i+u9_SVIMjlu@Dt z3k~(*Ie8&Qq4z9q=Z+z!fs%N6LyFW`fl#Vo$l5S%8k8{oB}+(e1*@SM<>;vu$kyEYK*NEWEThinohLl#Y1TjSPP z4869wusMFg9e$ePK(zbW9#g}lw*X9;Ym%}s4f(Lk`u-q86lQ6hp^Z;rGc*%ryIY<2>fNf>oBUYB!AzP z48i1KZYsT!jy}(_q$tL#{unHnCx5QMn4 z?6}PPwXouG?mZT_J~_RWWj`|Z!E}=GAG;Lh^8KtnoW^?)03}C zItTpD{ng+wKjYgP{v!PPri}8-pzz-Xn2b2Fwg}2B--$bYuT~!E0hGcr3i6-*Sb9%G zG%%k76pnjL6S}-evzs0BG;_Ekkk2FZscN6jOW9*h4{{E~#3ar@>@ zmd%p9SX3H4zml-WofNj07Q2Zrkjtcvcv&hOW_g+XXXeX39n$z~?_1N)k3anq4e_c& ze4LrX2Y`+ZFvH?g!r1Ww_1^#ytS`fY=|Uit?^LQIkLjjvU~d-MCjhhc z<1=ggWqY-k_Jf3{Tw50!(+kY~6(^8j&efr#5X@yFjwF7x&>%9IS`x+9L)1j%?CGxE^aHE2pfMeQ@x|!WRHPX=T9oORAgATP;{={ooCkoWY(y zZS-XkvN%7oHh?3|hy04*_GSx3N3CtkL-qUT9pzLA+;R|A#~ji9_L|kFbnK>#IJ)~s zi#yNYYE$^WMt%2P;N3egk#d#;WfN|%f9zYQh^yz%<;6A9_l;sUr<(13^WeecJZU_f zwMSQdQsVY^Nt?fIG?||ERN2e?e7FKU(KWYr{V#u}BMnk1h6`}rmP*A@?Z9t3R<)lT z?R+V499BmF6kFO*~pUI?ixrWUUW*k1u^^@R9e6e?0m2J2GH;# zrG4a_$YK5m3)wXnmpKCS8X#zk3i^e;cRAbtO8+(T&@78F8d3)gq`{7W!>tBxHeFwn z)@A2Tx806tWhu7B?`tYy)oj8xf=XG=wF;O_f2<+%bHmk?XEMr-4YWJ`_>fg?A>`-( zZl~;@LlB}(`@D%y)Qk^aH0J9yOKheJW$bD z(L(K4apw^O^bF%vUX47l`u|p#ymd~{z04r~9Xo_79wiGl=)(SC0o5^pEi&sf3<9z1 z4A>nm@Z0LPTLTO|?m6BS;8vc^T%Jzi=!mR~gQDh7?db*EDb~N=}N(GTJ&{b2A>iOz59B1FQSr`am1zN50 z34Uf`Vt|$Z`g_{xba~^xrb&fxRYPJsO-4&xTClIlblX)r+^%aQ1RUK0Hm#2|J!61` zR95Y`YzEGWvnRLc2iQ1^H=jJpSHJV%dF5rWoVaV%%@0WWOKn;=oS8{c0O=gUHOF27 z)ns1CLB|IP0~gc(GoSaxy^!QdH9{yQyQlaWn!UJ|K^0f!&p%{Et;?Bzb{CEM2lWG#`YxKBf-#@7L>74T7I$&=Et!jyL#Yj2U*QB#_=REa%qEf^a zy=T7gui2h1cW#7U7>$oS4Pt0Jx#uqjmfq&?dOWJnAhnrOfiuhA$E=rn@5pDQRG6qDYp8$N9XI^ z9VPX(Bjp7N6eA0LGU$`@^{2RS;he`Ml{ueT-c1e!R4pJ>jq# z(p%*0*S~M+3ugvzg!dc++LPk4hJ+h798+_&1k*3CP@S+xQPZArmS1aW7JdZet0vzQ z7H=4B(7Cf1O$f#w&awji4^!UV{#lAtca)yKgG?wXaQ)yeIfT2Jt+aZv^_#AXvwV`L z+!6g9K~Fj@FmRhPZtiHiSw^b?+ZTARpGYwRqB$S{%o#S1j<*Fr=`x?dyOw_m+-NU` z*;A#d$P3@~E?=CEpoiY7gwr=T6-bi6L-@dEnGrehm;seI<&fH`$%&8tkm}{YV%xiS zBKsT{B2>xWSyPMr?PcCKxUgDDd%9`?pfg6o})H z%%s7ju~h$(RNxdXAisE+`>j1Ve)s{REC@dfF{&F=IgyiL87D6(n!)}%3f2uAohx--mAfH&DUmMWBl z`LD>Ih#zh-C-ei|wdn1p^(rllh^R&U`4{18)_9}nfb*TUyJ*@5B2uCa@0SAPbfYMT z5q%1R4)|uMCe=^IC-4T=Z>`BrMInx@UjjEHk!TTgnEu|n7+b2LPd33@P`q-Xi6r{U zd-jv5&@fihVQzr2)86t!k_sG*W@p^L-mwbTbydUF`=itb*JhZ!u4Y@^Mck7_y;4iA z+<@uyihQ6vZTK|$Lj$^&FW8UAM}mV^lONZXp8xrU#bY`_{^Bs zF27UYWyfZ36>r%S&kGqes|Miizgq0P@~^Jsc>6iv2KC6aDKLN$*(DkR;6Z|%e%mlm z_SxAx4}GR*CIQ_k%`8IgKkD|x=eux(>T^{-3>10ELJB!ggzUo^w(sruCLZL{ii>p~ zbkG4l4x!t&!pbr9q)vob4#wp2_{FOfzcrUf*z6g718Q8nKc?K($&zTX-Hi%i`z6vt ztjcah{nQVL3Dq=fY0^l7y34Z|2{>75XbJZikGWCECP=<=K{~K-2p}626LM^~okJd? z9|Y&0fZgPapm*WT`tjfwkyW|7AG8j?2lhMZLK-?LoF>@s+ZN;K*hSmTkc5v2ckob} zv*W^ANJl)Z0imC>{W}IKtR&nM3LKI;DSP-}&6NZz_H{Qe3JN;`=pB}Dr}$mLkp8K@ zzoO;YsX43g#*DY!Zm>fo869WCnbo=-w zvHB5KX!r)fjn(u0>Dm@hZ>|{Shpj8+LAGgA<2JupqSCd6fBqPT&Jn8wo7sr4WKkm^ zL(&$U0)RrsmxhkgN-ofyK_=a!}APhjj*#cx4x#?07GMOdf+m&{74&mA<+9*dC5Rn#7gFcPw7O=U6xRsr37MjZoc3z9__P}8vWFVJ>1kRq@0uP) zl@ra9Hry6}rD7MO^oNv5Tp1a<^TgKGzHYZ)T!p5tO+)u_D5oMKi5H9u1D|y$!RvLx zC#x`fi{FrMrEMjNE9v3YEZC_MJbz*b73?!7%|p?CcPh3^lIGH*sx1trci#O&29cTF zOns$Rtp@M`kH2UJkZ-ovK>g5Ec*KV zp}U?uop163kj*iP3w}b*;M~E-P_c7-c#%82>T;C1mIQKaaxXn~WG%z>VBk`mSbsx> zlw3x3ssZL=UlzLoy-=@_gbO`?Izh$e{neZLeWL7RNIm()2<844Q_CwZV!U`qf3E_V zfWu4G%wrvofzOOJRH#8^cMy~;iUmi5h4P6_K_p`aiUJh&@}t|6oiL0gf@P`nS%l~_ zz~-C1uoT!2N}LyYgE{R+Af&65k|Y1Hkw?nfPU$~rS!&%wjR4g|OSaei{fh1V%Yn%I zxJTw5BD%A`l8-3O*t~UrI-#La^g|`+CWPY#;EXJe zl=1Hb0VTN(E<){x>OZPppRPz7*r29(u*@meYR+}wE%Z9FYJUQIt@ zOG`}~(uD}ffEYrlv43~oiLgyKw|B|EVt_R&3-Hk=0<(|I+wfpWEW2v4BQz36X$M{T zrbIybC+SS5K?oVb0O1@AZb)2!48^`^YLYs$x>pb?b2`-ydQ&|>M~@Pv4t{0tf^3U_ z*4a*tJm0ABga#Tza!i{VsDN*N9HkyNTG7$_fpIh`^= z3CWG*PQSMt!#EQ`UD>4`3sk)m%G*&)Y`bB>$U|uz-@YF?G^nfo8+!`vUkN}Y8yf~$xoNS5sS6Su0VRJUpvW%!`_|sf40o!4UbRb) zQS&_7DGIA@G+~7@XUWE`J@j6^$>2xd*j02pANZxq3E#o`?>p%ccPvWQjGh(*iZ(~V z1V76o4^Y=`HT3%fhJFl{j?j~g^vNuQ=+MSe%zhXi zH_#pp*!^x(6L)}F-AJ)~{uO_LVB@-E^&_*;&A{3#Uu2O}r+Z}kK-jNkxsQ&Gm&9GV zc~*56@DBbDxZVYz&K=wLo+ru69js73c1aiN(IhsH3%8@!=3%*7)9oDUv9s0m8^0@i z3%QBIe@Ah59?qK9+YUB?V!pnPIDcnG_tq=)_n#-oK~2mvy=Pypz>qCsSjw!~9#$!| zaWo_E^GlORKiPmZ{^XYvzrV7os5i zv-_Ru3vx+;Ku{`0$wKe!rR!g#=MbK9`X30a4?g4%WqS_tkeJH8E<9hQX>u_CAra`O2!sd-C^~8nx^Fb# z9`1)DT|?L6+rqc@Na(n4*k!TvqA!jcl>i|O`>C?ebGnobVu!jKL)iU_(0a1D)cj(f z)A-F@n%~8umowvmNW!=*c=2Q{PB=*>kHL{U%|*BEuQj_1A+kf<_>aF|*uY<}wyW6^ zl8+Y0<@oWLJ9B2<^An|RW4yxf(T!E1G@o)!PZIME)|l=%8RQY>V4gsO^NApVez`AB zUanUb+#vs3_cfRyvwDjDdrxru!x)-aCtJuU0Pzy-mUITyrxtaq#oNNtI~kTYA&TXi z(f1}~LqaxZ%ubpv1<^94^6%-Bq@WA+NQks%xn{|O2E>1u19+7MH!CW-tnN^CE~TfoG1jZczmK2a9#gS#&Ujjm@N=Z;yVTjp3Rbt7p5tPIrjso6UZQY;}R=-pjdT&59-VKS$3 zJa~VI2Z8-n-hER+3+~NR3G3&#tQbY5ae(%a3t(x&?`ai}sv5nq!+v{9!ZGvis|XB^J3+%XYcPe(K9MKJCjJpU28gUX_)6fV7?6 z&%{FFnZWg|^;@Q2#>!=sBj{byhR%X?QV`!U_y@*imDb7-3glVu*>n&=DbjCWv<#}n zRCd5n@4x^40|$t4B#xl;Zjo1AvMb#w_FV2rH-+cGFN>zf?#m-|J!uq47A=O!+0Y^eF>S zJk|&u=lyugqa}*+A|(7kV_^OqO#_xL6iiw${Lm1PXWM4o5@}sM6|6P=P`sXA!LC-E zUCg31A5y&v_w-)U2~0wx<#p)-!fNh}**yLcgLXmoXfg3a4hpLU=*m>CSd&&Qh3fOZ^+-?Z;3 zMUMQJe(gLvmC9&HP>R7ci5;al5-<^{*(qdc7QxIG887xcJnjJ4hxD7vFvYdwK|@pa zud35h;q$C}(Bg8%Oo6~Jh2`~Y(9_H#dQ0_HOA@d}FK@*+H6Q*>DTf96s<0rwk3OyghxqyJ+~)d4N)VA18uFeO&0Agy+Ox_%Dge^ z`n{YX=H0T*@Q+nQwQ1FRlt3-BM_J6PiCDgfg%BY#CWwflV212;MG3Hw!uv;C}y{U^2Gl08CbQ6-Yci2pvggwnYgI>rLcqqPKy- ztg_ud@#)tuVX>V7s)u-tX13OnhK#}1DdE6^o4)RBWZ))( zFhI&iY4%9HfyvQ7XuX;D8{}1Pc9elEEI<=ok7I9=6!$||M1xWc1t0X4RAS8YuiTSJ&|%ka)r~xDbbv%WrZDBf7LP|QrlJY^ zuS;DWb_)z1VM}~%?iPH$=!^TU_WS9-&Hc;c79{+sNFSCn(#x~F{8LUImq|Y7adhq#)B!h%8(KF8+Y>?9wZ$7 zp<{0Tr2^af-b~XU@=((LdUM$tEeMVE>lt5P_FaUIEZa78Fg1V}&M_-iW1^??HdeR= z#GItCaa*IkbOvnp-~nV-AGlKa%*^H&vO43Nu>S)3Ctd=-cQduZZb8)uuhAbor8A@e z%YWZNym9R#ug4*1L3n5^-`+Phi{Pl zV1Q3N+53z?BRKo7W;v@<-#qv|e|tz#?+MP4-N`HhDR%|@UWZG9#VSKC#tqky?W3I| zQ!@W4{~w(-2H#v8ZBK^4dz4QSEOlio8<_|Rn>}yiN1iUq9<*MjP%g6coU|^%Oluuy z1O78drTJcrYd{PmEM@wWJR<_cg5m1iAH1*mwoulWnyPl!)&Z5RtchWR-H-8;iLwk= zls^5s_)rgGqK%(2U{7 zAE8SL`+g-8G^iIj;G+VgGuY2BhYrTyEf(LR929}dnc2Tlz`MH4` zZ+ktfDvcy@{Vy|m>smVE+-3^=r!C%mUAz~wuiT;u*bIgoTU*e1kGMwrzLEd*mo_(A0k;HCeD-#9yFfeGD#^{kWAeszL^1fj8!C zyoP8dad&M5Kg$*puN-Ne27Qh|2W1hNjFaeHb;4Re4+8P;vcwQC)@&rL`NGLTtUQzm z63cr6j0NU~7fG!@s>;oGP(dHeKb)F#P2crD=%yj@&iHNrB;!jbO?NDN_nGhv~_q&|95U zO;3Hl{hO)|5;VgiBq83dDTeF<)rc;Y=s5c9t1a>cx8B;OVn^20mn&DyH$pZnePO46 zff}x#cb%kWJKP)!odCSZSsoD{8&GNcRE zT@OFHoI$R2a=vpLMl^{N9xlQC0btm z&a&{M%-{&l4dE-~OVm@*vvfrkvB!E@=yB8T5KX21B14Ec$D1gmS68?B+jgK179jIs z4Cm$e0#zgBH?5xp*=R6|OAk7BA&$s=yHw4Db0qKvQ3`^RFd6!5DeyRBjqtiZ%;)g z8~=8mU+Wua>$`e&$SuG?AQ08CNx63ZuiXsJx)Yv@hPke z*RJyg|D%VT-J+0cx+k;g)Rs2t?JIWg^RBU^X@6K5BtaafPYBg7_O#g{U zoNmT9-OOpAPeyv$9Vf0^sj>0rvc;Sfs9l$p0T4=fdH6@|KftOv?nI2{$7Wdom*GDM zub$oGAxPrWI-{jmPYA^Qj@gi0sZ|rk1H^A_7DxT=PYn5*Bm86^RQ@{eTO*y|@uvk* zRX7Opbk}6xK=c{Y z$Vg$NO_35yFs>lZ?ONvFvZa5Q7k$4wq8ZLYs&6&OVqhDRc+~pZpJEF_F88z%fY4b} zF*7#Pw+m%}R~<~fgxEzs3$aEXgti2^$tqiukC3?}*w;Fvrs~wds>D-x*L;Np`Oksz z=e+fgf~z#t;tDuZ{VbT{N5WDg2VRw-!%4QGU&L*GVBy3Da ze`71qi_Vgot(8OS>Lk8>J|Yi6b@OinCI^y5o#QOEQ74~I&5&|m@;^PmGVeQlJ=K(OgQ+Ouu4{an8n$6cU%SfKL;ou)O8kMw0g99s5$0ZV_=PWM# zKAMLyt>-A6)FPn^A3&ONH*e)Pp(D47*gyB@b;+XE!HyJA_Fna0_Po3*{f?h7uuS9v zK3c+wBb7pr^u3JHZd*{MO^emD$z1LjDA#|lH)zJSoI?55AE{pm9~N0oC`1@<2==kT zR#;EHm?fk9IWvTqQYU$`+5i1iHq9>F8~%}+X*_wP)#YcN7OS%zwO>@KCxxm+zkKRe zp6spfw??IE$gLJB`jRV=9G?Jm&B%Ti5WlWCJ&f~fe!Tj3rjULJ61gJNLxasOHK2AAt~N8fc+z?#@gVv-Zq`D^+uQU4ybmDMSK z3($-#Rv9oNj1yl~qot=K%Y>;AU`O9K;<8_!ae+-fSxkh|IVUubN$Ht?>`vd@m%y%{ z_MpluVeBGcua}BfR31(`X5BG&IaQ_VLV&;ASgM#3F7KMPpFf0{9}wkoi;I0VUc&?F zG|9z5Uf8eC1TrEon5FvN(}4tNtXuszo5w&pQfrJGuNfZS&z|n=y(bp{uDpsh5}Z-3 zD!&Ky8#f`^Cj^v5Wn~@FXND&dacVe>^%z|YTC;;$(uHCSv( zL}pG;ErRJ$Y-eXRTSNnX?UGn^_*5{fx1X>;m^p&7ljZ*NPnk-`3zr{P^oh`Yk_OSA z1|Rc4H%iot_VmeVJD0{8#hE2`31n*^S)coNiNL>bi`-dG2LRf?7t+=y;cqzeH0Y)r z&LsqSp5eKe8Pq()kza~|qqpV2^8e{2X)Y3|XWI>FknE)`D>a%PRit;T6MV~Jw!9mY z{+44eh21JBCMT4+e84|Rf%?2@~&*MGWm4i9G zg;A5cem?Wp)^67`;i|4P&XOKR6eZH2tn6gR-2Q-;k5q3#2=0OS&nb#1Ynb6Upy1VOV1!#sq;C1G6~mCGw}=$ zAA{UBzTejDtw-a!HIv0NmYzk2;=4jp7mSy&lY3B6<_Dv5IMut!S6hxhCxZ+ZmcbbX z!&%eH)R9cJFMhuM`WLhK7rH*Z^yaf0%QC+jDC5>|M1@YtICYu%lU7Y#`{hN?B0=#j zKMQXYjD0&82-zq6b@?^MuRb!T7tz@M@ueg55+qI@wH?6iVo%m^d}dCwoj0gEfOc zL-(=Xqstg&B`eg2=*S+SKJi*2In;?tLnJWO0t@{5 zw>XJ}vmSfJBYeNYfpm|w1l{$G9U8Z`#|zb)M)`UF{HgBd{-Gwu#{e*K9J1=>rXZ2( zyFcK@V;u0=69oUO<|JuQ1vBg)h6KW^U_CV8#gUR1g&+t;k92J*zb7Lj+I^8SI#$jG zh|zdV1FmC}OhL82=+;$8CTqr5?pBG4=BEyOAqqaB2lsxj*UKkBQ~r(JmqIHhOE5Q# z-0z~wPtxFx)iJs=UT~falo5$mdFxAN5VOARVeU|UyAd4Sm# zgZ2M-BkAmtJ!4K(QZRrP6wh%%X$c%iawvc-nlQgfY4=GE8zJpmKV(uWfh>_wBrKKL zL|7iIn>=GjQ_Au6ce}_(s&%=rP?t@h(!2=?S2Zm8_5hFyb3_l$QV|~pdVuCZrffa= zYJB?Up?XHQ!&EHh?Rs`glf75%6skI*m{aLf)7~Rpi@c_H-)VNXyIWwz8yRoICH)o`NLqboZWi4?IQb&Of_|E21U@*BMj+xWe35n{ z!egw(1F-NZLp|gStjIQB9{Fa!!1y2fNQyr-Vq^R>6aAj~>(|QRWk~QYmjRN?>3tm| zywQ@_b4`EC{fC6M!csZnio?m?mIP$|H%);mWqKIgYqs#511gqGOn=cW8=n~H=6PDx z`0oWV0nAj?f00pB7nyS*LCly1=U`dQqRJ6{K}0!bAgQKgd7)4*-N8$5w5t1}E+4YF z-qLTgV^TySRBH{b|DchE{f9S|Mr{sFigXh!HymXw4Mg5URE62ohslh$g@~t3K1K|%Q z+)wrOi8T0$ItU4mSTMb1g}a#L4e8A$7NWw^m}ufk;FF87W2y(j&~J*o{>1bH?IH|> z=rYmfySD=WHF!VjSdJo$vB-)cAT5uxU3OD19k+3v)60O^hK$-hP1sZ2U(8Vt5+!VO zT+h99b-G`egQi{-+g>UW;j++X#N%Oyo)=j|iel&wFUtnYMCsu>^Br-Jz%?)8+1P&0 z{UlB60047BG1Ss9MxT`p?2cs(;u0mG^b^a18Yf>u>h~TF$a_y5bb64IV0Vy^vx=gc zXm0sa9|-VGw@Og=G^|XxKL}wZ!V*krG*_{8K@HKI{8AQdaQc#}MN994X|w(Ri{2*k zk6rvz2qA?o8zSiyJxxWr11L8RsV-5i@AsM)M)bcN#eWFsjK1(_anr(c%^*fz*-bx$ z@U*|Wdnu31Arq{aeg=6|6Gc8#<2`n3Q_(gg`M4z!(Eyvx?|fdtX&`*We$7eZ+_dm^ zS@_gI*k8GZf^s-b@P%oM02`T{^w4vyN#|TEEB~LEd{;>%UHnIGWJ>`zF7>Vxt3c7t zf_-*7`9B1*JbR*K&QPC7`x-Bv|0z=x&leZ6!xBY!_1Th!v5SlX# z@mf|jW`($fT98_P(%@|@N!D=jv{1zeb?7cq?%u)9owR0ty<>i-Rw9;RB%y~Mj$UOS zVQKl~Q%QwbJ9q#ZL;63C7IxrH!-ki@U9`SCKtjBKPLRgwpuGoXmVf7aZQUH5O0E>dnE_3v&NumiLw*)RJM8`}_)E#HT zXe-)PVXSGoI+!*VT+U!1O4hTYO@8@V zUz%(1mJe%`JN`7VQ!?t`!2Qe9%wQON0S{|4Gd7HzCt*OxiNmz|GsLAfvgDsi`lUsb zOc_Ml>Z+>*p;;1iKzIfcZyXY)w44~Fhf*YI8W!dGcbtT&Kbs^yES5wH|K~KXVu$Os zvK06;b7)zC3vBC$7p;|iKR}@gat}}a0S!y)?c_C&2oW<3ZpZdt%Se^y3-K~+O~eia zk~I;qeN8uUez5ptj(0*1kABJmF|zA0-^1!_M}PgIZ$ro{6@0Zn>fv|V;m_?Jw>w?{ zg&A5ML~OW!$V=oz^@!M<(3?JoFBBwnS^mo`^fG9a8^lj%dA`gD>Q{uMSI6ZHHHAS$ zY=o7%9}zVeB*jA%Tusy&2(vHYkVEO_KT_ybL4%}INEAc+D+H#z>cJl0+h$s1(R~Rr zv_Vta>$3cTp2UydgHiGtD#4h&IkHE8D4;nFtnR5m*6Xlr{8+>$Luef2_O|c%{n|2F zNHlV61FIs|L^t&4J5}*FT8-}3ID2c$`4--Nha0aU9fpIY_el#n$W6~k`rvxo@;nWi zI|nlK?+X`F#Di`otlr>drUGEtCLbS#Ez>*be;L*5Qbg>x_&g>~0kEoGbxp~8)tR6^ zc+UquIeHJ>AMQ>g8u~A4BD?$2VD#{U4TPnT>38?l-9@=t%_#+bX!^Ng4YIT(6p9^9 zhUNc!p|H#62MD?OV`KlLc!_!u=JR-^)|g`iu)3 z?i>i|~Psv&JBpFbZ^L`JWC?!tsN!McK_ko@6E^`P$e){Wv+bRiF+cl7hW_ij!6E}*Y$QwiL84gu zjU#Uhf{eweWM{>k4T~S#nL#JV$f!!+=q8Z|pR0#=ovd1o_0OVTc@(7Gj(Ctbxz|7Tw`%mz~+uX$c{A@LhnyOKVtr|`$S zFIbO)FC=$Ksq$ThBmm)lNxxWo*556w?B($wxYxUDoF$uFT540RDXcIsAfoeHwu zcxsxRTC|+{X<6(yMYfm6#uQ2oQ8*fgD139|)fpOJOpvV8mb_D}SSLgIr=y8nA;~gD zj|eF@%i@}Pa>sCpNNE2my=rax{n3|#k6DuFT>b7l4%xq<7-gn`@kZ|pa)FMfdb(paWb<1C1m}OBUKpq18WONuv-$0>&}kJU=Slr1crPc8oe}*X}3T1Ujhl|xD!!| z@%ydhBqx$}oMw9GC&FtG;A2bJAoO!28IL)797BQjXKbaU!NGUB4Ar@@M&?^*9q06~ z={uL#$1PXg1T~d9&Z%tR52y-(Q~+SszfIU2TH$s5EIH?iBBUX}!G#K<&s5dO>#O7kn&}{m*nvY){jVmd!^8c;>IT z-|atvVlWx8P1sW;=U$Z2?o3U@EmJB0E&#%U)hsRj;}kF{-+^ts8IIpDA2HR4{~R9O zvBS2WcUt?sP?SjE{E&Yq#GlO3=nGQuLN(s{PCd>#UZwRWCoSE_b0Rj^i4b2Nl0>FQ z6Xq0)!n8&3!OEXx`S+5CCPY%M3%*J1HEQKsEG>esU@^oFgRp9jCFg)U1 zGwB5oH;TqyA4^CIRWrhhG&!^D=lHnE>4v&tcoLfO4v(N`c$Fj4R>L>yA1`z%8x)J9 zCltM4fYE`LOw{9Evj|F&w>$9;op-LgzX-vk&0YdhAxG!5Mf0nRCc$zRtFzgq=EHVJqignFpB8{- zBmQx}c;ju*l(u!XGwWqEcpeKF(WpL#ur^3j4TEzYj z@%Ukv|Aw)&|77kGcN#>9n%(fjIj#|-6{59_1$+VL*Pk)j44tx`8~LSx#@MBomK`X) z6-lwa3o>a$I z^t##q`TqZ{!9-;#;xji#R-B#Mn}~kl%6N+vyIPu3sS0z?4hgaSJdSrE2xRJR zYJUCdBvuG$K8*?JU& zku&&K6+0h`2rS@Rvf8-j`VoEdzRXv2Wp8Tl{Xz()e9tH0XTw3k@7MHullVs46o`_}T!`2}VN+r%WeVPp&9dOc2(eER<6f-VrTT@A4~M9T{wG3J6ZcD9Ya{PI)Mq~> zn~t8&!I3?W5Np8Tf%|7D77X!!B{nc#93u5d*{4t%!1d&by^pYyd|`DyDV4Op;l5@z z#>NCL8Jw#H`B(wbPS1JKSq1qA)7aZpp430-*EbOyTYxw_wxZvMX^gRQh5|^wqc-(! z6EqYCwC6gmr?pYC%|ws4y8EG_H>x!Z>7&IJGC+Gy`I$~3KyIEyR`u007L4S|Ihknn zUxnr;fU$QLjG?)tlQ>z-CL$V=O8D6uSznjkMv&;&3cx$0*skB2HWRQz1>Fm+DW)uB zMa<{Zd~M^XeLD8>m-p^bKP|#HhsQ7nWg2$m6c^JL!oU_`t)n$}rqoy|t@_VsESjx} z|AnXI7GybycK+Ge_V)f=W(AR^FGi!UfE?N5HWZc0^W?ij4-58rJfa&zk60Yok8p<; z3CEC?XV&HCTKKI|64%ygFXCSq?hMbZAY5&h6V4S5j{uPM9WSN+0atXNsUbnLan~Sy zqF(?2DX)2Y{19T+4+h{2xbW z9oFRkwqd$Ux{;I)ky1bq2>~THM#BK<7NkpZBLoF$q-(%NcMqh$2#k>K?#_3=_s<>d z;9xtp56^R7*LmI%@fTeATTfQiAd3nc3=nc$m>E%=+Fgks-!24C(WH-Cz?U)*;D${e zW;8>R({hbUllYpTcbPxmFZpc&9c|z9mR5yItQZ=ZzctckS^smP#6mZkFEy!gJ=AxX z-tAK9vHUy9>BGO5?%X*>TDo_JMt$KI>XrZ!M+fYYye;Vgu&zMu0xv-B+p+e!V4OAi z9x62oIQF-d@Q@M3AQYTY7IgiL(P{yG)YS$U@-FQg8Wl@$Oq){=IvzyMBLByEHEvTm zuEkY8+Ehbb!Y`TxZyj1vS8Ak3w3!5qb4)`ndgJ!8k$fw$sft|}+>thpNe7Hjhi=eE zCYacsXH|x>rPd@br81Fz1~<0D;El+ zPvuAJ6UvNAZ<%#oCP1Ok2|}|N(ATFQUNreb-=9{uTlBP5oJk3T-0bPDY_bHvTfi<4 zElm6GDt^q;>BS!HG=6}r65dlY;uj;;qSZXcwING+8zz1GtuM(Q;(NMV9me@0SLfe7 z&&5?5=)fvW%E8t>0i9-f2l``c5K7oc&?Z}lUQ9oTEz5M1YDW=UM$GuVg`~YuD)h=q z0VQ|?M3RN8(aeeslFQN7ECLW2y1d+y;6(~PfX|tmp06n2-{g;BffA#|(s~vUg>IE! zA}`E7W3XMhQEyO%uw2xM6N>7joPBtYydHq=gd>txH)Nh`Tf`_E;luli?6NmUdb4A) zBU;`>c`B$Ut2)UKc=`wd8=_Wl)mgB!pR?-~+sS`$W=G--VsYS^fC!^jeFS9BM+7M3GV;(QL6-l0do&r8X|VfAtQ#A)H{R-w=F0m7wnALrp25Hk?lEmi z;>u?viSEO0ue`4q*y!54DkccYWjH7oW^kobv0t+G&L!b|7s}(Ec)uBf?oXA2%$F1U z!woGjo2)Y)0yxD6JDVwhA6m#&LzdxIh>cKpe(F$*e=`8aRc_80`sh*f^J!e>Y&~n`Vd8 zyj#7x_^(tlh`izQ54oQ-&+XM{TgFGMb0DJp#WSdkshe0KIys71%Tp?s?!Bd?RH#gq zuIU@YMEJO@QSPAvk~APO0_yb;*L@@&tHNZ)%J-fKL|?Dv1J}20nJbLZq7AlWA^v7k zgS%&gxr)ru`27Y4se%4~%z5vSI{Dgq1B;_vNMZ+Fj|w3JFjhmn*#lDDjeA zRT~Y$Zy?TRls$6{G183wy5-;Ks)QZKqAkI!hkw@cI+i|0gIiQ_f|2Boq;ur$bim@&=2x(WF<&R9Suxj0 zuOma7R8TyoEzf_(78`2atf-bc4_m8Ff9R7lT*VHxTo4Gf!KS=mjhjymwa zc~HmCM?Bm6n6ukNvovU|c~{=e+WBokhSP(?^|{Q{HtdTM>?lmqHiS0nQyN~viqe_9 zO1Qd@;X=YoAmnC9(fjCs&&tGJzK=ZryQJvR_fZrx`iv>|f`yEUVz$ajOPcEt{>itw zB2r)4?eAOcN@9PD$Kt3+}OMtEXy_C1Vs4O&td_W$%Jy<d_rzP-l=;WQ6Q$iPovhZ_2#Ju?yk{AZ=`t>knvEezYpciaB>Ej- z_-W9K?P34nujlnCg#~052C=+luOwFp*)=jq0EWo)LiN5}&avlLSlv0S5EC+UXv=A1{E#>kJ@tAH7+j$4Z9i!DnB1}m(j?1hHzcD4tv$%0b zlopQB=ptQn`XS0zl;DGrjtA9_i1Ia)$YOwWD)Ukk`)U1)Rm3lOX0e9lC#QwT>Wl-6 zav#CDwMUh?cKVX#6*CpRUyJC0)HbsbK_CBN0*wehUu_DFs?b8r?_~skLbBPaDXd_= z3|2lqnWAP{d1ROSqMh0t3r*OmFG*+x%=Lfjg0QeoA}-&D5W>A9E2RC8@^Z~oVV*#w;w0W`}z8nV&&7ZRL2I>Yn$t1 z+NrsZZ-{1@bv3z&JFVt4Y6EyS=HSa-u6~Dg_8G=$;V(6HwD%8D-GdoWa_5O(=t*@l zBAo$96k%<_Lf{w|sP2wWUPK?^-?WmOUdyv4Ojuy6ceX z2#|mGpgO)=d;| zpMU6R(~>+=htK*S!qXUGt()4{-DC#T0*}NVJml^Uu!( zf-9nb!Uun$z;XV}*nGRT+y+z?FS_S!{V=3^w;eaM7m#J%a`D-cMinYqu>ij}JT!Z1 zAenRcw`Ajb49TpJx^(dB-4B4^m3~=+_}L%;3pHxxg?~Hv)fhksy&H?|wQUB>C!QXB zQ}SXemtNlvLL8-ZK>5{Exg027fRX>rPc!cUquhGuRN*SJA0DsJo&gs6UaceKrq$G_ zUNYz*l+)#Pby#}qJDdo1MFeF@Ve0iFL8BJ2{|fZ{T$mqNcgB1k-oJ`|1s6~zeqKiw zBW~@F>#IfJKy9)T`tmy37E;G?ex7QuBO#mLD)-!}H@yJcIhEmuiDxh;?cuVmJ$@d4 z%V3K0?tg|%d$CQDJIO~38llIb!X5wq1MQ`QFCr&cQE7+*VgwnjKybsutGCv^rp2_N z0cRZKDab}my$TfBoz9u~Pw~%L~WRCaRrgdMJp*OofGn9G` zSQ`_K)yHj1JH5mfU+{&!mrC@FBuk|>? zBome%2je6VvWKOKeRkpEXAZyh&my8FV{r1p$!v&%qhYC%X9ya=sz*}p3&qq8G&_t7 ze=ZE>80%kocC6YAr9XhiH|cdgaKSWl7I$g*m;#HyQwurwH}VV#;O}N#6QSaEFbiis zW?iutt?JN$HCl1anhW5j|hMIR(Z#HwO= z^-Kn%TYc}g)!@&{K0!dgW)z$2sV8CXJoYy!NT zIU+UO!qmfxH`i<*2WWjWgZGDb+S0n0;Qc}m8o+$rdkX~$k+IN{4RDxdktwEm40NS? zFT-)nJ&2JMR3vW#(hV1Iv?%oB+PAeCw0fyuRv_M)_7|raipZ>?iCVs7cj2~1{bgLN zg!l+0%L>G)6B|W6t$FB$ucJRkc*SPIaM(bz$c7#0Q`hS=Cuex`|wEj)kSuo8t5 zj6O&!l}jf3er#kAC;nvm_~(uOSv&24fX7LK{+`$?n8IheskoFPJ<~K5DK2-KrtrFa zthbl-Mrx|-__Mr|lBrIyb!Suk*Ub4My3R3E=s%NIAl}(7fyRt-dU0(48B2g^fPLWQ%xwQF}0 zUDXiUF&3IW6X;hvF{38NO+@C&DCMi8zW{#&`yp1*bnfPti?I&q{OZ|akK3QQdotOC z(%p|7D3P}*-5YP?<}*wT^kj#%2v)5_~QFbr$1*X4Rt>#0!ym8YxDrN?(|t+6^VYYpmO92Uv9z zstD4*Y`3t>>rtVFdhinTXyHnb^K~odnEdAEYY4*AL&fXbj>lC)`7l!oUvOA zv+yBksEm+s6|B5;ju<_FD$A{v@&U`Fy2HPQ)YWdraSQU2@7<$26_rMU%{yLJxY;_F4|CR`}gC48HlHU>5bCWmKFaiE!E(60-{7RDEQ!+FPZySnrk%1KX zI-gf=wXl z3oPkC%F8$QUAzS-|3hpZVZooCS;1Rs)&yX;ZX5_IMkkTMQMSbzQhr=%&6kHPFz}!^ zy1^3SCaN7K0_vCs5(xNWnA(tA)G(U*SLt51PoOE^LSAG#NHCrA*qx*eMuQKLtFsll zd{6Mb!Y;e%3up!NJiIOizw=p?J+VMC(;xZZbf`5q>P6i`sEK*82@VHa`LVQ$e-&dC zS=9Ufx_4@!0CY{~=*Vb1AO`q~%?3o*#vu?9)8byd?TPE?6Fd#sobaD9PAmivzFTz! zL1i-&mY9Y@ZV*rJ#TfZ%Uk0Y#%-^Z!|6=h<5JaL&FEwO$johu*H!*^|V739m-(&*g zLF85vVR>d$j_7(x%VM_v3h}CRSM;F|sq4h`BUqy3+CSxZbqkx(f!dMVRlFAB`8p7N zJ80!Y!6UmwQcineVP57Z2XZD4K@_2w1{mK~ieRQqeFJnuj)sa8Zkf3uZhx~?N%j}b zC$AY^#)jBzB6NjI{#yQ7a@-cPWs`1#49LCz{aYbkf5l}{fR|Rt26_zp;RFi}!?KT* zKtDzfntgCl^9Tj_t5`b2UY;9aJGzV)3j~qvc9qdnthBMp>qGa)y6e@O)ImX&bhX!I zc;VFIRR>Cadh9@8chbvD4rcjeP{w3?1n6jEU+Y+{GkT2w_SIRQ_kFnv$kx*Sbz|s4 zN?>;K>CQ%o@ORq}+w2!+vT89UkV0m!zI6Xxajk5ri8WOv7=o`XZQh3>s8$!o{CIO~ z7v)7#R6=V-BVvqtFn#z2nl|QyNtru_N^p0uGPS0}c^%X2&ycRD<{wg}JKXs|_@{nS z?=VnJ#&ALIDhbO2zXAfsSFCkTk0Di$=_}ZLb}`*`jIQbtmW8IB<0r!C;$jz0?3ZL_-O4ylOb4sjkY01zyZTf z^_iornQUUN@TgfeYnT(o|FW&ts_5iAHO_A5M`u1+C|u()J33k_F7 zyI4Qd8E9IP{t-;9AP{KSc$!&V$rutSq6ZRmX-+cQ`V?3KTz{tu9xP0Uhyte>Z3}Jg z-yORJV#COpd{ZskZm#G_z{3WMYoJA>(iZBI5xB5G&Z_QxAr6d=Zd#khpKI=ZrW2pI z_4j<(Ty^s5Fue_- z{O;wy4!#W@`70bk#B*K=V@FSe;rxl}!?k6k)~sH zWzdZO>sCs3#(Xfb@$?r=ixLC+0IC1Vd5e;eBuL9b@c0`;$S8k%G`K8u>XX}4C7A-a z?Ju79LP3@k)l#D|R>~utAyQ6@)~5XWow{_U0p~x3LiwC?jP8NFsI({=?o0zu0!QoW z?PM~8`s22(l!Pfizqt#EAErpO?Qz?3mYey#pSW0H^~;NQ}6g zw-V0#uHNg5p)csr6LTywXZi#PLt73R)L(~5tYUuItlQhoBiBl}*p5Eudlellas9Zv z6Nqq0xunc`0XgfudU6a)R~o$1$KjHT|a@C&^@j z9|9Dsrwt}W{pYzRAJEJJWT0z+RZj1(r2gVpeLL-wod^Sy#dMIA{}Fi&vrc=kQ@HC<>UGH+oj!I zMrQB{==seMW>T|u$C|~C_JSU9#X(N*v`ao%Sd^#6a2RDZggSF7D*8|ifPGkbfv?c@ zZbQf<;6Bz1IX^?~x4v|P%#d)Scl=1$(`!p;)D~uFD{VM$43lEaFguGWG636nMD64A z!B4yNG+Gn4-zem;$KxE6_?cf`rgioVTQ>0A;aRzw%G5?Og>A$M_ya$#M-Jsxrd%k< zu3^IK^)2Yw*flXfC^@B(8Fjc)8*C`!gun0T|a_ zu+d+-`^jkH@Z%fqF|)E>^vrh1*8W3_>Px-+q2j-%H!?;l#H}Z@n|MRaH%VpfJ}D#v zLqV_L@`WuaweAZwwSaD+%8t%vM5;JD(HD)nFh&59w^O^A2Lm$X|L{aZQZT7ZXuY^Y=uzl5TRg5M5tDFvq5M(s0l5WQ(x~5a+xttr)9Brh zD?@eiw3I61@8f@COKY3T+**G|RABeUbrIF)Oy4~tD85)+;*x%{un~jW4*Y=MnMTaVN^2#o}3%%cQ9z-xOLiSI$Kj)L@#w((J)DlJ%= z8KL7=S$^hPSUCscQ8vm)o?i&&7cZz_W9awAnsSc_g5%ifp*b@X7*7`Z?*|TYt7P{X zB?c2&VDi<)@~>o%z_yO4!e9I!Fyic(X|cMOgEJadyo{x_4~^!K^B_fJd#hGl^m>9oh7QB&0!${kvO zsuSjb#!WRpKLb!sm60Z`JVgll9;0h*?jpkY-T@Zye7-$^ZaMvL3}X&5Ac;z{lKOEm zSIPGa*`Jj?f98kArIA&VEuYW=f$1f&H4~KZ&ry?ZIQ$VKqb6u-YbFXaV0@N7s>(Ik z2F9%JKw~!RPpi-T!^1Sh>e~q<0{%{`Ac+xL#sTl!3}L3pW`EV=7xt@}Vr`n{C)HQX z%BkGU3av&)6DHRi4%pux*c-L{3X>rYOZ_JjYJFZ4+YQF`P z62NBmeQf<+4jooU3E~%$PyU#s^fPom8`xm}uA9h?Prcaq0EIKwFTxBYwCR>zWDhX~ zc__U3U$dVHx?d>#l!_U_jg$?dmMOj#T`Qxxe?Tn zgRMsQU=Sc`7NZ8MPjUK$C2dL|(5kv^2tm-7vMOl)=jpGzW@sZa@$y&tt>*LSshP>a zEcE37%igX)12b$54VOlk+7(;}Ugv@fSv$etZK$~}?fWhfr!OFrYC%> z!IHGSx6jC+LuVMwKr!gX@b_Q1={P$g&0;<8AK*g_R1xY!GmVK7KXmUra+nxUT|Ro>^X1D z!@e7f)|2e$x>eEcT@Grh$FkCq#~-a(M|D$#tQdOfRk0E<{8eADtl(ka#E&bu{8nwi zaN*?*3#$<%-oiAtFFrixq|;D%b0Fq~#L((W5DlpbTOkpQPys8`a{PDY*K`RIpJ_xK z1kJt+jy@BTmEqf;{XqVl3sNu%GWmeIglGDOorMMIZolen23Wa^8RjqKuOi*YV{PrZ zR1joAv_l)#5s=YEnNM0lbD>eWiP4%hVqq8W`r3cikzLkw`4r@Ep)e_((T5Av#U!P| z?>U7n4b*+S{J1d;RuwKC1U1_nYL&)VmMHNq^@oF+tS^i!0pRvv1rK{^LKqU;pGn z-~0x;;Xql6PZZIwT(i+jxTfJ>`s_og3O>2QkHVR^vODbi$8KKkix+)kopbJF3h_|y zrpd#=MT3H@D!KCPs3&fe!T6~LHw>Q$$(rf8##T^sa(^Z5qz&wT24&;yB!7nA&>MAy zNYW)X8Q0~41yE!xz7pxI;42l{oW=g$`@K~B$P-?MgM8nusri9~p+)K?hXRQ*=Ovud z_g&vT`xnXffi9x%T)3QN^^cyi3d|FEJgTS9PnNUSIRuW=IwML?`mXFv$ydvfN@N&< z1Oze*iv*5`6w;lyH$8n_2(smA->5?Y=;jj_7`F%W6cj>(qPjf(XOVSEJ@f%v>_ymJDQNT_hw%S?(tSD^=;ZbGM}Ux{b-ZF)LPq={dfs z@136~b8JoXwnX||5EhFNaJoz_Pu-8&$0T;QxaMVs_v8x!|CxQ81|-KIEIVNd6hIj6 z?{1KR>x7yUDQSfxA&O+r?NY4oH3(**+31&{(tYvnI49{ruX!t#7Yoz`s;x_mmZ83m zlZlkL%BK>W{R|?$P%it@*HIG%|Ez-Se15q6Hi1p@11{9h(VB1d*G>77G)0GCwK_4{ zxM2wLzZAAx>s-MbSfaEsdF|uOHAW^Eg75XwE^KPJk`!oES-5%ok|vTWyZc{P;Duub zb_&&RvOTT5i%kpDdmg0%012o=U)&Y{N-!|N1exPlu%oHr^JodBu|F=$!pE3af=vc? zTLz}KPULG7uG!KHFg@k`JhKa-@lb`k-i&dB>U<7Ob}rZ+Hya?SnnsQeIK?IrcRII% zk%*G(4^-GaeM=Hk&p;aET=T?I{XLKS`bONsaBoV-2ul}A0o293MBV%esL3Au67{Iy zNW$^KZVeGOnd+HMLdCN;Yw(wXbPwpBsgd)NdzAqRD5k@ z5Q=^2p!GVGA<>^SF=5+sZ)Lc$Zz^|*{N;w>t9#La^y;k;47|Gg*7^*_Pe$6h0e>qE z`_hG0Ds`1)>mkXb@*6k4vTftWWaAKvkNbI}RyISgQUt3kS=7b;V$+{hfIqUh`Kr-e z${Ke$d|WEhS?=8?HVc^d&C_ zBLh@JBxFmTzrr`8s~L45;^*mm?USUb*-e0Rw89Ll(ZR@@A|Y-qKNimk)@CTt9mQ7Q z?wAnD&Z!~hzpjCMbSR^9x~Pr2(WbUt5MS*mPGXx`q8Lj$G+B-nc{J=C^k=SF<)JMK zP%kK#IlCa!u%c!3Comk6oXlzLZE=$_86r(wb_Q$&eEE4_G{f%ASz#h&&4r>V2Qhie z4MZHmHr}vym2HVx)&G`m01SbNj5a6AeJ$b9aZ*iDb_ClT!poU&o|&rm zljziBR@Wk%{|KOOP)3~MI!GoHdv8t`Z#<^UGSEi_M!Hw-;7?3S_^MYH*hr_BX$>f{VO}GyDY=lPSY~2{V@lKR)=5s!J*89HI9=gZ&G9rUZ-F_i3 zwMF3#Y;s}kNE}Eelr=RFE~m;TZB&?RNd#(Apy7f^IB`SG0-6K;U+&MGiuFUhV$(oB z;)&uTPLVRtaH)~mE+!Ja)X!wJu&s*T+brhiZbCGfzr|XUR{!%0=g;QXi%zC2sB0@n z9|Y6BAltn%9Mo`^i9ZLSD5OcQpGq4d3JF?yqcWBSM+JTD?iHirPL(sVg6w8@ zX7B7wkCs>uI#>3V>|KxIEUao78pK=}F0~|m<8W@F|M#&VxL}OtHJ6)dLsY52gB0*b zsMn8I=tfl9>hK2-13?FUV6J(L-P#WTP;92VL5|S@b-{_$89uhywKr%I^?op9~97wjHNJ<@Du%n6q^8YpoOi83{ zX7he)U!&DD()9S;{x+=H<%LTA% zV?087^Df)=-t0DWK*UEroFem@9nevosC}0|LJ{*R{)A1=&8Maj^wkzqp3~*uBrXX= z(tg>Q7{v(p-gkoA%*y+9p z+f2990^4dTp|omCpnmy96cI9 zqyE$H9-P|dJ3mtXh{64#r;-%#hvxcWR!+bCkiYmeNCn+$yI9q(P%z!1{g_S)Cwl*E z|JB38p6$D~#De*`3*#;$OHzux;_Yhpw}%H78xL2C*B4e#wk^fm@5gWKhcwm8AOH%R zM(@*TGgY3QD@?p5N9oS1g5Wac7eo(3Y)=dh=;cHbrXwJP9iK&gxW}$;cREH2tyPf~ z8U>pk)9F5aBon~X0q6`R75K;e`pmeR4JdQd_$~;m=1~BTIISge%>N)dL`<7_Yc=8q zeHt&e=Bex3g(Sp@{1$9`?611~J<50clL%4>$TCM$Xn&c1Y^+^HMoY!85yb6jde|FI=<9y9s97)MbUPh$OjTBxiqy@^eAG)$@?hcP;2{ihV<%JIc7gx_pZ#&9T5d4q*C z)`IrmgzlX?NuVMA1trUHRA!MEZl2o2Yhnt)`7inUfbr+t-b3oN;WX?M1Q~=#BpZH| z%1NjmM}F^|#o6oJ|A_m$Tyt!Yjp?)AxT~l-N9fddok%@>Qc|zl*3ifQ0-Ewk#|Fkd7Q-4>GU5QKyNbv_;+CCH{mi7h zj`voVkayUWB2g_JyyUo}3wd%aRoo*qFn)7XhEeWE1>^jvgUj!FNIj(l*};9OTPGo9 zfRt6{N0EB;(%`~$r3}v#r3@!W?$JsOCoXSmil;y%KPfoNm126PrXWOmv$IMS`)QUjw zfu)~|roxN*68F8^PoPAD90)_P~Rw^qh5R%a(TsBeaY&Y*h;Y4UQVop(JP6g<~%C$>3~n0m|r zej_-Hi1gAl*C)pXbz##Rq)NGlCewo*L2Ox7QO$vsS1m2g?1;{}aSY`|;}D9Bo?B10 zJwP(NyoZzAg|wXMtaVD@v^z?`zZ4dw2(RCg96RAaX+baAEh*kat#q`5zLGc)6FwOuk&GL5ATGmi=<)RRN=#^0+F1sU+P|1u{3tSd+<;h4-D2{ zE2#Ut4f<{=PHy6M>P!@5(DrI!4UEdvDk3Pq;`hZCNk}Rj-2TZ2!!qNxB5%y#!=%Om zN<;Cx>`7eRQSFddZ&8WI_|_B(@QKSC?-(9>fxqo+j1yoiKwI%$waQ}|<~%=%7>eAP z__Ex%3p(|#{IVR*^vig`f(gnDd*z6ap6Iw&g(oYK%`kf*J^v+13z>nCu++&tq}QB9 zxfGq_7$^|`!Z6|@;^#4#Hj!6B(^r1~{8*`lLA|l^8$k@41uKen7J$RWBrx&o?ZKO1 z@}Axj>`KVg;gT)b_F3h)dtV1ykjVOAM|S#OXbnb5VDi@iC^Enq4>r)|3E7EAIUbK= zA~Hhedym|_n)=Fn=6At_RL>`dARy=)H!WC6WN!7J%gg8YNwi-4&&wKfu~dZpHb=>; zudy74~K9@g8 zHZgbhG+@5oi!e>XXr20pQ+|x$wDI7ZZl5TKN=LH>Z}d)d8bQ?m{M=Tozmfrq%DyW4 zL=e95Hr_TKV^RJ$de@XP@s^m(lyw2(|~yKrOzU+V?H! zi|oGvoJ?P7&FrcB*Ts6bH!|U6{vfYH>Cc+zv%CgmEKpPtH?&Sx`O!}7^IRl*Md3{P zzWa>K+fbJ9v(CCOZ0&-k=Ze(B(AU4o7*A4AcX`JJk zEf&9Yi%zz?iA~c;`f8@wZPN1??+j0Xi=43auien4pwpBF|vC;8Ra&yR(ir#Lnq#TV}y2hz5Q5F zbYV|Yr$8st_en11CrZ6>cg2B(W~a2kFKJ_I=NAg{0YIVj<2f!MaQCnM&BBMs_i=mJ z8HvSduh(+5iZ^oVqXbN$_M6=L7byMnbXI*S7OQ&~($I4D)@ib+$^E>;aAt2-9BYS) zR5FYW$Hwsy!ffMm+Yil;p+`yPVGO8@xGOWl@}UgoS*i2b`7{12?u%*rjQa{pHMb{$ zsJfpiOU@~!Vo-hr`v+@!(X-;`~0LG-Mc37 zF-z@ch6~TJ_+4-p8(FublX6J8_4*OJrBje3=Ei$0M_XukaW7Vb_T1K};6JXf zEZ`NI>`ai+T~~^Oz<30Dzt)OkBmp#AS?57bfKUI_aY0a5?sVoNeRDjkOFtU$3YQ*M zR|P@x6>VBf1OgLUxJDsms2;?SHceV zip^zF={R>}@$F6P2(*x}cU|BH6osDvVCkFt>o@{9)i4SQsnd=!6H8zfVC`4Q-Tkc} zhg9W07#ud+F=_n;<0O&^xHn^={Wl2@%>1H-E(P=xc{~AF=saaj;QnaKW34j4mVCJc z4PxQh#e-M72Y6925Pkt!VtP&?oT~KS>u4HqM>UTVc--gDLBNa#o{LMaZ)4PFe8shn z9xQ_r$@E;<^_0@1ZmHldI#cXpXn@w8{I4!y74HqYt$}p%5VbZcvqA6hnxF-kf-5#6 zcKSdkw@gp<>O*wO2nqNuV^cxJ-VtvRz$l2qtQ0}1`mSE0lI>z1Xm?YWZR21kx+3C8 z(!^}^sAwPOC8EWaUsjd)CjS2ydTsoVXCmWF3P*nl5b|U5ji-kDBLFHxy>4aw3-z(T zqe{hls&EhTh8lQ%-a^#0xkcO;pXDGg1D@pqlVJ7E+t%{aR`-PrR z|MqwpHJ>0dyXG!*c;}y)YCe;6mL@@@LzN4*M{)d?GsZS|0wpr$6$j+1##ov zW_c!yWZ!fBgn*A^Y|@AC1UwbUOmocCyU6Ur-7-&xGP(k(IIcuoXm9`O z0L9hGytD1+!v?wP0E-#==&WdL_6ncN8E4_7vYVVoT;-}1%9^jEO)|79Z*Selqc48{ zUDl?2GW#1~9-2&!<5c$q$1MoC(dlwqz2|s(oC4K#zNP@0P4}RS9XHO1xvyS=1!Zis zx=GO&P^gU~xNs?9S2XahMD&2QPid{WyGs-l=vy1~>`hk9%3GFxBW_Wg+{B%=yI`%i zXW?5R>sX(q0%+;1r_X7ae!b@z?bP+~RFEe{=AR){dIUt~8wFoJKG5GYfB%PB?lV4; zmm~FGK$;pXPh6Oh3KwMHC@36~OhXlq+{Qt*2q_n2@o~tQS>sH@ z0JL^y_yYZA`ywmM6h0@qpV=bB-~2~vOZ>zE>bZR3A*d4HPy@M8HgnKd6U*KHW4Euv z?TZ18$&FY^Ms?TvD}h$V+Kw^Y1`kHu<<`|rMrCmq`(Uv$_gb!Pl@hg%|(zJnKtwieA`({rJs@hOB9xA~+z#bEI# z4EJqpwEah5S*}9@^2rs;xRhXAL#u$itq7I8en{j5R{V|s6 z2Zq={AGW4952e)u6g}%rm^qd}0u)bkD3SKdpI7m<%tI^3L(Lv)Z~)06%lezc9PjW`doO$%n=0Rh$q}?K zIyy(Z%Bt$;A0xT%KlxH|r2G9?(Vx5U+PhSA^Nt;ISnN)7aTM*fC)1@i*>(l?eI*%m z*v)$LPCBPH;(`gvdQY%n)*%I~i2}qzz4g7k-HFQusR!4Hb5GIJ^DSAHG|axS964wvi=+Y{5R{j6 zH8%elox6MM6c;1XJvZLW!(>*K63gzU0xq1ytK5qLX}xg+VTjfQb-t9xg%bvi{M3iq zKeBhDH&`o!I_9k8`~uBJ1szjh;L(le83%iDD2X+3JDP7|Cvi0Y8KtcHia4JHz9c1l zG<-$b(bHuj2$9gYt#Hi!sagCgtA9=mwM7V8z%JpK9n7yN9Q zyuWFwY*SPso2$@xK>-t>rNIJ%Q&AK#Xt$2sPSLyUM)a18(ECF`~d5(+nffKuG6lSj=gg+K(2+my>^ebKAk1c2Kw8-Ct-q z;Q&8dLLD?Q!id&<6l-TTpa^KVZ* zX7wA0TWFC6%KBU@9AtCCLI%$GX|>!bub$>@JW0-`1t}{7@T9dpjSx)ucU#dFwR)w6ZMmE3Yxc7 znBv5?CS0BWw))8`%Z!33Cs<@9lSWr^v_1AL-J^^gF4>wtjD0d0N0r% z9S?GXyslmZx4Y>&y%jf}wB>a=?)^3UG@O;nob#5ScV#(OhBf9XL?wOQH*z zs)T@pN9SWrG}tfd6ZU{VG4|2{!zX|~i14mZhh2)$1Ow1ssM-rOK$-pRH*-jmnGN%v zf+cSJU0z|Z-cDp389ZJwz(~MWXu6uLFkB|&Bf5_~HXTkA7vI_VkNV(f>ohmBA)f%# zDvJ@l<@?hx_VEXgTW0@_CXoNrLi2phpD2g9X}5$y4y z{XT$gv>2z`aZzULDcSBY$)9a(p>A+6>nC33e`{u%Zhtxl=DNX2-4>YuO?P*vw5P&= zAHDvCbTRM9=jER$K{>UlJR@rww69I9pV3QgJH<=D|1W|Hef5gL+kws5i_jUy^FLIT z7s+~t0;|X`wXhDQNK4Tc+G!W#?ip)mzwatoC*^VhAhs=w%`agtsJ0;?WM&l)BJuz5 zp)+`vXQd)i#7a3z5XAQV9fEFneAGW&rEmvzyf1kG(o@C1M`NiDR;eHOo*=M?fbnbI z1nc*K^Pm0y-#_*b)Sj?{8m)^5(poXG3`A(4$5^z+sV;#s1~~<*ysr+h-r6XOP#J@; z_taF3wE{WZz|UejKd`H|xVX5$`nWgn=ED2RkQsTBYayXpVnbJ68H2P|!XSv1=s7FAb)A1`=X*9S(ZR(WKq~@4iE7fApV!|K{J^ z{ZUPg-6&azU+$!;(tEe=%{dyl4YMkmDGI`BsCwRERgJM)?|F&!M?*!ySUZokGiPD7 zF8cy&D@7r&c7zpZ>Ohj1bX%-Uh;dlEwk?lr99_9E8{89>gjUt4%u!*i;~eW(ORP+y z(AvGHC8UjP(e^(QD|_r`V0F`Er*#rVHKA}N?_m&R7=L8FH~;ec!1*Wt$@eGzgXE8p zQtZhxb*wU#$0|#@mGQAqxGWAi>wH|X8ee=xjCgst6~t*+Z}T{9bF5&s5W~u0ZS>O0 z7!V5qv64dM_ZD+k4X{d<9eU+=ZL;KL`U#_wDH3JO2}!S@gUg~|{voP>OW z8ALH!rI*$vQz=h_Zrg`%b#El~wXuiA30PZc9bm1nk@e)Uf*1_lQA>1T$!sp7f9-zS74+D&@4QD27>unuG-L6~WQ zwW~8q`}XiTDVaEyM3LIXqA}qE;Q7N^#*#{1!$@3E*KeM>j)%;NSYdBrPE24Op4o@M zs>nlCX(nZ9M`p;S#ZOBAS6cn)U;Kma@%X=z@;D?nD$D+m7lk=-*u2cO>VKLtUSdCv>~8 zQ%H4pxvbICP_cM4^WMc+1yQ87K+!K~jIUqhGtLPkA>}qjVl@3V>blH5q|m2J1+XIF zDnI+)M^hl2WYdvv4e} zUl1|0$Erm87WANXK33BwV(on!pcZ+DXwj#{x*E$TY!2c^;qkV_<5^hvoa zw#fSkm3sf0G;GkMQP*d*_=E!F5{VXlYG1%FvFZ%0Q9Ab))_(roZiN5;YxBSTPya1G zs`*F%@cm>jqMA8?)q0~C)*S^k zbH^RlbT&&2Ys~|8wHjUfLzdm>y$~N4rFFu97!wOOL3ktgqK2jxR;QR&uucJ1>#fjB z6tnW4!hq1C9xMf`7DNW|zSIbbfNWNy>p3~bVO4r{l=2+w{-LT8uuhe+PHR}Xwr~ot zu0$1F)%?UPyNr4;t>(QVD;vZd79ArsIHmyW!dSXxV&yI$GN&&L;^{X1rTX2!`a663 z|My@0o&Lwa`G?=X`;QYY@0IXcA*8UN))Z8X5RhFQCGIx{*4o;an=4i^sr91Ih=K~S zZsjg&V69~-?zRMBYf-j9dRk@7pNSo+E-Y4pb&&(8kYCwS!s6cHOB?PhK2&F3c_CKW z!lmZAvSQjQ`sB)RiFF7RR3F8vik>el79G~D;w(uigyiozT-RAq`z+eB-ijtg!eY^( z5>ce1!+K1>s$>Dbz#45u^O0dJMeY|Z7VXqOH~;JZ_%GmR+!i$d&cFXRdK!Tuy_?HP zu11$Go~X{X@mxi5zk-V66)|M3&AgohNztrobg7^OvA{N33=Y-GSZgFjIa!bEnt;`X zGmV;s6nb`XZ<8H*6kH9X?cNLRckH1U-NQSO+5br1W=WW*Hi(!sFq0 zR#9%Y7S>U8Q2)+R|L*Yzzy25Mcfb1y|Lk9p?_7@gNB{1B{~cNb#@gzk;}layn~a5v zCz7N!ly7*iS;I(5XqK>mHeK|!`%48yoOMj>-5X&|XcvY@}bIDO&hGg>mTNyKL6%_{{Q&z=Ueb^{_1y=QGfaU zyWg!{h>LzoyarDlEMvvw2#!+aK}rwLz{(OXa4Nw%_%PhFQrnWKXd0wM%{EJ?sOke) z$H5=yt+9fU!UT@u0bQh6Od(d)39J+eRb{_^MF{?+f~UoN-d|NcMx?KDpR zRBaqOAgvaprr_fKqWx@`%xRl$QQrV7BzbK|0zXBy2x~(lpqBW_qLu}ejg=MC8?5W- zCX0HkIg>?871JvOlpmHK;Jh7MFq`xI+y?3$AR|_uqWV=}5L21LMfLFSrrY-!@_m+s z{}5L%;OX4%fBgMI{`18L4p@h;l8N~8Y$>LWjXmPcy+Vx3t*C6P_?;9JNDM1C7~B)L zuIfF+x2dtu?mU15(brZ?3*mJIL2u{R3=e<~oOduJP_&QuGh@2_{*TpP z&pjKK^~fFMbpD_J^RK@1I{%IC)IU^Ir^D6gtFkF9(42Myh-Sai5XIJR%P3r)R=BtcmqdVVjv; z;o64kqd5ZM;$S&ao5>QXRPm!j=InRXzL~3}=5pIChc%HXGStAT+ji6jvBUu}QX8-i z+Ucx4tR;E$P#9~Sew6y}zW?(tfclJVG$IJZWdC;H?I`tMsz3eHf2O|v;4i+z5q}DY z&-cRqW0ldJ;4EQ<)bT(nt=upmu6OC&h+N~8WK2QT8bRDj!m9QqR_!RBa2So#ynuBk z)3q&ruJo2zAyhg^tPe6UXvD(m*a0lOzpfd)hSgQJ8|}tu@Q8(&l9WwRuPQvG%ryem zz6-qd=)~ybpW9gN1=VF`iPhrto_c_FrCZDEJ#;)^{_pQc{y#=D{x9Dy_kXAU`mg^k b<&*y!aaUfeXM*8400000NkvXXu0mjfhZ4Fg diff --git a/src/components/common/ActionSheet.tsx b/src/components/common/ActionSheet.tsx index 79c8344..34de6e6 100644 --- a/src/components/common/ActionSheet.tsx +++ b/src/components/common/ActionSheet.tsx @@ -15,16 +15,23 @@ type RectComponentProps = { onClose: () => void; headerComponent?: ReactNode; children?: ReactNode; + _props?: any; + _header?: any; }; const ActionSheet: React.FC = memo( - ({ isOpen, onClose, headerComponent, children }) => { + ({ isOpen, onClose, headerComponent, children, _props, _header }) => { const { width } = useDeviceSize(); return ( - + = memo( top="8px" onClick={onClose} /> - {headerComponent && {headerComponent}} + {headerComponent && ( + {headerComponent} + )} {children} diff --git a/src/components/common/cards/ClassCard.tsx b/src/components/common/cards/ClassCard.tsx index 2ea3138..1ee91c7 100644 --- a/src/components/common/cards/ClassCard.tsx +++ b/src/components/common/cards/ClassCard.tsx @@ -30,12 +30,10 @@ const ClassCard: React.FC = memo( }; return ( {/* Class Header */} diff --git a/src/components/common/cards/SubjectGrid.tsx b/src/components/common/cards/SubjectGrid.tsx index ffaf516..1237488 100644 --- a/src/components/common/cards/SubjectGrid.tsx +++ b/src/components/common/cards/SubjectGrid.tsx @@ -62,7 +62,7 @@ const SubjectGrid: React.FC = memo( key={`subject-${index}`} w="100%" // divider={} - justifyContent={"space-around"} + justifyContent={subject.length < 4 ? "flex-start" : "space-around"} > {subject && subject?.map( diff --git a/src/components/common/icons/Icon.tsx b/src/components/common/icons/Icon.tsx index 8c10bf3..993c438 100644 --- a/src/components/common/icons/Icon.tsx +++ b/src/components/common/icons/Icon.tsx @@ -369,7 +369,7 @@ const IconByName: React.FC = ({ - - ) : ( -
- )} -
- )} -
+ {/* Sticky UserCoinInfo Footer */} + ); }; export default LeaderboardScreen; -interface PopupProps { - activeCollapse: "history" | "view" | "none"; - width: string | number; - defaultValue: string; - handleCollapseToggle: (collapse: "history" | "view") => void; - handleViewChange: (type: string) => void; - t: any; -} - -const PopupCustom: React.FC = ({ - activeCollapse, - width, - defaultValue, - handleCollapseToggle, - handleViewChange, - t, -}) => { - const [radioValue, setRadioValue] = useState(defaultValue || "School"); - - return ( - - - - - {t("LEADERBOARD_VIEW")} - - - handleCollapseToggle("view")} - /> - - - - {t("LEADERBOARD_HOW_YOU_STAND_WITH_OTHER")} - - setRadioValue(value)} - gap="8px" - > - - - - - {t("LEADERBOARD_SCHOOL")} - - - {t("LEADERBOARD_DEFAULT")} - - - - - - {t("LEADERBOARD_CLASS")} - - - - - {t("LEADERBOARD_BOARD")} - - - - - - - - ); -}; - interface HeaderWithFiltersProps { heading: string; onBack?: () => void; @@ -712,71 +181,67 @@ interface HeaderWithFiltersProps { rightComponent?: React.ReactNode; } -const HeaderWithFilters: React.FC = ({ - heading, - onBack, - onFilterClick, - selectedView, - rightComponent, -}) => { - return ( - - {/* Back Icon & Heading */} - - - - {heading} - - - - {/* Right Side (Customizable) */} - {rightComponent || ( +const HeaderWithFilters: React.FC = memo( + ({ heading, onBack, onFilterClick, selectedView, rightComponent }) => { + return ( + + {/* Back Icon & Heading */} - + - VIEW + {heading} - onFilterClick && onFilterClick("dropdown")} - cursor="pointer" - > - - {selectedView || "School" || "Select"}{" "} - - + + {/* Right Side (Customizable) */} + {rightComponent || ( + + + lineHeight="12.1px" + cursor="default" + > + VIEW + + onFilterClick && onFilterClick("dropdown")} + cursor="pointer" + > + + {selectedView || "School" || "Select"} + + + - - )} - - ); -}; + )} + + ); + } +); diff --git a/src/pages/leaderboard/Students.tsx b/src/pages/leaderboard/Students.tsx new file mode 100644 index 0000000..81e9166 --- /dev/null +++ b/src/pages/leaderboard/Students.tsx @@ -0,0 +1,183 @@ +import React from "react"; +import { + Table, + TableContainer, + Thead, + Th, + Tr, + Tbody, + Td, + Text, + VStack, + RadioGroup, + Radio, + HStack, + Button, +} from "@chakra-ui/react"; +import { useTranslation } from "react-i18next"; +import ActionSheet from "../../components/common/ActionSheet"; + +interface StudentsProps { + data: any[]; + bodyHeight: string; + activeCollapse: string | undefined; + radioValue: string; + handleViewChange: (radioSelection: string) => void; +} + +const Students: React.FC = ({ + data, + bodyHeight, + activeCollapse, + radioValue, + handleViewChange, +}) => { + const { t } = useTranslation(); + const [localRadioValue, setLocalRadioValue] = React.useState(radioValue); + + React.useEffect(() => { + setLocalRadioValue(radioValue); + }, [radioValue]); + + return ( + + + + + + + + + + + {data.map((item: any, index) => ( + + + + + + ))} + +
{t("LEADERBOARD_NAME")} + {t("LEADERBOARD_RANK")} + + {t("LEADERBOARD_COINS")} +
+ + {item?.userId === localStorage.getItem("id") + ? "You" + : item?.name} + + + {item?.className} + + + + {item?.rank} + + + + {item?.points} + +
+ handleViewChange(localRadioValue)} + headerComponent={ + + + {t("LEADERBOARD_VIEW")} + + + {t("LEADERBOARD_HOW_YOU_STAND_WITH_OTHER")} + + + } + > + + + + + + + {t("LEADERBOARD_SCHOOL")} + + + {t("LEADERBOARD_DEFAULT")} + + + + + + {t("LEADERBOARD_CLASS")} + + + + + {t("LEADERBOARD_BOARD")} + + + + + + + +
+ ); +}; + +export default Students; diff --git a/src/pages/leaderboard/UserCoinInfo.tsx b/src/pages/leaderboard/UserCoinInfo.tsx new file mode 100644 index 0000000..9342a24 --- /dev/null +++ b/src/pages/leaderboard/UserCoinInfo.tsx @@ -0,0 +1,414 @@ +import { + Box, + Button, + Divider, + Flex, + HStack, + Radio, + RadioGroup, + Spinner, + Text, + VStack, +} from "@chakra-ui/react"; +import moment from "moment"; +import React, { useState } from "react"; +import { useTranslation } from "react-i18next"; +import ActionSheet from "../../components/common/ActionSheet"; +import { getCurrentUserdetail } from "../../services/home"; + +const IdentifiersList = { + subject_completion: { + label: "Subject Completion", + }, + assesment_completion: { + label: "Quiz Completion", + }, + content: { + label: "Content Completion", + }, + lesson_completion: { + label: "Content Completion", + }, +}; + +interface CoinInfoProps { + activeCollapse: string | undefined; + width: string; + handleCollapseToggle: (content: string) => void; + handleViewChange: (radioSelection: string) => void; + myData: any; +} + +const UserCoinInfo: React.FC = ({ + activeCollapse, + width, + handleCollapseToggle, + handleViewChange, + myData, +}) => { + const { t } = useTranslation(); + return ( + + + + + } + > + + + {t("LEADERBOARD_YOUR_RANK")} + + + {myData?.rank} + + + {/* Vertical Divider */} + {/* YOUR COINS */} + + + {t("LEADERBOARD_YOUR_COINS")} + + + {myData?.points} + + + {/* +32 Coins for Quiz */} + + + + +{myData?.lastEarnedPoints?.[0]?.points} + + + {t("LEADERBOARD_CONIS")} + + + + {t( + myData?.lastEarnedPoints?.[0]?.identifier === + "subject_completion" + ? "LEADERBOARD_SUBJECT" + : myData?.lastEarnedPoints?.[0]?.identifier === + "assesment_completion" + ? "LEADERBOARD_QUIZ" + : "LEADERBOARD_CONTENT" + )} + + + {myData?.lastEarnedPoints?.[0]?.created_at && + moment(myData?.lastEarnedPoints?.[0]?.created_at).fromNow()} + + + {/* VIEW HISTORY Button */} + + + + + ); +}; + +export default React.memo(UserCoinInfo); + +interface PopupProps { + activeCollapse: string | undefined; + width: string | number; + handleCollapseToggle: (content: string) => void; + myData: any; +} + +const PopupCustom: React.FC = ({ + activeCollapse, + handleCollapseToggle, + myData, +}) => { + const [coninsData, setCoinsData] = useState(); + const [page, setPage] = useState(1); + const [hasMoreData, setHasMoreData] = useState(true); + const [loadingMore, setLoadingMore] = useState(false); + const { t } = useTranslation(); + const handleClose = () => { + handleCollapseToggle(""); + setPage(1); + setCoinsData([]); + setHasMoreData(true); + setLoadingMore(false); + }; + + const fetchUserData = async (currentPage: number) => { + try { + if (loadingMore) return; + setLoadingMore(true); + const data: any = await getCurrentUserdetail(currentPage); + + if (!data || (data.totalPages === page && data.totalPages !== 1)) { + setHasMoreData(false); + setLoadingMore(false); + return; + } + setCoinsData((prevData: any) => [...(prevData || []), ...data?.points]); + setLoadingMore(false); + } catch (error) { + console.error("Error fetching user stats:", error); + setLoadingMore(false); + } finally { + } + }; + const handleScroll = (e: React.UIEvent) => { + const { scrollTop, scrollHeight, clientHeight } = e.currentTarget; + if (scrollHeight - scrollTop === clientHeight && hasMoreData) { + setPage((prevPage) => prevPage + 1); + } + }; + React.useEffect(() => { + if (!page || !hasMoreData || !activeCollapse) return; + fetchUserData(page); + }, [page, activeCollapse]); + return ( + + {/* Title: Coins History */} + + {t("LEADERBOARD_COINS_HISTORY")} + + {/* Right Section: Rank, Coins, and Close Button */} + {/* Your Rank */} + + + } + > + + + {t("LEADERBOARD_YOUR_RANK")} + + + {myData?.rank} + + + {/* Your Coins */} + + + {t("LEADERBOARD_YOUR_COINS")} + + + {myData?.points} + + + +
+ } + > + + + {coninsData?.map((item: any, index: number) => ( + + + + {item?.points} {t("LEADERBOARD_COINS")} + + + {moment(item?.created_at).format("D MMM, YYYY")} + + + + + {IdentifiersList[ + item?.identifier?.toLowerCase() as keyof typeof IdentifiersList + ]?.label || item?.identifier} + + + + ))} + {loadingMore ? ( + + + + ) : ( + + {t("LEADERBOARD_NO_DATA")} + + )} + + + + ); +}; diff --git a/src/pages/teacher/ClassDetails.tsx b/src/pages/teacher/ClassDetails.tsx index cceb10e..f0931d3 100644 --- a/src/pages/teacher/ClassDetails.tsx +++ b/src/pages/teacher/ClassDetails.tsx @@ -16,6 +16,7 @@ export default function ClassDetails(props: any) { const [classDetails, setClassDetails] = useState({}); const navigate = useNavigate(); const [selectedSubject, setSelectedSubject] = useState(subject); + const [loading, setLoading] = useState(true); useEffect(() => { const fetchProgramId = async () => { @@ -36,6 +37,8 @@ export default function ClassDetails(props: any) { } catch (error) { console.error("Error fetching program data:", error); setError(t("An unexpected error occurred. Please try again later.")); + } finally { + setLoading(false); } }; @@ -58,8 +61,10 @@ export default function ClassDetails(props: any) { return ( { const payload = { groupId: classDetail?.Group?.groupId, @@ -52,7 +50,7 @@ export default function TeacherHomepage(props: any) { board: classDetail?.Group?.board, }; - classDataArray.push(classObj); + return classObj; }) ); setClasses(classDataArray); @@ -95,6 +93,8 @@ export default function TeacherHomepage(props: any) { isFooterVisible={false} _header={{ userInfo: true, + isShowLogOutButton: true, + bgc: "green40", }} loading={loading} > @@ -105,19 +105,18 @@ export default function TeacherHomepage(props: any) { ) : ( - - - - + + {classes?.map((group: any) => ( = (payload) => { - - {filterSubjects(students || []).map((student, index) => ( - - - + + + ))} diff --git a/src/utils/theme.tsx b/src/utils/theme.tsx index fc1f2d6..3846927 100644 --- a/src/utils/theme.tsx +++ b/src/utils/theme.tsx @@ -101,6 +101,8 @@ const customTheme = extendTheme({ lightGrey: "#828282", greenColor: "#219653", tsSeaBlue20: "#03627C33", + tsSeaBlue40: "#023B4A", + green40: "#03570E", }, components: { Table: { From 2058b5046c702f707c89e07046d68587765be65c Mon Sep 17 00:00:00 2001 From: deepali-chavhan <140379634+deepali-chavhan@users.noreply.github.com> Date: Tue, 4 Feb 2025 18:56:57 +0530 Subject: [PATCH 4/5] Task #234597 fix: Add Alert for Question Set or Video Not Available (#150) Co-authored-by: deepali chavhan --- src/components/players/SunbirdPlayer.tsx | 38 ++++++++++++++++--- .../videos/videoReel/AssessmentPlayer.tsx | 1 + 2 files changed, 34 insertions(+), 5 deletions(-) diff --git a/src/components/players/SunbirdPlayer.tsx b/src/components/players/SunbirdPlayer.tsx index 65e2584..a94f72c 100644 --- a/src/components/players/SunbirdPlayer.tsx +++ b/src/components/players/SunbirdPlayer.tsx @@ -1,9 +1,12 @@ import { CloseIcon } from "@chakra-ui/icons"; import { + Alert, + AlertDescription, + AlertIcon, + AlertTitle, + Box, Center, - CircularProgress, IconButton, - Text, VStack, } from "@chakra-ui/react"; import React, { useRef, useEffect, useState } from "react"; @@ -33,6 +36,7 @@ interface SunbirdPlayerProps { playerContext?: object; batchsize?: number; LoaderComponent?: any; + isAssessment?: boolean; } const SunbirdPlayer = ({ @@ -44,6 +48,7 @@ const SunbirdPlayer = ({ forwardedRef, adapter, LoaderComponent, + isAssessment = false, ...props }: SunbirdPlayerProps) => { const iframeRef = useRef(null); @@ -133,7 +138,6 @@ const SunbirdPlayer = ({ setLoading(false); }; - // console.log(adapter); if (url) { return ( @@ -198,9 +202,33 @@ const SunbirdPlayer = ({ ); } else { return ( - {`${mimeType} this mime type not compatible`} + ref={setRefs} + > + + + + + Something went wrong with ID + + + We couldn't process your request. Please check the ID and try + again. + + + + ); } }; diff --git a/src/pages/videos/videoReel/AssessmentPlayer.tsx b/src/pages/videos/videoReel/AssessmentPlayer.tsx index b97df14..a957b79 100644 --- a/src/pages/videos/videoReel/AssessmentPlayer.tsx +++ b/src/pages/videos/videoReel/AssessmentPlayer.tsx @@ -288,6 +288,7 @@ const AssessmentPlayer: React.FC = ({ ) : ( ( )} From fcebb01323077ef268d516288190838928fc396e Mon Sep 17 00:00:00 2001 From: deepali chavhan Date: Wed, 5 Feb 2025 11:09:29 +0530 Subject: [PATCH 5/5] Task #0000 fix: Deployment issue fixed --- src/components/common/layout/Header.tsx | 5 ++++- src/pages/Home.tsx | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/components/common/layout/Header.tsx b/src/components/common/layout/Header.tsx index cb041ab..0f285f7 100644 --- a/src/components/common/layout/Header.tsx +++ b/src/components/common/layout/Header.tsx @@ -28,7 +28,7 @@ export interface HeaderProps { suggestions?: string[]; searchTerm?: string; onSearchChange?: (value: string) => void; - onSuggestionClick?: (suggestion: string) => void; + onSuggestionClick?: () => void; bottomComponent?: React.ReactNode; progress?: string; selectedView?: any; @@ -48,6 +48,8 @@ export interface HeaderProps { setModalContent?: any; isShowLogOutButton?: boolean; bgc?: string; + isSearchBackButtonHidden?: boolean; + onSubjectSelect?: (subject: string) => void; } const Header: React.FC = ({ @@ -70,6 +72,7 @@ const Header: React.FC = ({ setModalContent, isShowLogOutButton = false, bgc, + isSearchBackButtonHidden, }: HeaderProps) => { const { t } = useTranslation(); const [isOpen, setIsOpen] = useState(false); diff --git a/src/pages/Home.tsx b/src/pages/Home.tsx index 3fd1679..40d89c5 100644 --- a/src/pages/Home.tsx +++ b/src/pages/Home.tsx @@ -39,7 +39,7 @@ export default function Homepage(props: any) { const [subjects, setSubjects] = useState>([]); const [selectedSubject, setSelectedSubject] = useState(null); // set null const [suggestions, setSuggestions] = useState([]); - const [searchTerm, setSearchTerm] = useState(); + const [searchTerm, setSearchTerm] = useState(); const [videos, setVideos] = useState(); const [error, setError] = useState(null); const navigate = useNavigate();
+ = (payload) => { {t("LEADERBOARD_NAME")} + = (payload) => {
{student.username}{student.completionPercentage}
{student.username} + {student.completionPercentage} % +