From 6ed2898c56af60238f8d80d196b70152e2170fe2 Mon Sep 17 00:00:00 2001 From: Nandana-pradeep33 Date: Wed, 21 Aug 2024 23:33:34 +0530 Subject: [PATCH 01/31] fix: fixed issue with college search filter for onboarding registeration --- package-lock.json | 4 ++-- .../pages/Onboarding/CollegePage/CollegePage.tsx | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index aae6c97ed..28bf96b06 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "mulearnfrontend", - "version": "0.0.4", + "version": "0.0.5", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "mulearnfrontend", - "version": "0.0.4", + "version": "0.0.5", "dependencies": { "@chakra-ui/react": "^2.6.1", "@emotion/react": "^11.10.6", diff --git a/src/modules/Common/Authentication/pages/Onboarding/CollegePage/CollegePage.tsx b/src/modules/Common/Authentication/pages/Onboarding/CollegePage/CollegePage.tsx index d19c7f946..328a67c12 100644 --- a/src/modules/Common/Authentication/pages/Onboarding/CollegePage/CollegePage.tsx +++ b/src/modules/Common/Authentication/pages/Onboarding/CollegePage/CollegePage.tsx @@ -79,7 +79,7 @@ export default function CollegePage({ ): boolean => { if (value === "Others") return true; // Always show "Others" option if (!string) return true; - return label.toLowerCase().startsWith(string.toLowerCase()); + return label.toLowerCase().includes(string.toLowerCase()); }; useEffect(() => { From 3ccdb6a46a26f11db652b2739c4149dc19a81fa6 Mon Sep 17 00:00:00 2001 From: ansan johny Date: Sat, 5 Oct 2024 20:39:10 +0530 Subject: [PATCH 02/31] feat:Userinterest selection page --- src/App.tsx | 3 +- .../UserInterest/UserInterest.module.css | 147 ++++++++++++++++++ .../Onboarding/UserInterest/UserInterest.tsx | 100 ++++++++++++ 3 files changed, 249 insertions(+), 1 deletion(-) create mode 100644 src/modules/Common/Authentication/pages/Onboarding/UserInterest/UserInterest.module.css create mode 100644 src/modules/Common/Authentication/pages/Onboarding/UserInterest/UserInterest.tsx diff --git a/src/App.tsx b/src/App.tsx index a5c709691..c831f5bb7 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -47,6 +47,7 @@ import Donation from "./modules/Public/Donation/Donation"; import Refund from "./modules/Public/Donation/pages/Refund"; import DonationSuccess from "./modules/Public/Donation/pages/DonationSuccess"; import OpenGrad from "./modules/Dashboard/modules/OpenGrad"; +import UserInterest from "./modules/Common/Authentication/pages/Onboarding/UserInterest/UserInterest"; const Profile = lazy( () => import("./modules/Dashboard/modules/Profile/pages/Profile") @@ -291,7 +292,7 @@ function App() { element: , children: [ { path: "register/:role", element: }, - { path: "register/", element: }, + { path: "register/", element: }, { path: "login", element: }, { path: "forgot-password", element: }, { path: "reset-password", element: } diff --git a/src/modules/Common/Authentication/pages/Onboarding/UserInterest/UserInterest.module.css b/src/modules/Common/Authentication/pages/Onboarding/UserInterest/UserInterest.module.css new file mode 100644 index 000000000..5a0ebf398 --- /dev/null +++ b/src/modules/Common/Authentication/pages/Onboarding/UserInterest/UserInterest.module.css @@ -0,0 +1,147 @@ +.popUp { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100vh; + backdrop-filter: blur(10px); + background-color: #00000014; + z-index: 100; + display: flex; + justify-content: center; + align-items: center; + + .box { + background-color: #fff; + border-radius: 20px; + padding: 40px 10px 10px; + min-height: 300px; + max-width: 700px; + position: relative; + z-index: 100; + display: flex; + align-items: center; + flex-direction: column; + + & img { + height: 30px; + } + + & h1 { + font-size: 1.5rem; + font-weight: 600; + } + + .subText { + font-size: 12px; + font-weight: 500; + margin-bottom: 10px; + } + + .rolePageCards { + gap: 1.5rem; + z-index: 10; + cursor: pointer; + display: flex; + flex-wrap: wrap; + padding: 20px; + justify-content: center; + } + + .rolePageCards .rolePageCard { + width: 215px; + height: 130px; + border-radius: 10px; + background-color: #fff; + box-shadow: 0px 0px 17.65823px 0px rgba(0, 0, 0, 0.07); + display: flex; + align-items: center; + flex-direction: column; + text-align: center; + justify-content: center; + gap: 1rem; + padding: 10px; + position: relative; + } + + .rolePageCards .rolePageCard:hover { + outline: 1.177px solid #456ff6; + transition: 1s ease; + } + + .rolePageCards .active { + outline: 2px solid #456ff6; + } + + .rolePageCard div { + display: flex; + } + + @media (width<500px) { + .rolePageCards .rolePageCard { + width: 300px; + } + } + + @media (width<300px) { + .rolePageCards .rolePageCard { + width: 200px; + font-size: 0.65rem; + } + } + + .checkmark { + position: absolute; + top: 0px; + left: 0px; + transform: translate(-30%, -30%); + color: #ffffff; + background-color: #3e15d4; + border-radius: 50%; + padding: 2px; + } + + .otherInterestInput { + width: 100%; + padding: 10px; + margin-top: 10px; + border: 1px solid #ccc; + border-radius: 4px; + } + + /* New styles for Others option */ + .rolePageCards .rolePageCard.others { + position: relative; + overflow: hidden; + } + + .rolePageCards .rolePageCard .othersTextBox { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: #fff; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + padding: 10px; + transform: translateY(100%); + transition: transform 0.3s ease-in-out; + } + + .rolePageCards .rolePageCard.active .othersTextBox { + transform: translateY(0); + } + + .rolePageCards .rolePageCard .otherInterestInput { + width: 90%; + padding: 8px; + margin-top: 10px; + border: 1px solid #ccc; + border-radius: 4px; + font-size: 14px; + } + } +} diff --git a/src/modules/Common/Authentication/pages/Onboarding/UserInterest/UserInterest.tsx b/src/modules/Common/Authentication/pages/Onboarding/UserInterest/UserInterest.tsx new file mode 100644 index 000000000..b2da4ad57 --- /dev/null +++ b/src/modules/Common/Authentication/pages/Onboarding/UserInterest/UserInterest.tsx @@ -0,0 +1,100 @@ +import React, { useState } from "react"; +import { useNavigate } from "react-router-dom"; +import OnboardingTemplate from "../../../components/OnboardingTeamplate/OnboardingTemplate"; +import OnboardingHeader from "../../../components/OnboardingHeader/OnboardingHeader"; +import { PowerfulButton } from "@/MuLearnComponents/MuButtons/MuButton"; +import styles from "./UserInterest.module.css"; +import muBrand from "/src/modules/Common/Authentication/assets/µLearn.png"; + +const CheckMark = () => ( + + + +); + +export default function UserInterest() { + const [interests, setInterests] = useState([ + { title: "Software", value: "software", checked: false }, + { title: "Makers", value: "makers", checked: false }, + { title: "Management", value: "management", checked: false }, + { title: "Creative", value: "creative", checked: false }, + { title: "Others", value: "others", checked: false } + ]); + const [otherInterest, setOtherInterest] = useState(""); + const navigate = useNavigate(); + + const handleInterestChange = (value:any) => { + setInterests(interests.map(interest => + interest.value === value ? { ...interest, checked: !interest.checked } : interest + )); + }; + + const handleContinue = () => { + const selectedInterests = interests.filter(interest => interest.checked).map(interest => interest.value); + if (interests.find(interest => interest.value === 'others')?.checked) { + selectedInterests.push(otherInterest); + } + console.log("Selected interests:", selectedInterests); + // Here you can add logic to navigate or process the form + // For example: navigate('/next-step'); + }; + + const isAnythingSelected = interests.some(interest => interest.checked); + + return ( + + +
+
+ mulearn +

What describes you the most!

+

+ Choose one or more roles that best fit your profile. +

+
+ {interests.map((interest) => { + let classname = `${styles.rolePageCard} ${ + interest.checked && styles.active + }`; + return ( +
handleInterestChange(interest.value)} + > + {interest.checked && } + {/* {interest.icon} */} +

{interest.title}

+
+ ); + })} +
+ {interests.find(interest => interest.value === 'others')?.checked && ( + setOtherInterest(e.target.value)} + className={styles.otherInterestInput} + /> + )} + {isAnythingSelected && ( + + Continue + + )} +
+
+ +
+ ); +} + From 88181ce3abf3d87df1653768b4dbda69fb7b32df Mon Sep 17 00:00:00 2001 From: Aswanth Vc Date: Sun, 6 Oct 2024 01:37:34 +0530 Subject: [PATCH 03/31] feat: tags input --- package-lock.json | 16 ++ package.json | 1 + src/App.tsx | 15 +- src/main.tsx | 14 +- .../AccountCreation/AccountCreation.tsx | 36 ++-- .../UserEndgoals/UserEndgoals.module.css | 120 +++++++++++ .../Onboarding/UserEndgoals/UserEndgoals.tsx | 42 ++++ .../UserInterest/UserInterest.module.css | 177 +++++++-------- .../Onboarding/UserInterest/UserInterest.tsx | 204 ++++++++++++++---- .../services/newOnboardingApis.ts | 2 +- .../pages/ConnectDiscord.module.css | 1 + .../ConnectDiscord/pages/ConnectDiscord.tsx | 171 ++++++++++----- .../modules/ConnectDiscord/services/apis.ts | 22 +- src/services/urls.ts | 3 +- 14 files changed, 611 insertions(+), 213 deletions(-) create mode 100644 src/modules/Common/Authentication/pages/Onboarding/UserEndgoals/UserEndgoals.module.css create mode 100644 src/modules/Common/Authentication/pages/Onboarding/UserEndgoals/UserEndgoals.tsx diff --git a/package-lock.json b/package-lock.json index 28bf96b06..0d96f7edc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -33,6 +33,7 @@ "react-select": "^5.7.7", "react-spinners": "^0.13.8", "react-tabs": "^6.0.1", + "react-tag-input-component": "^2.0.2", "react-tooltip": "^5.18.1", "recharts": "^2.10.2", "sass": "^1.62.1", @@ -8963,6 +8964,15 @@ "react": "^18.0.0" } }, + "node_modules/react-tag-input-component": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/react-tag-input-component/-/react-tag-input-component-2.0.2.tgz", + "integrity": "sha512-dydI9luVwwv9vrjE5u1TTnkcOVkOVL6mhFti8r6hLi78V2F2EKWQOLptURz79UYbDHLSk6tnbvGl8FE+sMpADg==", + "peerDependencies": { + "react": "^16 || ^17 || ^18", + "react-dom": "^16 || ^17 || ^18" + } + }, "node_modules/react-tooltip": { "version": "5.18.1", "resolved": "https://registry.npmjs.org/react-tooltip/-/react-tooltip-5.18.1.tgz", @@ -17043,6 +17053,12 @@ "prop-types": "^15.5.0" } }, + "react-tag-input-component": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/react-tag-input-component/-/react-tag-input-component-2.0.2.tgz", + "integrity": "sha512-dydI9luVwwv9vrjE5u1TTnkcOVkOVL6mhFti8r6hLi78V2F2EKWQOLptURz79UYbDHLSk6tnbvGl8FE+sMpADg==", + "requires": {} + }, "react-tooltip": { "version": "5.18.1", "resolved": "https://registry.npmjs.org/react-tooltip/-/react-tooltip-5.18.1.tgz", diff --git a/package.json b/package.json index f224b002c..44c0dde72 100644 --- a/package.json +++ b/package.json @@ -36,6 +36,7 @@ "react-select": "^5.7.7", "react-spinners": "^0.13.8", "react-tabs": "^6.0.1", + "react-tag-input-component": "^2.0.2", "react-tooltip": "^5.18.1", "recharts": "^2.10.2", "sass": "^1.62.1", diff --git a/src/App.tsx b/src/App.tsx index c831f5bb7..81a01c0f4 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -48,6 +48,7 @@ import Refund from "./modules/Public/Donation/pages/Refund"; import DonationSuccess from "./modules/Public/Donation/pages/DonationSuccess"; import OpenGrad from "./modules/Dashboard/modules/OpenGrad"; import UserInterest from "./modules/Common/Authentication/pages/Onboarding/UserInterest/UserInterest"; +import UserEndgoal from "./modules/Common/Authentication/pages/Onboarding/UserEndgoals/UserEndgoals"; const Profile = lazy( () => import("./modules/Dashboard/modules/Profile/pages/Profile") @@ -292,7 +293,19 @@ function App() { element: , children: [ { path: "register/:role", element: }, - { path: "register/", element: }, + { + path: "register/", + children: [ + { + path: "", + element: + }, + { + path: "interests", + element: + } + ] + }, { path: "login", element: }, { path: "forgot-password", element: }, { path: "reset-password", element: } diff --git a/src/main.tsx b/src/main.tsx index 8e97becfc..c8ca74222 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -5,11 +5,11 @@ import { ChakraProvider } from "@chakra-ui/react"; import ErrorBoundary from "./components/ErrorBoundary"; ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render( - - - - - - - + // + + + + + + // ); diff --git a/src/modules/Common/Authentication/pages/Onboarding/AccountCreation/AccountCreation.tsx b/src/modules/Common/Authentication/pages/Onboarding/AccountCreation/AccountCreation.tsx index 1693863df..22fc2d84b 100644 --- a/src/modules/Common/Authentication/pages/Onboarding/AccountCreation/AccountCreation.tsx +++ b/src/modules/Common/Authentication/pages/Onboarding/AccountCreation/AccountCreation.tsx @@ -225,22 +225,22 @@ export default function AccountCreation() { userData.dob = dwmsData.dob; } - const isSuccess = await validate({ + // const isSuccess = await validate({ + // userData: userData, + // setIsSubmitting: setIsLoading + // // toast: toast // Make sure to pass the toast parameter correctly + // }); + submitUserData({ + setIsLoading: setIsLoading, userData: userData, - setIsSubmitting: setIsLoading - // toast: toast // Make sure to pass the toast parameter correctly + // toast: toast, + navigate: navigate }); + // if (isSuccess && selectedRole.toLowerCase() !== "other") { + // navigate("/register/about", { state: userData }); + // } else if (isSuccess && selectedRole.toLowerCase() === "other") { - if (isSuccess && selectedRole.toLowerCase() !== "other") { - navigate("/register/about", { state: userData }); - } else if (isSuccess && selectedRole.toLowerCase() === "other") { - submitUserData({ - setIsLoading: setIsLoading, - userData: userData, - // toast: toast, - navigate: navigate - }); - } + // } }; // console.log(selectedRole, role); @@ -258,7 +258,7 @@ export default function AccountCreation() { > {formik => (
- {popUP && ( + {/* {popUP && (
mulearn @@ -302,7 +302,7 @@ export default function AccountCreation() {
- )} + )} */}
@@ -631,10 +631,10 @@ export default function AccountCreation() { {selectedRole.toLowerCase() !== "other" ? isLoading ? "Validating..." - : "Next Step" + : "Register" : isLoading - ? "Validating..." - : "Submit"} + ? "Validating..." + : "Submit"}
diff --git a/src/modules/Common/Authentication/pages/Onboarding/UserEndgoals/UserEndgoals.module.css b/src/modules/Common/Authentication/pages/Onboarding/UserEndgoals/UserEndgoals.module.css new file mode 100644 index 000000000..0f47a0877 --- /dev/null +++ b/src/modules/Common/Authentication/pages/Onboarding/UserEndgoals/UserEndgoals.module.css @@ -0,0 +1,120 @@ +.popUp { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100vh; + backdrop-filter: blur(10px); + background-color: #00000014; + z-index: 100; + display: flex; + justify-content: center; + align-items: center; + + .box { + background-color: #fff; + border-radius: 20px; + padding: 40px 10px 10px; + min-height: 300px; + max-width: 700px; + position: relative; + z-index: 100; + display: flex; + align-items: center; + flex-direction: column; + + .buttons { + width: 100%; + display: flex; + gap: 1rem; + padding: 0 1rem; + justify-content: flex-end; + } + & img { + height: 30px; + } + + & h1 { + font-size: 1.5rem; + font-weight: 600; + } + + .subText { + font-size: 12px; + font-weight: 500; + margin-bottom: 10px; + } + + .endGoalPageCards { + gap: 1.5rem; + z-index: 10; + cursor: pointer; + display: flex; + flex-wrap: wrap; + padding: 20px; + justify-content: center; + } + + /* @media (min-width: 768px) { + .rolePageCards { + grid-template-columns: repeat(2, minmax(0px, 1fr)); + } + } + + @media (min-width: 1024px) { + .rolePageCards { + grid-template-columns: repeat(3, minmax(0px, 1fr)); + } + } */ + + .endGoalPageCards .endGoalPageCard { + width: 215px; + height: 100px; + border-radius: 10px; + background-color: #fff; + box-shadow: 0px 0px 17.65823px 0px rgba(0, 0, 0, 0.07); + display: flex; + align-items: center; + flex-direction: column; + text-align: center; + justify-content: center; + gap: 1rem; + padding: 10px; + } + + /* .cardSmall .rolePageCard { + height: auto; + flex-direction: row; + } */ + .endGoalPageCards .endGoalPageCard:hover { + outline: 1.177px solid #456ff6; + transition: 1s ease; + } + + .endGoalPageCards .active { + outline: 2px solid #456ff6; + } + + .endGoalPageCard div { + display: flex; + } + + @media (width<500px) { + /* .rolePageCards { + grid-template-columns: 1fr; + margin-top: 1.5rem; + } */ + + .endGoalPageCards .endGoalPageCard { + width: 300px; + } + } + + @media (width<300px) { + .endGoalPageCards .endGoalPageCard { + width: 200px; + font-size: 0.65rem; + } + } + } +} diff --git a/src/modules/Common/Authentication/pages/Onboarding/UserEndgoals/UserEndgoals.tsx b/src/modules/Common/Authentication/pages/Onboarding/UserEndgoals/UserEndgoals.tsx new file mode 100644 index 000000000..c8948c489 --- /dev/null +++ b/src/modules/Common/Authentication/pages/Onboarding/UserEndgoals/UserEndgoals.tsx @@ -0,0 +1,42 @@ +import { Formik } from "formik"; +import OnboardingHeader from "../../../components/OnboardingHeader/OnboardingHeader"; +import OnboardingTemplate from "../../../components/OnboardingTeamplate/OnboardingTemplate"; +import styles from "./UserEndgoals.module.css"; +import { Form } from "react-router-dom"; +import { useState } from "react"; +import muBrand from "/src/modules/Common/Authentication/assets/µLearn.png"; +import { PowerfulButton } from "@/MuLearnComponents/MuButtons/MuButton"; + +export default function UserEndgoal() { + const [initialValues, setInitialValues] = useState({ + endGoal: "" + }); + const onSubmit = async (values: any) => { + console.log("values", values); + }; + const [selectedEndgoal, setSelectedEndgoal] = useState(""); + const endgoalOptions = [ + { + title: "Job", + value: "job" + }, + { + title: "Higher Education", + value: "higher_education" + }, + { + title: "Entrepreneurship", + value: "enterpreneurship" + }, + { + title: "Gig Works", + value: "gig" + }, + { + title: "Other", + value: "other" + } + ]; + + return <>; +} diff --git a/src/modules/Common/Authentication/pages/Onboarding/UserInterest/UserInterest.module.css b/src/modules/Common/Authentication/pages/Onboarding/UserInterest/UserInterest.module.css index 5a0ebf398..9aeb6074f 100644 --- a/src/modules/Common/Authentication/pages/Onboarding/UserInterest/UserInterest.module.css +++ b/src/modules/Common/Authentication/pages/Onboarding/UserInterest/UserInterest.module.css @@ -38,7 +38,7 @@ margin-bottom: 10px; } - .rolePageCards { + .interestSelectCards { gap: 1.5rem; z-index: 10; cursor: pointer; @@ -46,102 +46,109 @@ flex-wrap: wrap; padding: 20px; justify-content: center; - } - - .rolePageCards .rolePageCard { - width: 215px; - height: 130px; - border-radius: 10px; - background-color: #fff; - box-shadow: 0px 0px 17.65823px 0px rgba(0, 0, 0, 0.07); - display: flex; - align-items: center; - flex-direction: column; - text-align: center; - justify-content: center; - gap: 1rem; - padding: 10px; - position: relative; - } - - .rolePageCards .rolePageCard:hover { - outline: 1.177px solid #456ff6; - transition: 1s ease; - } - .rolePageCards .active { - outline: 2px solid #456ff6; - } - - .rolePageCard div { - display: flex; + .interestSelectCard { + width: 215px; + height: 130px; + border-radius: 10px; + background-color: #fff; + box-shadow: 0px 0px 17.65823px 0px rgba(0, 0, 0, 0.07); + display: flex; + align-items: center; + flex-direction: column; + text-align: center; + justify-content: center; + gap: 1rem; + padding: 10px; + position: relative; + transition: all 0.3s ease; + + &.interestOther { + &.checked { + display: flex; + width: calc(410px + 3rem); + justify-content: center; + flex-direction: column; + } + } + + .checkmark { + position: absolute; + top: 0px; + left: 0px; + transform: translate(-30%, -30%); + color: #ffffff; + background-color: #3e15d4; + border-radius: 50%; + padding: 2px; + } + + .otherInterestInput { + width: 100%; + padding: 10px; + margin-top: 10px; + border: 1px solid #ccc; + border-radius: 4px; + } + + div { + display: flex; + } + + &:hover { + outline: 1.177px solid #456ff6; + transition: 1s ease; + } + + &.others { + position: relative; + overflow: hidden; + } + .interestOther { + background: red; + } + + .othersTextBox { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: #fff; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + padding: 10px; + transform: translateY(0); + transition: transform 0.3s ease-in-out; + } + + .otherInterestInput { + width: 90%; + padding: 8px; + margin-top: 10px; + border: 1px solid #ccc; + border-radius: 4px; + font-size: 14px; + } + } + .active { + outline: 2px solid #456ff6; + } } @media (width<500px) { - .rolePageCards .rolePageCard { + .interestSelectCards .interestSelectCard { width: 300px; } } @media (width<300px) { - .rolePageCards .rolePageCard { + .interestSelectCards .interestSelectCard { width: 200px; font-size: 0.65rem; } } - - .checkmark { - position: absolute; - top: 0px; - left: 0px; - transform: translate(-30%, -30%); - color: #ffffff; - background-color: #3e15d4; - border-radius: 50%; - padding: 2px; - } - - .otherInterestInput { - width: 100%; - padding: 10px; - margin-top: 10px; - border: 1px solid #ccc; - border-radius: 4px; - } - - /* New styles for Others option */ - .rolePageCards .rolePageCard.others { - position: relative; - overflow: hidden; - } - - .rolePageCards .rolePageCard .othersTextBox { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-color: #fff; - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - padding: 10px; - transform: translateY(100%); - transition: transform 0.3s ease-in-out; - } - - .rolePageCards .rolePageCard.active .othersTextBox { - transform: translateY(0); - } - - .rolePageCards .rolePageCard .otherInterestInput { - width: 90%; - padding: 8px; - margin-top: 10px; - border: 1px solid #ccc; - border-radius: 4px; - font-size: 14px; - } } } diff --git a/src/modules/Common/Authentication/pages/Onboarding/UserInterest/UserInterest.tsx b/src/modules/Common/Authentication/pages/Onboarding/UserInterest/UserInterest.tsx index b2da4ad57..1520727bd 100644 --- a/src/modules/Common/Authentication/pages/Onboarding/UserInterest/UserInterest.tsx +++ b/src/modules/Common/Authentication/pages/Onboarding/UserInterest/UserInterest.tsx @@ -5,11 +5,23 @@ import OnboardingHeader from "../../../components/OnboardingHeader/OnboardingHea import { PowerfulButton } from "@/MuLearnComponents/MuButtons/MuButton"; import styles from "./UserInterest.module.css"; import muBrand from "/src/modules/Common/Authentication/assets/µLearn.png"; +import Select from "react-select"; +import { toReactOptions } from "../../../../../Dashboard/utils/common"; +import { Tab } from "@chakra-ui/react"; +import { TagsInput } from "react-tag-input-component"; const CheckMark = () => ( - - - + + + ); export default function UserInterest() { @@ -20,29 +32,55 @@ export default function UserInterest() { { title: "Creative", value: "creative", checked: false }, { title: "Others", value: "others", checked: false } ]); - const [otherInterest, setOtherInterest] = useState(""); - const navigate = useNavigate(); + const [otherInterest, setOtherInterest] = useState([]); + const [stepTwo, setStepTwo] = useState(false); - const handleInterestChange = (value:any) => { - setInterests(interests.map(interest => - interest.value === value ? { ...interest, checked: !interest.checked } : interest - )); + const handleInterestChange = (value: any) => { + setInterests( + interests.map(interest => + interest.value === value + ? { ...interest, checked: !interest.checked } + : interest + ) + ); + }; + const [communityAPI, setCommunityAPI] = useState([ + { id: "aswanth", title: "oteha" } + ]); + + const communityProps = { + name: "communities.id", + // onChange: (OnChangeValue: any) => { + // formik.setFieldValue( + // "communities", + // OnChangeValue.map( + // ( + // value: any = { + // value: "", + // label: "" + // } + // ) => value.value + // ) + // ); + // }, + closeMenuOnSelect: false, + isMulti: true, + value: [], + options: toReactOptions(communityAPI) }; const handleContinue = () => { - const selectedInterests = interests.filter(interest => interest.checked).map(interest => interest.value); - if (interests.find(interest => interest.value === 'others')?.checked) { - selectedInterests.push(otherInterest); - } + const selectedInterests = interests + .filter(interest => interest.checked) + .map(interest => interest.value); console.log("Selected interests:", selectedInterests); - // Here you can add logic to navigate or process the form - // For example: navigate('/next-step'); + console.log("Other interest:", otherInterest); }; const isAnythingSelected = interests.some(interest => interest.checked); - return ( - + return stepTwo ? ( + <>

What describes you the most!

- Choose one or more roles that best fit your profile. + Choose the role that best fits your profile.

-
- {interests.map((interest) => { +
+ {interests.map(interest => { let classname = `${styles.rolePageCard} ${ interest.checked && styles.active }`; @@ -63,38 +101,118 @@ export default function UserInterest() {
handleInterestChange(interest.value)} + onClick={() => + handleInterestChange(interest.value) + } > {interest.checked && } - {/* {interest.icon} */}

{interest.title}

); })}
- {interests.find(interest => interest.value === 'others')?.checked && ( - setOtherInterest(e.target.value)} - className={styles.otherInterestInput} - /> +
+ setStepTwo(true)} + > + Skip + + setStepTwo(true)} + > + Continue + +
+
+
+ + ) : ( + <> + +
+
+ mulearn +

What describes you the most!

+

+ Choose one or more roles that best fit your profile. +

+
+ {interests.map(interest => { + let classname = `${styles.interestSelectCard} ${ + interest.checked && styles.active + }`; + return ( +
+ handleInterestChange(interest.value) + } + > + {interest.checked && } +

{interest.title}

+ + {interest.value == "others" ? ( + interests.find( + interest => + interest.value === "others" + )?.checked && ( + <> +
{ + e.stopPropagation(); + }} + > + +
+ + ) + ) : ( + <> + )} +
+ ); + })} +
+ + {isAnythingSelected && ( + + Continue + )} - {isAnythingSelected && ( - - Continue - - )}
- - + ); } - diff --git a/src/modules/Common/Authentication/services/newOnboardingApis.ts b/src/modules/Common/Authentication/services/newOnboardingApis.ts index dab1c8948..66a2e7fe4 100644 --- a/src/modules/Common/Authentication/services/newOnboardingApis.ts +++ b/src/modules/Common/Authentication/services/newOnboardingApis.ts @@ -165,7 +165,7 @@ export const submitUserData = async ({ const tokens = res.data.response; localStorage.setItem("accessToken", tokens.accessToken); localStorage.setItem("refreshToken", tokens.refreshToken); - getInfo(() => navigate("/dashboard/connect-discord")); + getInfo(() => navigate("/register/interests")); } catch (err: any) { setIsLoading(false); const messages = err.response.data.message.general[0]; diff --git a/src/modules/Dashboard/modules/ConnectDiscord/pages/ConnectDiscord.module.css b/src/modules/Dashboard/modules/ConnectDiscord/pages/ConnectDiscord.module.css index 80bf723e4..c6ea822cb 100644 --- a/src/modules/Dashboard/modules/ConnectDiscord/pages/ConnectDiscord.module.css +++ b/src/modules/Dashboard/modules/ConnectDiscord/pages/ConnectDiscord.module.css @@ -15,6 +15,7 @@ justify-content: space-evenly; background: #fff; /* border: 1px solid #dde2e5; */ + min-height: 250px; border-radius: 20px; overflow: hidden; font-weight: 500; diff --git a/src/modules/Dashboard/modules/ConnectDiscord/pages/ConnectDiscord.tsx b/src/modules/Dashboard/modules/ConnectDiscord/pages/ConnectDiscord.tsx index 2e3bfb133..75b6ac0fb 100644 --- a/src/modules/Dashboard/modules/ConnectDiscord/pages/ConnectDiscord.tsx +++ b/src/modules/Dashboard/modules/ConnectDiscord/pages/ConnectDiscord.tsx @@ -1,17 +1,21 @@ import { useEffect, useRef, useState } from "react"; import styles from "./ConnectDiscord.module.css"; import cdimage from "../assets/images/connectdiscordpng1.webp"; -import { getInfo } from "../services/apis"; +import { connectDiscord, getInfo } from "../services/apis"; import { MdContentCopy } from "react-icons/md"; import { BsDiscord } from "react-icons/bs"; import MuLoader from "@/MuLearnComponents/MuLoader/MuLoader"; import { PowerfulButton } from "@/MuLearnComponents/MuButtons/MuButton"; import { FaInstagram } from "react-icons/fa6"; import toast from "react-hot-toast"; +import { useSearchParams } from "react-router-dom"; const ConnectDiscord = () => { const [muid, setMuid] = useState(""); const firstFetch = useRef(true); + const [searchParams, _] = useSearchParams(); + const token = searchParams.get("code"); + const [discordStatus, setDiscordStatus] = useState("connecting"); useEffect(() => { if (firstFetch.current) { if ( @@ -26,62 +30,87 @@ const ConnectDiscord = () => { firstFetch.current = false; }, []); + useEffect(() => { + if (token) { + connectDiscord(token).then(res => { + if (res) { + setDiscordStatus("connected"); + setTimeout(() => { + var a = document.createElement("a"); + a.href = + "https://discord.gg/gtech-mulearn-771670169691881483"; + a.target = "_blank"; + a.click(); + }, 2000); + } else { + setDiscordStatus("failed"); + } + }); + } + }, []); + return ( <> - {muid && muid.length > 0 ? ( -
-
-
-

Join Discord using your µid

-

- To join our discord server you need to connect - your account with discord. To do so you need to - copy your µid and paste it in the discord - server. -

-
- { - navigator.clipboard.writeText(muid); - - toast.success( - "Copied to clipboard, Please paste it in discord to connect your account" - ); - }} - > - - {muid} - - - - - Connect Discord - - - - -

- Follow Us + {token == null ? ( + <> + {muid && muid.length > 0 ? ( +

+
+
+

Join Discord using your µid

+

+ To join our discord server you need to + connect your account with discord. To do + so you need to copy your µid and paste + it in the discord server.

-
+
+ { + navigator.clipboard.writeText( + muid + ); + + toast.success( + "Copied to clipboard, Please paste it in discord to connect your account" + ); + }} + > + + {muid} + + + + + Join Discord + + + + +

+ Follow Us +

+
+
+
+
-
- -
-
+ {/*

Onboarding Flow

@@ -128,14 +157,46 @@ const ConnectDiscord = () => {

-
-
- ) : ( +
*/} +
+ ) : ( +
+
+ {" "} +
+
+ )} + + ) : discordStatus == "connecting" ? (
{" "}
+ ) : discordStatus == "connected" ? ( +
+
+
+

Discord Connected

+

+ Your account has been successfully connected to + discord. +

+
+
+
+ ) : ( +
+
+
+

Discord Connection Failed

+

+ Your account could not be connected to discord. + Please try again later. +

+
+
+
)} ); diff --git a/src/modules/Dashboard/modules/ConnectDiscord/services/apis.ts b/src/modules/Dashboard/modules/ConnectDiscord/services/apis.ts index 476b64238..791bdbf20 100644 --- a/src/modules/Dashboard/modules/ConnectDiscord/services/apis.ts +++ b/src/modules/Dashboard/modules/ConnectDiscord/services/apis.ts @@ -1,8 +1,26 @@ import { privateGateway } from "@/MuLearnServices/apiGateways"; -import { dashboardRoutes } from "@/MuLearnServices/urls"; +import { dashboardRoutes, onboardingRoutes } from "@/MuLearnServices/urls"; type muid = UseStateFunc; - +export const connectDiscord = async (code: string) => { + try { + return await privateGateway + .get(onboardingRoutes.connectDiscord, { + params: { + code + } + }) + .then(response => { + return response.status === 200; + }) + .catch(err => { + console.log(err); + return false; + }); + } catch (err: any) { + return false; + } +}; export const getInfo = (setMuid?: muid, onComplete?: Function) => { privateGateway .get(dashboardRoutes.getInfo) diff --git a/src/services/urls.ts b/src/services/urls.ts index d12bb37cf..e2ae89df9 100644 --- a/src/services/urls.ts +++ b/src/services/urls.ts @@ -17,7 +17,8 @@ export const onboardingRoutes = { departments: "/api/v1/register/department/list/", companies: "/api/v1/register/company/list/", validate: "/api/v1/register/validate/", - location: "/api/v1/register/location/?q=${param}" + location: "/api/v1/register/location/?q=${param}", + connectDiscord: "/api/v1/register/connect-discord/" } as const; export const authRoutes = { From a6dcfe0e568c4ce55d959bab10079c834f3e858e Mon Sep 17 00:00:00 2001 From: Aswanth Vc Date: Sun, 6 Oct 2024 02:49:20 +0530 Subject: [PATCH 04/31] fix: page switching --- .../UserInterest/UserInterest.module.css | 15 +- .../Onboarding/UserInterest/UserInterest.tsx | 167 ++++++++++++------ 2 files changed, 118 insertions(+), 64 deletions(-) diff --git a/src/modules/Common/Authentication/pages/Onboarding/UserInterest/UserInterest.module.css b/src/modules/Common/Authentication/pages/Onboarding/UserInterest/UserInterest.module.css index 9aeb6074f..5fe5ae70b 100644 --- a/src/modules/Common/Authentication/pages/Onboarding/UserInterest/UserInterest.module.css +++ b/src/modules/Common/Authentication/pages/Onboarding/UserInterest/UserInterest.module.css @@ -38,7 +38,7 @@ margin-bottom: 10px; } - .interestSelectCards { + .itemsContainer { gap: 1.5rem; z-index: 10; cursor: pointer; @@ -46,8 +46,9 @@ flex-wrap: wrap; padding: 20px; justify-content: center; + overflow: show; - .interestSelectCard { + .itemsCard { width: 215px; height: 130px; border-radius: 10px; @@ -63,7 +64,7 @@ position: relative; transition: all 0.3s ease; - &.interestOther { + &.others { &.checked { display: flex; width: calc(410px + 3rem); @@ -83,14 +84,6 @@ padding: 2px; } - .otherInterestInput { - width: 100%; - padding: 10px; - margin-top: 10px; - border: 1px solid #ccc; - border-radius: 4px; - } - div { display: flex; } diff --git a/src/modules/Common/Authentication/pages/Onboarding/UserInterest/UserInterest.tsx b/src/modules/Common/Authentication/pages/Onboarding/UserInterest/UserInterest.tsx index 1520727bd..460c5e462 100644 --- a/src/modules/Common/Authentication/pages/Onboarding/UserInterest/UserInterest.tsx +++ b/src/modules/Common/Authentication/pages/Onboarding/UserInterest/UserInterest.tsx @@ -32,10 +32,34 @@ export default function UserInterest() { { title: "Creative", value: "creative", checked: false }, { title: "Others", value: "others", checked: false } ]); + const [endgoals, setEndgoals] = useState([ + { title: "Job", value: "job", checked: false }, + { + title: "Higher Education", + value: "higher_education", + checked: false + }, + { + title: "Entrepreneurship", + value: "enterpreneurship", + checked: false + }, + { title: "Gig Works", value: "gig", checked: false }, + { title: "Others", value: "others", checked: false } + ]); const [otherInterest, setOtherInterest] = useState([]); + const [otherEndgoal, setOtherEndgoal] = useState([]); const [stepTwo, setStepTwo] = useState(false); const handleInterestChange = (value: any) => { + if (value === "others") { + if ( + interests.filter(interest => interest.value === value)[0] + .checked + ) { + setOtherInterest([]); + } + } setInterests( interests.map(interest => interest.value === value @@ -44,40 +68,56 @@ export default function UserInterest() { ) ); }; - const [communityAPI, setCommunityAPI] = useState([ - { id: "aswanth", title: "oteha" } - ]); - const communityProps = { - name: "communities.id", - // onChange: (OnChangeValue: any) => { - // formik.setFieldValue( - // "communities", - // OnChangeValue.map( - // ( - // value: any = { - // value: "", - // label: "" - // } - // ) => value.value - // ) - // ); - // }, - closeMenuOnSelect: false, - isMulti: true, - value: [], - options: toReactOptions(communityAPI) + const handleEndgoalChange = (value: any) => { + if (value === "others") { + if ( + endgoals.filter(endgoal => endgoal.value === value)[0].checked + ) { + setOtherEndgoal([]); + } + } + setEndgoals( + endgoals.map(endgoal => + endgoal.value === value + ? { ...endgoal, checked: !endgoal.checked } + : endgoal + ) + ); }; const handleContinue = () => { const selectedInterests = interests .filter(interest => interest.checked) - .map(interest => interest.value); - console.log("Selected interests:", selectedInterests); - console.log("Other interest:", otherInterest); + .map(interest => interest); + if (selectedInterests.find(interest => interest.value === "others")) { + if (otherInterest.length === 0) { + return; + } + } + if (selectedInterests.length > 0 || otherInterest.length > 0) { + setStepTwo(true); + } + }; + + const handleSubmit = () => { + const selectedInterests = interests + .filter(interest => interest.checked) + .map(interest => interest); + const selectedEndgoals = endgoals + .filter(endgoal => endgoal.checked) + .map(endgoal => endgoal); + const data = { + choosen_interests: selectedInterests, + choosen_endgoals: selectedEndgoals, + other_interests: otherInterest, + other_endgoals: otherEndgoal + }; + console.log("data", data); }; - const isAnythingSelected = interests.some(interest => interest.checked); + const isInterestSelected = interests.some(interest => interest.checked); + const isEndgoalSelected = endgoals.some(endgoal => endgoal.checked); return stepTwo ? ( <> @@ -90,46 +130,67 @@ export default function UserInterest() { mulearn

What describes you the most!

- Choose the role that best fits your profile. + Choose one or goals you expect from µLearn.

-
- {interests.map(interest => { - let classname = `${styles.rolePageCard} ${ - interest.checked && styles.active +
+ {endgoals.map(endgoal => { + let classname = `${styles.itemsCard} ${ + endgoal.checked && styles.checked }`; return (
- handleInterestChange(interest.value) + handleEndgoalChange(endgoal.value) } > - {interest.checked && } -

{interest.title}

+ {endgoal.checked && } +

{endgoal.title}

+ + {endgoal.value == "others" ? ( + endgoals.find( + endgoal => + endgoal.value === "others" + )?.checked && ( +
{ + e.stopPropagation(); + }} + > + +
+ ) + ) : ( + <> + )}
); })}
-
- setStepTwo(true)} - > - Skip - + + {isEndgoalSelected && ( setStepTwo(true)} + onClick={handleSubmit} > - Continue + Submit -
+ )}
@@ -146,9 +207,9 @@ export default function UserInterest() {

Choose one or more roles that best fit your profile.

-
+
{interests.map(interest => { - let classname = `${styles.interestSelectCard} ${ + let classname = `${styles.itemsCard} ${ interest.checked && styles.active }`; return ( @@ -158,7 +219,7 @@ export default function UserInterest() { classname + " " + (interest.value == "others" - ? styles.interestOther + ? styles.others : "") + " " + (interest.checked ? styles.checked : "") @@ -200,7 +261,7 @@ export default function UserInterest() { })}
- {isAnythingSelected && ( + {isInterestSelected && ( Date: Sun, 6 Oct 2024 16:14:11 +0530 Subject: [PATCH 05/31] feat: discord onboarding and interest selection --- .../UserEndgoals/UserEndgoals.module.css | 120 ------------------ .../Onboarding/UserEndgoals/UserEndgoals.tsx | 42 ------ .../Onboarding/UserInterest/UserInterest.tsx | 36 ++++-- .../ConnectDiscord/pages/ConnectDiscord.tsx | 14 +- src/services/urls.ts | 1 + 5 files changed, 37 insertions(+), 176 deletions(-) delete mode 100644 src/modules/Common/Authentication/pages/Onboarding/UserEndgoals/UserEndgoals.module.css delete mode 100644 src/modules/Common/Authentication/pages/Onboarding/UserEndgoals/UserEndgoals.tsx diff --git a/src/modules/Common/Authentication/pages/Onboarding/UserEndgoals/UserEndgoals.module.css b/src/modules/Common/Authentication/pages/Onboarding/UserEndgoals/UserEndgoals.module.css deleted file mode 100644 index 0f47a0877..000000000 --- a/src/modules/Common/Authentication/pages/Onboarding/UserEndgoals/UserEndgoals.module.css +++ /dev/null @@ -1,120 +0,0 @@ -.popUp { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100vh; - backdrop-filter: blur(10px); - background-color: #00000014; - z-index: 100; - display: flex; - justify-content: center; - align-items: center; - - .box { - background-color: #fff; - border-radius: 20px; - padding: 40px 10px 10px; - min-height: 300px; - max-width: 700px; - position: relative; - z-index: 100; - display: flex; - align-items: center; - flex-direction: column; - - .buttons { - width: 100%; - display: flex; - gap: 1rem; - padding: 0 1rem; - justify-content: flex-end; - } - & img { - height: 30px; - } - - & h1 { - font-size: 1.5rem; - font-weight: 600; - } - - .subText { - font-size: 12px; - font-weight: 500; - margin-bottom: 10px; - } - - .endGoalPageCards { - gap: 1.5rem; - z-index: 10; - cursor: pointer; - display: flex; - flex-wrap: wrap; - padding: 20px; - justify-content: center; - } - - /* @media (min-width: 768px) { - .rolePageCards { - grid-template-columns: repeat(2, minmax(0px, 1fr)); - } - } - - @media (min-width: 1024px) { - .rolePageCards { - grid-template-columns: repeat(3, minmax(0px, 1fr)); - } - } */ - - .endGoalPageCards .endGoalPageCard { - width: 215px; - height: 100px; - border-radius: 10px; - background-color: #fff; - box-shadow: 0px 0px 17.65823px 0px rgba(0, 0, 0, 0.07); - display: flex; - align-items: center; - flex-direction: column; - text-align: center; - justify-content: center; - gap: 1rem; - padding: 10px; - } - - /* .cardSmall .rolePageCard { - height: auto; - flex-direction: row; - } */ - .endGoalPageCards .endGoalPageCard:hover { - outline: 1.177px solid #456ff6; - transition: 1s ease; - } - - .endGoalPageCards .active { - outline: 2px solid #456ff6; - } - - .endGoalPageCard div { - display: flex; - } - - @media (width<500px) { - /* .rolePageCards { - grid-template-columns: 1fr; - margin-top: 1.5rem; - } */ - - .endGoalPageCards .endGoalPageCard { - width: 300px; - } - } - - @media (width<300px) { - .endGoalPageCards .endGoalPageCard { - width: 200px; - font-size: 0.65rem; - } - } - } -} diff --git a/src/modules/Common/Authentication/pages/Onboarding/UserEndgoals/UserEndgoals.tsx b/src/modules/Common/Authentication/pages/Onboarding/UserEndgoals/UserEndgoals.tsx deleted file mode 100644 index c8948c489..000000000 --- a/src/modules/Common/Authentication/pages/Onboarding/UserEndgoals/UserEndgoals.tsx +++ /dev/null @@ -1,42 +0,0 @@ -import { Formik } from "formik"; -import OnboardingHeader from "../../../components/OnboardingHeader/OnboardingHeader"; -import OnboardingTemplate from "../../../components/OnboardingTeamplate/OnboardingTemplate"; -import styles from "./UserEndgoals.module.css"; -import { Form } from "react-router-dom"; -import { useState } from "react"; -import muBrand from "/src/modules/Common/Authentication/assets/µLearn.png"; -import { PowerfulButton } from "@/MuLearnComponents/MuButtons/MuButton"; - -export default function UserEndgoal() { - const [initialValues, setInitialValues] = useState({ - endGoal: "" - }); - const onSubmit = async (values: any) => { - console.log("values", values); - }; - const [selectedEndgoal, setSelectedEndgoal] = useState(""); - const endgoalOptions = [ - { - title: "Job", - value: "job" - }, - { - title: "Higher Education", - value: "higher_education" - }, - { - title: "Entrepreneurship", - value: "enterpreneurship" - }, - { - title: "Gig Works", - value: "gig" - }, - { - title: "Other", - value: "other" - } - ]; - - return <>; -} diff --git a/src/modules/Common/Authentication/pages/Onboarding/UserInterest/UserInterest.tsx b/src/modules/Common/Authentication/pages/Onboarding/UserInterest/UserInterest.tsx index 460c5e462..1f1a4f51b 100644 --- a/src/modules/Common/Authentication/pages/Onboarding/UserInterest/UserInterest.tsx +++ b/src/modules/Common/Authentication/pages/Onboarding/UserInterest/UserInterest.tsx @@ -1,14 +1,13 @@ import React, { useState } from "react"; -import { useNavigate } from "react-router-dom"; -import OnboardingTemplate from "../../../components/OnboardingTeamplate/OnboardingTemplate"; import OnboardingHeader from "../../../components/OnboardingHeader/OnboardingHeader"; import { PowerfulButton } from "@/MuLearnComponents/MuButtons/MuButton"; import styles from "./UserInterest.module.css"; import muBrand from "/src/modules/Common/Authentication/assets/µLearn.png"; -import Select from "react-select"; -import { toReactOptions } from "../../../../../Dashboard/utils/common"; -import { Tab } from "@chakra-ui/react"; import { TagsInput } from "react-tag-input-component"; +import { privateGateway } from "@/MuLearnServices/apiGateways"; +import { onboardingRoutes } from "@/MuLearnServices/urls"; +import toast from "react-hot-toast"; +import { useNavigate } from "react-router-dom"; const CheckMark = () => ( ( export default function UserInterest() { const [interests, setInterests] = useState([ { title: "Software", value: "software", checked: false }, - { title: "Makers", value: "makers", checked: false }, + { title: "Maker", value: "maker", checked: false }, { title: "Management", value: "management", checked: false }, { title: "Creative", value: "creative", checked: false }, { title: "Others", value: "others", checked: false } @@ -41,15 +40,16 @@ export default function UserInterest() { }, { title: "Entrepreneurship", - value: "enterpreneurship", + value: "entrepreneurship", checked: false }, - { title: "Gig Works", value: "gig", checked: false }, + { title: "Gig Works", value: "gig_work", checked: false }, { title: "Others", value: "others", checked: false } ]); const [otherInterest, setOtherInterest] = useState([]); const [otherEndgoal, setOtherEndgoal] = useState([]); const [stepTwo, setStepTwo] = useState(false); + const navigate = useNavigate(); const handleInterestChange = (value: any) => { if (value === "others") { @@ -108,12 +108,26 @@ export default function UserInterest() { .filter(endgoal => endgoal.checked) .map(endgoal => endgoal); const data = { - choosen_interests: selectedInterests, - choosen_endgoals: selectedEndgoals, + choosen_interests: selectedInterests.map( + interest => interest.value + ), + choosen_endgoals: selectedEndgoals.map(endgoal => endgoal.value), other_interests: otherInterest, other_endgoals: otherEndgoal }; - console.log("data", data); + try { + privateGateway + .post(onboardingRoutes.interests, data) + .then(res => { + toast.success(res.data?.message.general[0]); + navigate("/dashboard/connect-discord"); + }) + .catch(err => { + toast.error(err.response?.data.message.general[0]); + }); + } catch (err) { + toast.error("Unexpected Error occured"); + } }; const isInterestSelected = interests.some(interest => interest.checked); diff --git a/src/modules/Dashboard/modules/ConnectDiscord/pages/ConnectDiscord.tsx b/src/modules/Dashboard/modules/ConnectDiscord/pages/ConnectDiscord.tsx index 75b6ac0fb..eeea1e53e 100644 --- a/src/modules/Dashboard/modules/ConnectDiscord/pages/ConnectDiscord.tsx +++ b/src/modules/Dashboard/modules/ConnectDiscord/pages/ConnectDiscord.tsx @@ -8,7 +8,7 @@ import MuLoader from "@/MuLearnComponents/MuLoader/MuLoader"; import { PowerfulButton } from "@/MuLearnComponents/MuButtons/MuButton"; import { FaInstagram } from "react-icons/fa6"; import toast from "react-hot-toast"; -import { useSearchParams } from "react-router-dom"; +import { useNavigate, useSearchParams } from "react-router-dom"; const ConnectDiscord = () => { const [muid, setMuid] = useState(""); @@ -16,6 +16,7 @@ const ConnectDiscord = () => { const [searchParams, _] = useSearchParams(); const token = searchParams.get("code"); const [discordStatus, setDiscordStatus] = useState("connecting"); + const navigate = useNavigate(); useEffect(() => { if (firstFetch.current) { if ( @@ -35,13 +36,17 @@ const ConnectDiscord = () => { connectDiscord(token).then(res => { if (res) { setDiscordStatus("connected"); + navigate("/dashboard/profile"); + toast.success( + "You will be added to our discord server shortly" + ); setTimeout(() => { var a = document.createElement("a"); a.href = "https://discord.gg/gtech-mulearn-771670169691881483"; a.target = "_blank"; a.click(); - }, 2000); + }, 5000); } else { setDiscordStatus("failed"); } @@ -81,7 +86,10 @@ const ConnectDiscord = () => { {muid} diff --git a/src/services/urls.ts b/src/services/urls.ts index e2ae89df9..33265697c 100644 --- a/src/services/urls.ts +++ b/src/services/urls.ts @@ -9,6 +9,7 @@ export const onboardingRoutes = { areaOfInterestList: "/api/v1/register/area-of-interest/list/", communityList: "/api/v1/register/community/list/", register: "/api/v1/register/", + interests: "/api/v1/register/interests/", emailVerification: "/api/v1/register/email-verification/", // New Onboarding Routes createAccount: "/api/v1/register/new/", From ef742e329722d5babd93ab1812330da4ed681689 Mon Sep 17 00:00:00 2001 From: Aswanth Vc Date: Sun, 6 Oct 2024 16:35:10 +0530 Subject: [PATCH 06/31] refactor: removed unused codes --- src/App.tsx | 1 - src/main.tsx | 14 ++--- .../AccountCreation/AccountCreation.tsx | 62 ++++--------------- 3 files changed, 19 insertions(+), 58 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index 81a01c0f4..2ba147f69 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -48,7 +48,6 @@ import Refund from "./modules/Public/Donation/pages/Refund"; import DonationSuccess from "./modules/Public/Donation/pages/DonationSuccess"; import OpenGrad from "./modules/Dashboard/modules/OpenGrad"; import UserInterest from "./modules/Common/Authentication/pages/Onboarding/UserInterest/UserInterest"; -import UserEndgoal from "./modules/Common/Authentication/pages/Onboarding/UserEndgoals/UserEndgoals"; const Profile = lazy( () => import("./modules/Dashboard/modules/Profile/pages/Profile") diff --git a/src/main.tsx b/src/main.tsx index c8ca74222..8e97becfc 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -5,11 +5,11 @@ import { ChakraProvider } from "@chakra-ui/react"; import ErrorBoundary from "./components/ErrorBoundary"; ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render( - // - - - - - - // + + + + + + + ); diff --git a/src/modules/Common/Authentication/pages/Onboarding/AccountCreation/AccountCreation.tsx b/src/modules/Common/Authentication/pages/Onboarding/AccountCreation/AccountCreation.tsx index 22fc2d84b..44c4612c5 100644 --- a/src/modules/Common/Authentication/pages/Onboarding/AccountCreation/AccountCreation.tsx +++ b/src/modules/Common/Authentication/pages/Onboarding/AccountCreation/AccountCreation.tsx @@ -3,31 +3,20 @@ import { HiEye, HiEyeSlash } from "react-icons/hi2"; import OnboardingTemplate from "../../../components/OnboardingTeamplate/OnboardingTemplate"; import OnboardingHeader from "../../../components/OnboardingHeader/OnboardingHeader"; -import { - getDWMSDetails, - getRoles, - validate -} from "../../../services/newOnboardingApis"; +import { getDWMSDetails } from "../../../services/newOnboardingApis"; import { Form, Formik } from "formik"; import * as z from "yup"; import { FormikTextInputWithoutLabel as SimpleInput } from "@/MuLearnComponents/FormikComponents/FormikComponents"; import { PowerfulButton } from "@/MuLearnComponents/MuButtons/MuButton"; -import { useEffect, useRef, useState } from "react"; +import { useEffect, useState } from "react"; -// import { useToast } from "@chakra-ui/react"; import { useNavigate, useParams } from "react-router-dom"; -import Select from "react-select"; import makeAnimated from "react-select/animated"; -import { getCommunities } from "../../../services/onboardingApis"; import { BiSupport } from "react-icons/bi"; import { isDev } from "@/MuLearnServices/common_functions"; -import roleOptions from "../RolePage/data/roleOptions"; -import muBrand from "/src/modules/Common/Authentication/assets/µLearn.png"; import { submitUserData } from "../../../services/newOnboardingApis"; import toast from "react-hot-toast"; -const animatedComponents = makeAnimated(); - type DWMSData = { email: string; fullName: string; @@ -77,29 +66,29 @@ const scheme = z.object({ export default function AccountCreation() { let { role } = useParams(); - const [popUP, setPopUp] = useState(role ? false : true); + // const [popUP, setPopUp] = useState(role ? false : true); // const toast = useToast(); const navigate = useNavigate(); - const [roles, setRoles] = useState([{ id: "", title: "" }]); + // const [roles, setRoles] = useState([{ id: "", title: "" }]); const urlParams = new URLSearchParams(window.location.search); const param = urlParams.get("param"); const referralId = urlParams.get("referral_id"); - const [selectedRoleId, setSelectedRoleId] = useState(""); - const [selectedRole, setSelectedRole] = useState(""); + // const [selectedRoleId, setSelectedRoleId] = useState(""); + // const [selectedRole, setSelectedRole] = useState(""); //ref to community selector for resetting - temporary fix - const community_select_ref = useRef(); + // const community_select_ref = useRef(); const [isLoading, setIsLoading] = useState(false); const [isVisible, setVisible] = useState(false); - const [isVisibleC, setVisibleC] = useState(false); + // const [isVisibleC, setVisibleC] = useState(false); const [dwmsData, setDWMSData] = useState(); const [isTncChecked, setTncChecked] = useState(false); - const [communitiesList, setCommunitiesList] = useState([ - { id: "", title: "" } - ]); + // const [communitiesList, setCommunitiesList] = useState([ + // { id: "", title: "" } + // ]); const [initialValues, setInitialValues] = useState({ email: "", fullName: "", @@ -117,19 +106,6 @@ export default function AccountCreation() { useEffect(() => { if (isLoading) return; setIsLoading(true); - getCommunities({ - setCommunityAPI: setCommunitiesList, - setIsLoading: setIsLoading - }); - getRoles().then((res: any) => { - setRoles(res); - setIsLoading(false); - setSelectedRoleId( - res.find((role: any) => role.title.toLowerCase() === role) - ?.id || "" - ); - // setSelectedRole(role); - }); if (param) { getDWMSDetails(param, (data: any) => { setDWMSData({ @@ -206,14 +182,6 @@ export default function AccountCreation() { userData.communities = values.communities; } - if (role) { - userData.role = roles.find(e => e.title.toLowerCase() === role)?.id; - } - - if (selectedRoleId) { - userData.role = selectedRoleId; - } - if (param) { userData.integration = { param: param, @@ -628,13 +596,7 @@ export default function AccountCreation() { style={{ marginTop: "10px" }} isLoading={isLoading} > - {selectedRole.toLowerCase() !== "other" - ? isLoading - ? "Validating..." - : "Register" - : isLoading - ? "Validating..." - : "Submit"} + {isLoading ? "Validating..." : "Submit"}
From 2c7b07aa2467f32d13c3e0d6508843343f4ace08 Mon Sep 17 00:00:00 2001 From: Alan Francis Date: Sun, 6 Oct 2024 21:15:21 +0530 Subject: [PATCH 07/31] feat:ui update --- .../assets/interests/creative.webp | Bin 0 -> 8586 bytes .../assets/interests/makers.webp | Bin 0 -> 7938 bytes .../assets/interests/management.webp | Bin 0 -> 8958 bytes .../assets/interests/others.webp | Bin 0 -> 7850 bytes .../assets/interests/software.webp | Bin 0 -> 6652 bytes .../UserInterest/UserInterest.module.css | 43 ++++++++++++++---- .../Onboarding/UserInterest/UserInterest.tsx | 33 ++++++++++---- 7 files changed, 59 insertions(+), 17 deletions(-) create mode 100644 src/modules/Common/Authentication/assets/interests/creative.webp create mode 100644 src/modules/Common/Authentication/assets/interests/makers.webp create mode 100644 src/modules/Common/Authentication/assets/interests/management.webp create mode 100644 src/modules/Common/Authentication/assets/interests/others.webp create mode 100644 src/modules/Common/Authentication/assets/interests/software.webp diff --git a/src/modules/Common/Authentication/assets/interests/creative.webp b/src/modules/Common/Authentication/assets/interests/creative.webp new file mode 100644 index 0000000000000000000000000000000000000000..d04c86b365550010e3c1430e1b368302e943aea1 GIT binary patch literal 8586 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 literal 0 HcmV?d00001 diff --git a/src/modules/Common/Authentication/assets/interests/makers.webp b/src/modules/Common/Authentication/assets/interests/makers.webp new file mode 100644 index 0000000000000000000000000000000000000000..8f3acd79c22df67391efa4c8825d3864e74c912f GIT binary patch literal 7938 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 literal 0 HcmV?d00001 diff --git a/src/modules/Common/Authentication/assets/interests/management.webp b/src/modules/Common/Authentication/assets/interests/management.webp new file mode 100644 index 0000000000000000000000000000000000000000..7fd1df368972dcb62843dcbf3476b1812f1b5a4d GIT binary patch literal 8958 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 literal 0 HcmV?d00001 diff --git a/src/modules/Common/Authentication/assets/interests/software.webp b/src/modules/Common/Authentication/assets/interests/software.webp new file mode 100644 index 0000000000000000000000000000000000000000..84942ce23997ded4572e1255af81a11e8946cbd2 GIT binary patch literal 6652 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%0DPMkZujN# zk-5EO@0vuucb^NOV2c@Y^CPaxUZWeUoOAqUE(@oz*wdqTa+RRm|E=YJ=lRkpcJF=z zh4o6=Yp}ei>ui#Ge}CW`=)hA%iEr=hxW>zvV!bPrt8ipLXV=RphFUgkz%p7NjWhlI zNuTpYJtcTG@he}ucXeP=EFfW3KB9lr?&^IS*-ESUivN4GDb}I(cDP?k<|mTID^p4i zpL70C8BYRC<-TqKIt~Bv+tcKloePq7C;Y*dtA}!@|6Z-pV48jB(D%<>9|f?MkIXM! z@y)G!^xbvts6eOx(Upt#rqTdb8Q(a4pDt04io?M^lb`gv{?$V literal 0 HcmV?d00001 diff --git a/src/modules/Common/Authentication/pages/Onboarding/UserInterest/UserInterest.module.css b/src/modules/Common/Authentication/pages/Onboarding/UserInterest/UserInterest.module.css index 5fe5ae70b..8efb1b9aa 100644 --- a/src/modules/Common/Authentication/pages/Onboarding/UserInterest/UserInterest.module.css +++ b/src/modules/Common/Authentication/pages/Onboarding/UserInterest/UserInterest.module.css @@ -28,12 +28,13 @@ } & h1 { - font-size: 1.5rem; + font-size: 2rem; font-weight: 600; } .subText { - font-size: 12px; + margin-top: 10px; + font-size: 1rem; font-weight: 500; margin-bottom: 10px; } @@ -49,8 +50,8 @@ overflow: show; .itemsCard { - width: 215px; - height: 130px; + min-width: 215px; + min-height: 130px; border-radius: 10px; background-color: #fff; box-shadow: 0px 0px 17.65823px 0px rgba(0, 0, 0, 0.07); @@ -59,7 +60,6 @@ flex-direction: column; text-align: center; justify-content: center; - gap: 1rem; padding: 10px; position: relative; transition: all 0.3s ease; @@ -69,7 +69,10 @@ display: flex; width: calc(410px + 3rem); justify-content: center; - flex-direction: column; + flex-direction: column; + overflow: visible; + flex-direction: row; + gap: 1rem; } } @@ -79,7 +82,7 @@ left: 0px; transform: translate(-30%, -30%); color: #ffffff; - background-color: #3e15d4; + background-color: #456FF6; border-radius: 50%; padding: 2px; } @@ -129,17 +132,39 @@ .active { outline: 2px solid #456ff6; } + .itemImage{ + margin-top: 1rem; + object-fit: cover; + height: 100px; + width: 100px; + -webkit-user-drag: none; + + } + .title{ + margin-top: 0.5rem; + font-weight: bold; + } } @media (width<500px) { .interestSelectCards .interestSelectCard { - width: 300px; + max-width: 300px; + } + .itemsContainer { + .itemsCard{ + max-width: 200px; + &.others { + &.checked { + flex-direction: column; + } + } + } } } @media (width<300px) { .interestSelectCards .interestSelectCard { - width: 200px; + max-width: 200px; font-size: 0.65rem; } } diff --git a/src/modules/Common/Authentication/pages/Onboarding/UserInterest/UserInterest.tsx b/src/modules/Common/Authentication/pages/Onboarding/UserInterest/UserInterest.tsx index 1f1a4f51b..1909e6462 100644 --- a/src/modules/Common/Authentication/pages/Onboarding/UserInterest/UserInterest.tsx +++ b/src/modules/Common/Authentication/pages/Onboarding/UserInterest/UserInterest.tsx @@ -8,6 +8,11 @@ import { privateGateway } from "@/MuLearnServices/apiGateways"; import { onboardingRoutes } from "@/MuLearnServices/urls"; import toast from "react-hot-toast"; import { useNavigate } from "react-router-dom"; +import creative from "/src/modules/Common/Authentication/assets/interests/creative.webp"; +import maker from "/src/modules/Common/Authentication/assets/interests/makers.webp"; +import management from "/src/modules/Common/Authentication/assets/interests/management.webp"; +import software from "/src/modules/Common/Authentication/assets/interests/software.webp"; +import others from "/src/modules/Common/Authentication/assets/interests/others.webp"; const CheckMark = () => ( ( export default function UserInterest() { const [interests, setInterests] = useState([ - { title: "Software", value: "software", checked: false }, - { title: "Maker", value: "maker", checked: false }, - { title: "Management", value: "management", checked: false }, - { title: "Creative", value: "creative", checked: false }, - { title: "Others", value: "others", checked: false } + { title: "Software", value: "software", img: software, checked: false }, + { title: "Maker", value: "maker", img: maker, checked: false }, + { + title: "Management", + value: "management", + img: management, + checked: false + }, + { title: "Creative", value: "creative", img: creative, checked: false }, + { title: "Others", value: "others", img: others, checked: false } ]); const [endgoals, setEndgoals] = useState([ { title: "Job", value: "job", checked: false }, @@ -217,9 +227,9 @@ export default function UserInterest() {
mulearn -

What describes you the most!

+

Your dynamic area of interest!

- Choose one or more roles that best fit your profile. + Please select your interested area

{interests.map(interest => { @@ -243,7 +253,14 @@ export default function UserInterest() { } > {interest.checked && } -

{interest.title}

+ +

+ {interest.title} +

{interest.value == "others" ? ( interests.find( From 50bd9bbaedb22fba6cb2b57581be97508fc24575 Mon Sep 17 00:00:00 2001 From: Aswanth Vc Date: Mon, 7 Oct 2024 00:55:00 +0530 Subject: [PATCH 08/31] fix: improved ui --- .env.sample | 3 +- src/App.css | 8 + .../assets/interests/creative.svg | 351 ++++++++++++++++++ .../assets/interests/creative.webp | Bin 8586 -> 0 bytes .../assets/interests/makers.svg | 201 ++++++++++ .../assets/interests/makers.webp | Bin 7938 -> 0 bytes .../assets/interests/management.svg | 342 +++++++++++++++++ .../assets/interests/management.webp | Bin 8958 -> 0 bytes .../assets/interests/others.svg | 222 +++++++++++ .../assets/interests/others.webp | Bin 7850 -> 0 bytes .../assets/interests/software.svg | 160 ++++++++ .../assets/interests/software.webp | Bin 6652 -> 0 bytes .../UserInterest/UserInterest.module.css | 101 ++++- .../Onboarding/UserInterest/UserInterest.tsx | 81 +++- src/services/urls.ts | 1 + 15 files changed, 1435 insertions(+), 35 deletions(-) create mode 100644 src/modules/Common/Authentication/assets/interests/creative.svg delete mode 100644 src/modules/Common/Authentication/assets/interests/creative.webp create mode 100644 src/modules/Common/Authentication/assets/interests/makers.svg delete mode 100644 src/modules/Common/Authentication/assets/interests/makers.webp create mode 100644 src/modules/Common/Authentication/assets/interests/management.svg delete mode 100644 src/modules/Common/Authentication/assets/interests/management.webp create mode 100644 src/modules/Common/Authentication/assets/interests/others.svg delete mode 100644 src/modules/Common/Authentication/assets/interests/others.webp create mode 100644 src/modules/Common/Authentication/assets/interests/software.svg delete mode 100644 src/modules/Common/Authentication/assets/interests/software.webp diff --git a/.env.sample b/.env.sample index c4f419fc4..89a12e8c7 100644 --- a/.env.sample +++ b/.env.sample @@ -1,4 +1,5 @@ VITE_BACKEND_URL= VITE_FRONTEND_URL= VITE_DISCORD_INVITE_URL= -VITE_RAZORPAY_KEY_ID= \ No newline at end of file +VITE_RAZORPAY_KEY_ID= +VITE_DISCORD_AUTH_URL= \ No newline at end of file diff --git a/src/App.css b/src/App.css index 1d7cb588f..843de3003 100644 --- a/src/App.css +++ b/src/App.css @@ -15,6 +15,14 @@ -webkit-tap-highlight-color: rgba(0, 0, 0, 0); -webkit-tap-highlight-color: transparent; } +.rti--container { + width: 250px; + max-height: 100px; + overflow: scroll; +} +.rti--container .rti--input { + width: 100%; +} .css-13cymwt-control, .css-t3ipsp-control { diff --git a/src/modules/Common/Authentication/assets/interests/creative.svg b/src/modules/Common/Authentication/assets/interests/creative.svg new file mode 100644 index 000000000..e700e2c18 --- /dev/null +++ b/src/modules/Common/Authentication/assets/interests/creative.svg @@ -0,0 +1,351 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/modules/Common/Authentication/assets/interests/creative.webp b/src/modules/Common/Authentication/assets/interests/creative.webp deleted file mode 100644 index d04c86b365550010e3c1430e1b368302e943aea1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8586 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 diff --git a/src/modules/Common/Authentication/assets/interests/makers.svg b/src/modules/Common/Authentication/assets/interests/makers.svg new file mode 100644 index 000000000..4dca1abdc --- /dev/null +++ b/src/modules/Common/Authentication/assets/interests/makers.svg @@ -0,0 +1,201 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/modules/Common/Authentication/assets/interests/makers.webp b/src/modules/Common/Authentication/assets/interests/makers.webp deleted file mode 100644 index 8f3acd79c22df67391efa4c8825d3864e74c912f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7938 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 diff --git a/src/modules/Common/Authentication/assets/interests/management.svg b/src/modules/Common/Authentication/assets/interests/management.svg new file mode 100644 index 000000000..d22b33537 --- /dev/null +++ b/src/modules/Common/Authentication/assets/interests/management.svg @@ -0,0 +1,342 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/modules/Common/Authentication/assets/interests/management.webp b/src/modules/Common/Authentication/assets/interests/management.webp deleted file mode 100644 index 7fd1df368972dcb62843dcbf3476b1812f1b5a4d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8958 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/modules/Common/Authentication/assets/interests/others.webp b/src/modules/Common/Authentication/assets/interests/others.webp deleted file mode 100644 index efb7bafa47c5ed032d2857c1ed377a45f951825d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7850 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 diff --git a/src/modules/Common/Authentication/assets/interests/software.svg b/src/modules/Common/Authentication/assets/interests/software.svg new file mode 100644 index 000000000..f410c6c1a --- /dev/null +++ b/src/modules/Common/Authentication/assets/interests/software.svg @@ -0,0 +1,160 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/modules/Common/Authentication/assets/interests/software.webp b/src/modules/Common/Authentication/assets/interests/software.webp deleted file mode 100644 index 84942ce23997ded4572e1255af81a11e8946cbd2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6652 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%0DPMkZujN# zk-5EO@0vuucb^NOV2c@Y^CPaxUZWeUoOAqUE(@oz*wdqTa+RRm|E=YJ=lRkpcJF=z zh4o6=Yp}ei>ui#Ge}CW`=)hA%iEr=hxW>zvV!bPrt8ipLXV=RphFUgkz%p7NjWhlI zNuTpYJtcTG@he}ucXeP=EFfW3KB9lr?&^IS*-ESUivN4GDb}I(cDP?k<|mTID^p4i zpL70C8BYRC<-TqKIt~Bv+tcKloePq7C;Y*dtA}!@|6Z-pV48jB(D%<>9|f?MkIXM! z@y)G!^xbvts6eOx(Upt#rqTdb8Q(a4pDt04io?M^lb`gv{?$V diff --git a/src/modules/Common/Authentication/pages/Onboarding/UserInterest/UserInterest.module.css b/src/modules/Common/Authentication/pages/Onboarding/UserInterest/UserInterest.module.css index 8efb1b9aa..2a54f83b2 100644 --- a/src/modules/Common/Authentication/pages/Onboarding/UserInterest/UserInterest.module.css +++ b/src/modules/Common/Authentication/pages/Onboarding/UserInterest/UserInterest.module.css @@ -22,7 +22,9 @@ display: flex; align-items: center; flex-direction: column; - + h1 { + text-align: center; + } & img { height: 30px; } @@ -50,8 +52,8 @@ overflow: show; .itemsCard { - min-width: 215px; - min-height: 130px; + min-width: 200px; + max-height: 120px; border-radius: 10px; background-color: #fff; box-shadow: 0px 0px 17.65823px 0px rgba(0, 0, 0, 0.07); @@ -63,13 +65,68 @@ padding: 10px; position: relative; transition: all 0.3s ease; + position: relative; + + .infoButton { + position: absolute; + top: 10px; + right: 10px; + padding: 5px; + border-radius: 50%; + cursor: pointer; + color: #456ff6; + z-index: 11; + } + + .interestInfo { + display: none; + position: absolute; + width: 200px; + height: 100%; + top: 0; + left: 0; + color: #22222290; + font-size: 10px; + background: #ffffff; + border: 1px solid #456ef694; + padding: 10px; + border-radius: 10px; + z-index: 10; + flex-direction: column; + justify-content: start; + gap: 10px; + h4 { + font-weight: 800; + text-align: start; + } + ul { + display: block; + padding: 0; + margin: 0; + li { + margin-left: 20px; + text-align: start; + width: auto; + } + } + } + .content { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + height: 100px; + p { + transform: translateY(-90%); + } + } &.others { &.checked { display: flex; - width: calc(410px + 3rem); - justify-content: center; - flex-direction: column; + width: calc(380px + 3rem); + justify-content: space-around; + flex-direction: column; overflow: visible; flex-direction: row; gap: 1rem; @@ -82,9 +139,10 @@ left: 0px; transform: translate(-30%, -30%); color: #ffffff; - background-color: #456FF6; + background-color: #456ff6; border-radius: 50%; padding: 2px; + z-index: 12; } div { @@ -94,6 +152,10 @@ &:hover { outline: 1.177px solid #456ff6; transition: 1s ease; + + .interestInfo { + display: flex; + } } &.others { @@ -120,6 +182,10 @@ transition: transform 0.3s ease-in-out; } + .tagInput { + background: red !important; + width: 100%; + } .otherInterestInput { width: 90%; padding: 8px; @@ -132,15 +198,14 @@ .active { outline: 2px solid #456ff6; } - .itemImage{ + .itemImage { margin-top: 1rem; object-fit: cover; - height: 100px; - width: 100px; + height: 70px; + width: 70px; -webkit-user-drag: none; - } - .title{ + .title { margin-top: 0.5rem; font-weight: bold; } @@ -151,14 +216,14 @@ max-width: 300px; } .itemsContainer { - .itemsCard{ - max-width: 200px; - &.others { - &.checked { - flex-direction: column; + .itemsCard { + max-width: 200px; + &.others { + &.checked { + flex-direction: column; + } } } - } } } diff --git a/src/modules/Common/Authentication/pages/Onboarding/UserInterest/UserInterest.tsx b/src/modules/Common/Authentication/pages/Onboarding/UserInterest/UserInterest.tsx index 1909e6462..ffdd1c08a 100644 --- a/src/modules/Common/Authentication/pages/Onboarding/UserInterest/UserInterest.tsx +++ b/src/modules/Common/Authentication/pages/Onboarding/UserInterest/UserInterest.tsx @@ -1,18 +1,18 @@ -import React, { useState } from "react"; +import { useEffect, useState } from "react"; import OnboardingHeader from "../../../components/OnboardingHeader/OnboardingHeader"; import { PowerfulButton } from "@/MuLearnComponents/MuButtons/MuButton"; import styles from "./UserInterest.module.css"; import muBrand from "/src/modules/Common/Authentication/assets/µLearn.png"; import { TagsInput } from "react-tag-input-component"; -import { privateGateway } from "@/MuLearnServices/apiGateways"; +import { privateGateway, publicGateway } from "@/MuLearnServices/apiGateways"; import { onboardingRoutes } from "@/MuLearnServices/urls"; import toast from "react-hot-toast"; import { useNavigate } from "react-router-dom"; -import creative from "/src/modules/Common/Authentication/assets/interests/creative.webp"; -import maker from "/src/modules/Common/Authentication/assets/interests/makers.webp"; -import management from "/src/modules/Common/Authentication/assets/interests/management.webp"; -import software from "/src/modules/Common/Authentication/assets/interests/software.webp"; -import others from "/src/modules/Common/Authentication/assets/interests/others.webp"; +import creative from "/src/modules/Common/Authentication/assets/interests/creative.svg"; +import maker from "/src/modules/Common/Authentication/assets/interests/makers.svg"; +import management from "/src/modules/Common/Authentication/assets/interests/management.svg"; +import software from "/src/modules/Common/Authentication/assets/interests/software.svg"; +import others from "/src/modules/Common/Authentication/assets/interests/others.svg"; const CheckMark = () => ( ([]); const [otherEndgoal, setOtherEndgoal] = useState([]); const [stepTwo, setStepTwo] = useState(false); + const [interestGroups, setInterestGroups] = useState<{}>({}); const navigate = useNavigate(); + useEffect(() => { + publicGateway + .get(onboardingRoutes.interestGroups) + .then(res => { + var data: [] = res.data?.response?.interestGroup ?? []; + var interestGroupsData = {}; + for (let interest of interests) { + (interestGroupsData as any)[interest.value] = data.filter( + (group: any) => group?.category == interest.value + ); + } + setInterestGroups(interestGroupsData); + }) + .catch(err => { + console.log(err); + }); + }, []); + const handleInterestChange = (value: any) => { if (value === "others") { if ( @@ -253,15 +272,45 @@ export default function UserInterest() { } > {interest.checked && } - -

- {interest.title} -

- +
+ +

+ {interest.title} +

+
+
{ + e.stopPropagation(); + }} + > + + + + +
+
+

This category includes:

+
    + {(interestGroups as any)[ + interest.value + ]?.map((group: any) => ( +
  • + {group.name} +
  • + ))} +
+
{interest.value == "others" ? ( interests.find( interest => diff --git a/src/services/urls.ts b/src/services/urls.ts index 33265697c..c7d6d4baf 100644 --- a/src/services/urls.ts +++ b/src/services/urls.ts @@ -10,6 +10,7 @@ export const onboardingRoutes = { communityList: "/api/v1/register/community/list/", register: "/api/v1/register/", interests: "/api/v1/register/interests/", + interestGroups: "/api/v1/dashboard/ig/list/", emailVerification: "/api/v1/register/email-verification/", // New Onboarding Routes createAccount: "/api/v1/register/new/", From b2b6d55e571c70f8fbd2440863354419f7621a96 Mon Sep 17 00:00:00 2001 From: Aswanth Vc Date: Mon, 7 Oct 2024 22:23:57 +0530 Subject: [PATCH 09/31] fix(onboard) : Improved UI UX --- .../UserInterest/UserInterest.module.css | 46 ++++++++++--------- .../Onboarding/UserInterest/UserInterest.tsx | 29 ++++++++++++ 2 files changed, 54 insertions(+), 21 deletions(-) diff --git a/src/modules/Common/Authentication/pages/Onboarding/UserInterest/UserInterest.module.css b/src/modules/Common/Authentication/pages/Onboarding/UserInterest/UserInterest.module.css index 2a54f83b2..0e9d678cc 100644 --- a/src/modules/Common/Authentication/pages/Onboarding/UserInterest/UserInterest.module.css +++ b/src/modules/Common/Authentication/pages/Onboarding/UserInterest/UserInterest.module.css @@ -76,12 +76,16 @@ cursor: pointer; color: #456ff6; z-index: 11; + + &:hover + .interestInfo { + display: flex; + } } .interestInfo { display: none; position: absolute; - width: 200px; + width: 100%; height: 100%; top: 0; left: 0; @@ -95,18 +99,31 @@ flex-direction: column; justify-content: start; gap: 10px; + overflow-x: hidden; + overflow-y: scroll; + + &:hover { + display: flex; + } + h4 { font-weight: 800; text-align: start; } ul { - display: block; + display: flex; + flex-wrap: wrap; padding: 0; margin: 0; li { - margin-left: 20px; text-align: start; width: auto; + display: inline-block; + padding: 3px; + background: #22222210; + margin: 1px; + border-radius: 5px; + color: black; } } } @@ -152,19 +169,12 @@ &:hover { outline: 1.177px solid #456ff6; transition: 1s ease; - - .interestInfo { - display: flex; - } } &.others { position: relative; overflow: hidden; } - .interestOther { - background: red; - } .othersTextBox { position: absolute; @@ -212,26 +222,20 @@ } @media (width<500px) { - .interestSelectCards .interestSelectCard { - max-width: 300px; - } .itemsContainer { .itemsCard { - max-width: 200px; + width: 300px; + flex-direction: column; &.others { &.checked { + height: fit-content; + max-height: none; flex-direction: column; + width: 300px; } } } } } - - @media (width<300px) { - .interestSelectCards .interestSelectCard { - max-width: 200px; - font-size: 0.65rem; - } - } } } diff --git a/src/modules/Common/Authentication/pages/Onboarding/UserInterest/UserInterest.tsx b/src/modules/Common/Authentication/pages/Onboarding/UserInterest/UserInterest.tsx index ffdd1c08a..df1807b75 100644 --- a/src/modules/Common/Authentication/pages/Onboarding/UserInterest/UserInterest.tsx +++ b/src/modules/Common/Authentication/pages/Onboarding/UserInterest/UserInterest.tsx @@ -209,6 +209,18 @@ export default function UserInterest() { > { + if ( + e.target.value + .length > 0 + ) { + setOtherEndgoal([ + ...otherEndgoal, + e.target.value + ]); + e.target.value = ""; + } + }} onChange={setOtherEndgoal} name="other_endgoals" placeHolder="Specify your endgoals" @@ -324,6 +336,23 @@ export default function UserInterest() { > { + if ( + e.target.value + .length > 0 + ) { + setOtherInterest( + [ + ...otherInterest, + e.target + .value + ] + ); + e.target.value = + ""; + } + }} + separators={[","]} onChange={ setOtherInterest } From c8086081a19d00ec39b4f8e71ebfc9a1167aafa6 Mon Sep 17 00:00:00 2001 From: ansan johny Date: Tue, 8 Oct 2024 00:08:35 +0530 Subject: [PATCH 10/31] feat: Add category in ig dashboard Co-authored-by: Aswanth <69764494+aswanthabam@users.noreply.github.com> --- .../modules/InterestGroup/InterestGroup.tsx | 18 +++++----- .../InterestGroup/InterestGroupForm.tsx | 36 +++++++++++++++++-- .../InterestGroupFrom.module.css | 3 ++ .../InterestGroup/InterestGroupInterface.d.ts | 1 + 4 files changed, 45 insertions(+), 13 deletions(-) create mode 100644 src/modules/Dashboard/modules/InterestGroup/InterestGroupFrom.module.css diff --git a/src/modules/Dashboard/modules/InterestGroup/InterestGroup.tsx b/src/modules/Dashboard/modules/InterestGroup/InterestGroup.tsx index 52ebf9975..511466d95 100644 --- a/src/modules/Dashboard/modules/InterestGroup/InterestGroup.tsx +++ b/src/modules/Dashboard/modules/InterestGroup/InterestGroup.tsx @@ -5,23 +5,20 @@ import THead from "@/MuLearnComponents/Table/THead"; import TableTop from "@/MuLearnComponents/TableTop/TableTop"; import { deleteInterestGroups, getInterestGroups } from "./apis"; import { useNavigate } from "react-router-dom"; -import { - MuButton, - PowerfulButton -} from "@/MuLearnComponents/MuButtons/MuButton"; +import { PowerfulButton } from "@/MuLearnComponents/MuButtons/MuButton"; import { AiOutlinePlusCircle } from "react-icons/ai"; import styles from "./InterestGroup.module.css"; import { dashboardRoutes } from "@/MuLearnServices/urls"; import { Blank } from "@/MuLearnComponents/Table/Blank"; -import CreateOrUpdateModal from "./CreateOrUpdateModal"; import MuModal from "@/MuLearnComponents/MuModal/MuModal"; import InterestGroupForm from "./InterestGroupForm"; +import { Label } from "recharts"; -interface IgDetails { - igName: string; - igCode: string; - igIcon: string; -} +// interface IgDetails { +// igName: string; +// igCode: string; +// igIcon: string; +// } export type modalTypes = "edit" | "create" | null; @@ -38,6 +35,7 @@ function InterestGroup() { const columnOrder = [ { column: "name", Label: "Name", isSortable: true }, { column: "members", Label: "Members", isSortable: true }, + { column: "category", Label: "Category", isSortable: true }, { column: "updated_at", Label: "Updated On", isSortable: true }, { column: "updated_by", Label: "Updated By", isSortable: true }, { column: "created_by", Label: "Created By", isSortable: true }, diff --git a/src/modules/Dashboard/modules/InterestGroup/InterestGroupForm.tsx b/src/modules/Dashboard/modules/InterestGroup/InterestGroupForm.tsx index 846d552e5..9a43ef6fd 100644 --- a/src/modules/Dashboard/modules/InterestGroup/InterestGroupForm.tsx +++ b/src/modules/Dashboard/modules/InterestGroup/InterestGroupForm.tsx @@ -1,8 +1,9 @@ import { forwardRef, useEffect, useImperativeHandle, useState } from "react"; import styles from "../../utils/modalForm.module.css"; import toast from "react-hot-toast"; -import { customReactSelectStyles } from "../../utils/common"; import { createInterestGroups, editInterestGroups, getIGDetails } from "./apis"; +import ReactSelect from "react-select"; +import styles2 from "./InterestGroupFrom.module.css"; type Props = { id: string; isEditMode: boolean }; @@ -11,8 +12,19 @@ const IntrestGroupForm = forwardRef( const [data, setData] = useState({ name: "", icon: "", - code: "" + code: "", + category: "others" }); + const interestGroup = [ + { label: "Software", value: "software" }, + { label: "Maker", value: "maker" }, + { + label: "Management", + value: "management" + }, + { label: "Creative", value: "creative" }, + { label: "Others", value: "others" } + ]; const [errors, setErrors] = useState({}); @@ -23,7 +35,8 @@ const IntrestGroupForm = forwardRef( setData({ name: data.name, icon: data.icon, - code: data.code + code: data.code, + category: data.category }); }); } @@ -142,6 +155,23 @@ const IntrestGroupForm = forwardRef(
{errors.icon}
)}
+ { + setData(prevData => ({ + ...prevData, + category: e?.value as string + })); + }} + value={ + interestGroup.filter(e => { + console.log(e.value, data.category); + return e.value === data.category; + })[0] + } + />
); diff --git a/src/modules/Dashboard/modules/InterestGroup/InterestGroupFrom.module.css b/src/modules/Dashboard/modules/InterestGroup/InterestGroupFrom.module.css new file mode 100644 index 000000000..a8f60d990 --- /dev/null +++ b/src/modules/Dashboard/modules/InterestGroup/InterestGroupFrom.module.css @@ -0,0 +1,3 @@ +.inputBox { + width: 45%; +} diff --git a/src/modules/Dashboard/modules/InterestGroup/InterestGroupInterface.d.ts b/src/modules/Dashboard/modules/InterestGroup/InterestGroupInterface.d.ts index 743373b74..11c0f0436 100644 --- a/src/modules/Dashboard/modules/InterestGroup/InterestGroupInterface.d.ts +++ b/src/modules/Dashboard/modules/InterestGroup/InterestGroupInterface.d.ts @@ -2,4 +2,5 @@ interface IGData { name: string; code: string; icon: string; + category: string; } From 4ded989dd7c8b17e0d4b987ed0b991a543811099 Mon Sep 17 00:00:00 2001 From: Aswanth Vc Date: Wed, 9 Oct 2024 00:24:44 +0530 Subject: [PATCH 11/31] fix: redirect to interest select page if not selected --- src/App.tsx | 13 +++---- .../services/newOnboardingApis.ts | 5 +-- .../Authentication/services/onboardingApis.ts | 2 +- .../ConnectDiscord/pages/ConnectDiscord.tsx | 2 +- .../modules/ConnectDiscord/services/apis.ts | 12 +++++- src/types.d.ts | 38 ++++++++++--------- 6 files changed, 40 insertions(+), 32 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index 2ba147f69..6828ce635 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -6,10 +6,6 @@ import { Navigate } from "react-router-dom"; import AuthRoutes from "./components/AuthRoutes"; -import Onboarding from "./modules/Common/Authentication/pages/Onboarding"; -import Login from "./modules/Common/Authentication/pages/Login"; -import ForgotPassword from "./modules/Common/Authentication/pages/ForgotPassword"; - import PrivateRoutes from "./components/PrivateRoutes"; import DashboardRootLayout from "./modules/Dashboard/layouts/DashboardRootLayout"; import NotFound from "./components/NotFound"; @@ -298,18 +294,19 @@ function App() { { path: "", element: - }, - { - path: "interests", - element: } ] }, + { path: "login", element: }, { path: "forgot-password", element: }, { path: "reset-password", element: } ] }, + { + path: "/register/interests", + element: + }, { path: "/signin", element: diff --git a/src/modules/Common/Authentication/services/newOnboardingApis.ts b/src/modules/Common/Authentication/services/newOnboardingApis.ts index 66a2e7fe4..43735aafc 100644 --- a/src/modules/Common/Authentication/services/newOnboardingApis.ts +++ b/src/modules/Common/Authentication/services/newOnboardingApis.ts @@ -4,7 +4,6 @@ import { KKEMRoutes, onboardingRoutes } from "@/MuLearnServices/urls"; import { Dispatch, SetStateAction } from "react"; import { NavigateFunction } from "react-router-dom"; -import { bool, boolean } from "yup"; import { getInfo } from "../../../Dashboard/modules/ConnectDiscord/services/apis"; import { DWMSDetails } from "./onboardingApis"; import toast from "react-hot-toast"; @@ -53,7 +52,7 @@ export const createAccount = async ({ const tokens = response.data.response; localStorage.setItem("accessToken", tokens.accessToken); localStorage.setItem("refreshToken", tokens.refreshToken); - getInfo(() => { + getInfo(navigate, () => { navigate("/role"); }); } catch (err: any) { @@ -165,7 +164,7 @@ export const submitUserData = async ({ const tokens = res.data.response; localStorage.setItem("accessToken", tokens.accessToken); localStorage.setItem("refreshToken", tokens.refreshToken); - getInfo(() => navigate("/register/interests")); + navigate("/register/interests"); } catch (err: any) { setIsLoading(false); const messages = err.response.data.message.general[0]; diff --git a/src/modules/Common/Authentication/services/onboardingApis.ts b/src/modules/Common/Authentication/services/onboardingApis.ts index da54fe365..9c6905945 100644 --- a/src/modules/Common/Authentication/services/onboardingApis.ts +++ b/src/modules/Common/Authentication/services/onboardingApis.ts @@ -259,7 +259,7 @@ export const registerUser = ( "refreshToken", response.data.response.refreshToken ); - getInfo(() => { + getInfo(navigate, () => { navigate("/dashboard/connect-discord"); setShowSubmitLoader(false); }); diff --git a/src/modules/Dashboard/modules/ConnectDiscord/pages/ConnectDiscord.tsx b/src/modules/Dashboard/modules/ConnectDiscord/pages/ConnectDiscord.tsx index eeea1e53e..d41d6c8e5 100644 --- a/src/modules/Dashboard/modules/ConnectDiscord/pages/ConnectDiscord.tsx +++ b/src/modules/Dashboard/modules/ConnectDiscord/pages/ConnectDiscord.tsx @@ -25,7 +25,7 @@ const ConnectDiscord = () => { ) { setMuid(JSON.parse(localStorage.getItem("userInfo")!).mu_id); } else { - getInfo(setMuid); + getInfo(navigate, setMuid); } } firstFetch.current = false; diff --git a/src/modules/Dashboard/modules/ConnectDiscord/services/apis.ts b/src/modules/Dashboard/modules/ConnectDiscord/services/apis.ts index 791bdbf20..974e7fd43 100644 --- a/src/modules/Dashboard/modules/ConnectDiscord/services/apis.ts +++ b/src/modules/Dashboard/modules/ConnectDiscord/services/apis.ts @@ -1,5 +1,7 @@ import { privateGateway } from "@/MuLearnServices/apiGateways"; import { dashboardRoutes, onboardingRoutes } from "@/MuLearnServices/urls"; +import toast from "react-hot-toast"; +import { NavigateFunction } from "react-router-dom"; type muid = UseStateFunc; export const connectDiscord = async (code: string) => { @@ -21,7 +23,11 @@ export const connectDiscord = async (code: string) => { return false; } }; -export const getInfo = (setMuid?: muid, onComplete?: Function) => { +export const getInfo = ( + navigate: NavigateFunction, + setMuid?: muid, + onComplete?: Function +) => { privateGateway .get(dashboardRoutes.getInfo) .then((response: APIResponse) => { @@ -29,6 +35,10 @@ export const getInfo = (setMuid?: muid, onComplete?: Function) => { "userInfo", JSON.stringify(response.data.response) ); + if (response.data.response?.interest_selected) { + toast.error(response.data.response?.interest_selected); + navigate("/register/interests"); + } if (setMuid) setMuid(response.data.response.muid); if (onComplete) onComplete(); }) diff --git a/src/types.d.ts b/src/types.d.ts index 95a07e63b..e1025df76 100644 --- a/src/types.d.ts +++ b/src/types.d.ts @@ -4,27 +4,29 @@ type UseStateFunc = React.Dispatch>; type FC = React.FC; type Role = - (typeof import("./services/types").roles)[keyof typeof import("./services/types").roles]; + typeof import("./services/types").roles[keyof typeof import("./services/types").roles]; -type ManagementTypes = (typeof import('./services/types').managementTypes)[keyof typeof import('./services/types').managementTypes] +type ManagementTypes = + typeof import("./services/types").managementTypes[keyof typeof import("./services/types").managementTypes]; type UserInfo = { - muid: string, - full_name: string, - email: string, - mobile: string, - gender: null, - dob: null, - active: boolean, - exist_in_guild: boolean, - joined: string, - roles: Role[], - dynamic_type?: ManagementTypes[], - cipher?: string, - profile_pic?: string, -} - -type ColOrder = { column: string, Label: string, isSortable: boolean } + muid: string; + full_name: string; + email: string; + mobile: string; + gender: null; + dob: null; + active: boolean; + exist_in_guild: boolean; + joined: string; + roles: Role[]; + dynamic_type?: ManagementTypes[]; + cipher?: string; + profile_pic?: string; + interest_selected: string | null; +}; + +type ColOrder = { column: string; Label: string; isSortable: boolean }; // just pass json structure type as parameters type APIResponse = { From 563d8645cc31b257e35f03b5c468b8ed587caefe Mon Sep 17 00:00:00 2001 From: ansan johny Date: Thu, 10 Oct 2024 21:12:04 +0530 Subject: [PATCH 12/31] feat:optimization --- .../Onboarding/UserInterest/UserInterest.tsx | 482 ++++++------------ 1 file changed, 160 insertions(+), 322 deletions(-) diff --git a/src/modules/Common/Authentication/pages/Onboarding/UserInterest/UserInterest.tsx b/src/modules/Common/Authentication/pages/Onboarding/UserInterest/UserInterest.tsx index df1807b75..68b821748 100644 --- a/src/modules/Common/Authentication/pages/Onboarding/UserInterest/UserInterest.tsx +++ b/src/modules/Common/Authentication/pages/Onboarding/UserInterest/UserInterest.tsx @@ -1,13 +1,15 @@ -import { useEffect, useState } from "react"; +import { useEffect, useState, useCallback } from "react"; +import { useNavigate } from "react-router-dom"; +import toast from "react-hot-toast"; +import { TagsInput } from "react-tag-input-component"; + import OnboardingHeader from "../../../components/OnboardingHeader/OnboardingHeader"; import { PowerfulButton } from "@/MuLearnComponents/MuButtons/MuButton"; -import styles from "./UserInterest.module.css"; -import muBrand from "/src/modules/Common/Authentication/assets/µLearn.png"; -import { TagsInput } from "react-tag-input-component"; import { privateGateway, publicGateway } from "@/MuLearnServices/apiGateways"; import { onboardingRoutes } from "@/MuLearnServices/urls"; -import toast from "react-hot-toast"; -import { useNavigate } from "react-router-dom"; + +import styles from "./UserInterest.module.css"; +import muBrand from "/src/modules/Common/Authentication/assets/µLearn.png"; import creative from "/src/modules/Common/Authentication/assets/interests/creative.svg"; import maker from "/src/modules/Common/Authentication/assets/interests/makers.svg"; import management from "/src/modules/Common/Authentication/assets/interests/management.svg"; @@ -15,374 +17,210 @@ import software from "/src/modules/Common/Authentication/assets/interests/softwa import others from "/src/modules/Common/Authentication/assets/interests/others.svg"; const CheckMark = () => ( - - + + ); +const INITIAL_INTERESTS = [ + { title: "Software", value: "software", img: software, checked: false }, + { title: "Maker", value: "maker", img: maker, checked: false }, + { title: "Management", value: "management", img: management, checked: false }, + { title: "Creative", value: "creative", img: creative, checked: false }, + { title: "Others", value: "others", img: others, checked: false } +]; + +const INITIAL_ENDGOALS = [ + { title: "Job", value: "job", checked: false }, + { title: "Higher Education", value: "higher_education", checked: false }, + { title: "Entrepreneurship", value: "entrepreneurship", checked: false }, + { title: "Gig Works", value: "gig_work", checked: false }, + { title: "Others", value: "others", checked: false } +]; + +type InterestGroup = { + id: string; + name: string; + category: string; +}; + +type InterestGroups = { + [key: string]: InterestGroup[]; +}; + export default function UserInterest() { - const [interests, setInterests] = useState([ - { title: "Software", value: "software", img: software, checked: false }, - { title: "Maker", value: "maker", img: maker, checked: false }, - { - title: "Management", - value: "management", - img: management, - checked: false - }, - { title: "Creative", value: "creative", img: creative, checked: false }, - { title: "Others", value: "others", img: others, checked: false } - ]); - const [endgoals, setEndgoals] = useState([ - { title: "Job", value: "job", checked: false }, - { - title: "Higher Education", - value: "higher_education", - checked: false - }, - { - title: "Entrepreneurship", - value: "entrepreneurship", - checked: false - }, - { title: "Gig Works", value: "gig_work", checked: false }, - { title: "Others", value: "others", checked: false } - ]); + const [interests, setInterests] = useState(INITIAL_INTERESTS); + const [endgoals, setEndgoals] = useState(INITIAL_ENDGOALS); const [otherInterest, setOtherInterest] = useState([]); const [otherEndgoal, setOtherEndgoal] = useState([]); const [stepTwo, setStepTwo] = useState(false); - const [interestGroups, setInterestGroups] = useState<{}>({}); + const [interestGroups, setInterestGroups] = useState({}); const navigate = useNavigate(); useEffect(() => { - publicGateway - .get(onboardingRoutes.interestGroups) - .then(res => { - var data: [] = res.data?.response?.interestGroup ?? []; - var interestGroupsData = {}; - for (let interest of interests) { - (interestGroupsData as any)[interest.value] = data.filter( - (group: any) => group?.category == interest.value - ); - } + const fetchInterestGroups = async () => { + try { + const res = await publicGateway.get(onboardingRoutes.interestGroups); + const data: InterestGroup[] = res.data?.response?.interestGroup ?? []; + + const interestGroupsData = interests.reduce((acc, interest) => ({ + ...acc, + [interest.value]: data.filter(group => group.category === interest.value) + }), {}); + setInterestGroups(interestGroupsData); - }) - .catch(err => { - console.log(err); - }); - }, []); - - const handleInterestChange = (value: any) => { - if (value === "others") { - if ( - interests.filter(interest => interest.value === value)[0] - .checked - ) { - setOtherInterest([]); + } catch (err) { + console.error('Failed to fetch interest groups:', err); } - } - setInterests( - interests.map(interest => - interest.value === value - ? { ...interest, checked: !interest.checked } - : interest - ) - ); - }; + }; - const handleEndgoalChange = (value: any) => { - if (value === "others") { - if ( - endgoals.filter(endgoal => endgoal.value === value)[0].checked - ) { - setOtherEndgoal([]); - } - } - setEndgoals( - endgoals.map(endgoal => - endgoal.value === value - ? { ...endgoal, checked: !endgoal.checked } - : endgoal - ) - ); - }; + fetchInterestGroups(); + }, []); - const handleContinue = () => { - const selectedInterests = interests - .filter(interest => interest.checked) - .map(interest => interest); - if (selectedInterests.find(interest => interest.value === "others")) { - if (otherInterest.length === 0) { - return; + const handleChange = useCallback((value: string, isInterest: boolean) => { + const setter = isInterest ? setInterests : setEndgoals; + const otherSetter = isInterest ? setOtherInterest : setOtherEndgoal; + + + setter((prev:any) => { + const newItems = prev.map((item:any) => + item.value === value ? { ...item, checked: !item.checked } : item + ); + + if (value === "others" && newItems.find((item:any) => item.value === "others")?.checked === false) { + otherSetter([]); } + + return newItems; + }); + }, []); + + const handleContinue = useCallback(() => { + const selectedInterests = interests.filter(interest => interest.checked); + if (selectedInterests.some(i => i.value === "others") && otherInterest.length === 0) { + return; } if (selectedInterests.length > 0 || otherInterest.length > 0) { setStepTwo(true); } - }; + }, [interests, otherInterest]); - const handleSubmit = () => { - const selectedInterests = interests - .filter(interest => interest.checked) - .map(interest => interest); - const selectedEndgoals = endgoals - .filter(endgoal => endgoal.checked) - .map(endgoal => endgoal); + const handleSubmit = useCallback(async () => { + const selectedInterests = interests.filter(i => i.checked).map(i => i.value); + const selectedEndgoals = endgoals.filter(e => e.checked).map(e => e.value); + const data = { - choosen_interests: selectedInterests.map( - interest => interest.value - ), - choosen_endgoals: selectedEndgoals.map(endgoal => endgoal.value), + choosen_interests: selectedInterests, + choosen_endgoals: selectedEndgoals, other_interests: otherInterest, other_endgoals: otherEndgoal }; + try { - privateGateway - .post(onboardingRoutes.interests, data) - .then(res => { - toast.success(res.data?.message.general[0]); - navigate("/dashboard/connect-discord"); - }) - .catch(err => { - toast.error(err.response?.data.message.general[0]); - }); - } catch (err) { - toast.error("Unexpected Error occured"); + const res = await privateGateway.post(onboardingRoutes.interests, data); + toast.success(res.data?.message.general[0]); + navigate("/dashboard/connect-discord"); + } catch (err: any) { + toast.error(err.response?.data.message.general[0] || "Unexpected Error occurred"); } - }; + }, [interests, endgoals, otherInterest, otherEndgoal, navigate]); const isInterestSelected = interests.some(interest => interest.checked); const isEndgoalSelected = endgoals.some(endgoal => endgoal.checked); - return stepTwo ? ( - <> - -
-
- mulearn -

What describes you the most!

-

- Choose one or goals you expect from µLearn. -

-
- {endgoals.map(endgoal => { - let classname = `${styles.itemsCard} ${ - endgoal.checked && styles.checked - }`; - return ( -
- handleEndgoalChange(endgoal.value) - } - > - {endgoal.checked && } -

{endgoal.title}

+ const renderItems = useCallback((items: typeof interests | typeof endgoals, isInterest: boolean) => ( +
+ {items.map(item => { + const isOthers = item.value === "others"; + const isChecked = item.checked; + const otherItems = isInterest ? otherInterest : otherEndgoal; + const setOtherItems = isInterest ? setOtherInterest : setOtherEndgoal; - {endgoal.value == "others" ? ( - endgoals.find( - endgoal => - endgoal.value === "others" - )?.checked && ( -
{ - e.stopPropagation(); - }} - > - { - if ( - e.target.value - .length > 0 - ) { - setOtherEndgoal([ - ...otherEndgoal, - e.target.value - ]); - e.target.value = ""; - } - }} - onChange={setOtherEndgoal} - name="other_endgoals" - placeHolder="Specify your endgoals" - /> -
- ) - ) : ( - <> - )} + return ( +
handleChange(item.value, isInterest)} + > + {isChecked && } + {isInterest ? ( +
+ +

{item.title}

+
+ ) : ( +

{item.title}

+ )} + {isInterest && ( + <> +
e.stopPropagation()}> + + + + +
+
+

This category includes:

+
    + {interestGroups[item.value]?.map((group: InterestGroup) => ( +
  • {group.name}
  • + ))} +
- ); - })} + + )} + {isOthers && isChecked && ( +
e.stopPropagation()}> + { + if (e.target.value.length > 0) { + setOtherItems([...otherItems, e.target.value]); + e.target.value = ""; + } + }} + onChange={setOtherItems} + name={`other_${isInterest ? 'interests' : 'endgoals'}`} + placeHolder={`Specify your ${isInterest ? 'interest' : 'endgoal'}`} + separators={isInterest ? [","] : undefined} + /> +
+ )}
+ ); + })} +
+ ), [handleChange, interestGroups, otherInterest, otherEndgoal]); - {isEndgoalSelected && ( - - Submit - - )} -
-
- - ) : ( + return ( <>
mulearn -

Your dynamic area of interest!

+

{stepTwo ? "What describes you the most!" : "Your dynamic area of interest!"}

- Please select your interested area + {stepTwo ? "Choose one or goals you expect from µLearn." : "Please select your interested area"}

-
- {interests.map(interest => { - let classname = `${styles.itemsCard} ${ - interest.checked && styles.active - }`; - return ( -
- handleInterestChange(interest.value) - } - > - {interest.checked && } -
- -

- {interest.title} -

-
-
{ - e.stopPropagation(); - }} - > - - - - -
-
-

This category includes:

-
    - {(interestGroups as any)[ - interest.value - ]?.map((group: any) => ( -
  • - {group.name} -
  • - ))} -
-
- {interest.value == "others" ? ( - interests.find( - interest => - interest.value === "others" - )?.checked && ( - <> -
{ - e.stopPropagation(); - }} - > - { - if ( - e.target.value - .length > 0 - ) { - setOtherInterest( - [ - ...otherInterest, - e.target - .value - ] - ); - e.target.value = - ""; - } - }} - separators={[","]} - onChange={ - setOtherInterest - } - name="other_interests" - placeHolder="Specify your interest" - /> -
- - ) - ) : ( - <> - )} -
- ); - })} -
+ + {stepTwo ? renderItems(endgoals, false) : renderItems(interests, true)} - {isInterestSelected && ( + {(stepTwo ? isEndgoalSelected : isInterestSelected) && ( - Continue + {stepTwo ? "Submit" : "Continue"} )}
); -} +} \ No newline at end of file From bb2fdc3249c700a6741bda909e2f56de80146f43 Mon Sep 17 00:00:00 2001 From: ansan johny Date: Sat, 12 Oct 2024 01:43:23 +0530 Subject: [PATCH 13/31] code --- .../Organization/Organization.module.css | 60 +++++ .../pages/Organization/Organization.tsx | 228 ++++++++++++++++++ .../pages/Settings/SettingsHome.module.css | 26 ++ .../Settings/pages/Settings/SettingsHome.tsx | 29 +++ 4 files changed, 343 insertions(+) create mode 100644 src/modules/Dashboard/modules/Settings/pages/Organization/Organization.module.css create mode 100644 src/modules/Dashboard/modules/Settings/pages/Organization/Organization.tsx create mode 100644 src/modules/Dashboard/modules/Settings/pages/Settings/SettingsHome.module.css create mode 100644 src/modules/Dashboard/modules/Settings/pages/Settings/SettingsHome.tsx diff --git a/src/modules/Dashboard/modules/Settings/pages/Organization/Organization.module.css b/src/modules/Dashboard/modules/Settings/pages/Organization/Organization.module.css new file mode 100644 index 000000000..df4cf3591 --- /dev/null +++ b/src/modules/Dashboard/modules/Settings/pages/Organization/Organization.module.css @@ -0,0 +1,60 @@ +@import url("https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@200;300;400;500;600;700;800&display=swap"); + +.wrapper { + padding: 1rem; + display: flex; + justify-content: center; + align-items: center; +} + +.tableWrapper { + background-color: white; + border-radius: 10px; + padding: 2rem; + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); +} + +.wrapper form { + width: 20rem; +} + +.inputBox { + width: 100%; + height: 2.5rem; + margin-top: 1.5rem; +} + +.inputBox span { + color: red; + font-size: small; + margin-left: 15px; +} + +.inputBox input { + width: 100%; + height: 100%; + background: #f3f3f4; + border-radius: 8px; + border: none; + padding: 1rem; +} + +.submit { + display: flex; + justify-content: center; + align-items: center; +} + +.submit button { + width: 100%; + color: white; +} + +.text { + font-weight: 700; +} + +.errorsSpan { + color: red; + font-size: small; +} \ No newline at end of file diff --git a/src/modules/Dashboard/modules/Settings/pages/Organization/Organization.tsx b/src/modules/Dashboard/modules/Settings/pages/Organization/Organization.tsx new file mode 100644 index 000000000..79901008f --- /dev/null +++ b/src/modules/Dashboard/modules/Settings/pages/Organization/Organization.tsx @@ -0,0 +1,228 @@ +import { PowerfulButton } from "@/MuLearnComponents/MuButtons/MuButton"; +import styles from "./Organization.module.css"; +import { Form, Formik } from "formik"; +import * as z from "yup"; +import { FormikTextInputWithoutLabel as SimpleInput } from "@/MuLearnComponents/FormikComponents/FormikComponents"; +import { useEffect, useState } from "react"; +import { + getColleges, + getDepartments, + getRoles, + submitUserData +} from "../../../../../Common/Authentication/services/newOnboardingApis"; +import ReactSelect from "react-select"; +import { useLocation, useNavigate } from "react-router-dom"; + +const inputObject = { + college: "College Name", + department: "Department", + graduationYear: "Graduation Year" +}; + +const scheme = z.object({ + college: z + .string() + .required(`${inputObject.college} is Required`) + .min(3, `${inputObject.college} must be at least 3 characters`) + .max(100, `${inputObject.college} must be at most 100 characters`), + department: z + .string() + .required(`${inputObject.department} is Required`) + .min(2, `${inputObject.department} must be at least 2 characters`) + .max(100, `${inputObject.department} must be at most 100 characters`), + graduationYear: z + .number() + .integer() + .positive() + .when("role", { + is: "student", + then: s => + s + .required(`${inputObject.graduationYear} is Required`) + .min(2000, `${inputObject.graduationYear} > 2000`) + .max(2030, `${inputObject.graduationYear} < 2030`) + }) +}); + +export default function CollegePage({}: {}) { + const navigate = useNavigate(); + const location = useLocation(); + let userData: any = location.state as Object; + + const [isloading, setIsLoading] = useState(true); + const [colleges, setColleges] = useState([{ id: "", title: "" }]); + const [departments, setDepartments] = useState([{ id: "", title: "" }]); + const [roles, setRoles] = useState([{ id: "", title: "" }]); + + const [selectedCollege, setSelectedCollege] = useState({ + id: "", + title: "" + }); + const [selectedDepartment, setSelectedDepartment] = useState({ + id: "", + title: "" + }); + + const getRoleTitle = (id: string) => { + const slice = roles.filter(val => val.id === id); + if (slice[0]) return slice[0].title; + }; + + const CustomFilter = ( + { label, value }: { label: string; value: string }, + string: string + ): boolean => { + if (value === "Others") return true; + if (!string) return true; + return label.toLowerCase().includes(string.toLowerCase()); + }; + + useEffect(() => { + getColleges({ + setIsLoading: setIsLoading, + setColleges: setColleges + }); + getDepartments({ + setIsLoading: setIsLoading, + setDepartments: setDepartments + }); + getRoles().then((res: any) => { + setRoles(res); + setIsLoading(false); + }); + }, []); + + const onSubmit = async (values: any) => { + const newUserData: any = { + user: { + full_name: userData.user.full_name, + email: userData.user.email, + password: userData.user.password, + district: userData.district + }, + organization: { + ...(values.department !== "Others" && { + department: values.department + }), + year_of_graduation: values.graduationYear, + organizations: [ + ...(values.college !== "Others" ? [values.college] : []), + ...userData.communities + ], + verified: true + } + }; + + if (userData.referral) + newUserData["referral"] = { muid: userData.referral.muid }; + + if (userData.role === "Enabler") + delete newUserData.organization.year_of_graduation; + + console.log(newUserData); + + submitUserData({ + setIsLoading: setIsLoading, + userData: newUserData, + navigate: navigate + }); + }; + + return ( + [key, ""]) + )} + validationSchema={scheme} + onSubmit={(value, action) => onSubmit(value)} + > + {formik => ( +
+
+
+ Please enter your college details +
+
+ ({ + value: college.id, + label: college.title + })) + ]} + name="college" + placeholder="College" + value={selectedCollege.title} + filterOption={CustomFilter} + isDisabled={isloading} + onChange={(e: any) => { + setSelectedCollege(e); + formik.setFieldValue("college", e.value); + }} + /> +
+ {formik.touched.college && formik.errors.college && ( + + {formik.errors.college} + + )} +
+ ({ + value: department.id, + label: department.title + })) + ]} + name="department" + placeholder="Department" + value={selectedDepartment.title} + isDisabled={isloading} + filterOption={CustomFilter} + onChange={(e: any) => { + setSelectedDepartment(e); + formik.setFieldValue("department", e.value); + }} + /> +
+ {formik.touched.department && + formik.errors.department && ( + + {formik.errors.department} + + )} +
+ + {formik.touched.graduationYear && + formik.errors.graduationYear && ( + + {formik.errors.graduationYear} + + )} +
+ +
+ + {isloading ? "Please wait..." : "Submit"} + +
+
+
+ )} +
+ ); +} diff --git a/src/modules/Dashboard/modules/Settings/pages/Settings/SettingsHome.module.css b/src/modules/Dashboard/modules/Settings/pages/Settings/SettingsHome.module.css new file mode 100644 index 000000000..960ac4601 --- /dev/null +++ b/src/modules/Dashboard/modules/Settings/pages/Settings/SettingsHome.module.css @@ -0,0 +1,26 @@ +.container { + display: flex; + justify-content: space-around; + padding: 20px; +} + +.column { + display: flex; + flex-direction: column; + align-items: center; +} + +.button { + padding: 10px 20px; + font-size: 16px; + cursor: pointer; + background-color: #007bff; + color: white; + border: none; + border-radius: 5px; + transition: background-color 0.3s ease; +} + +.button:hover { + background-color: #0056b3; +} diff --git a/src/modules/Dashboard/modules/Settings/pages/Settings/SettingsHome.tsx b/src/modules/Dashboard/modules/Settings/pages/Settings/SettingsHome.tsx new file mode 100644 index 000000000..ca0072cf2 --- /dev/null +++ b/src/modules/Dashboard/modules/Settings/pages/Settings/SettingsHome.tsx @@ -0,0 +1,29 @@ +import { useNavigate } from "react-router-dom"; +import styles from "./SettingsHome.module.css"; + +export default function SettingsHome(): JSX.Element { + const navigate = useNavigate(); + + return ( +
+
+ +
+ +
+ +
+
+ ); +} + From 8b66edc468f88b0d905dd1df2839b05d8d9e2a88 Mon Sep 17 00:00:00 2001 From: ansan johny Date: Sat, 12 Oct 2024 01:54:59 +0530 Subject: [PATCH 14/31] feat:Settings Page --- src/App.tsx | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/App.tsx b/src/App.tsx index 6828ce635..117c1d7e9 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -44,6 +44,8 @@ import Refund from "./modules/Public/Donation/pages/Refund"; import DonationSuccess from "./modules/Public/Donation/pages/DonationSuccess"; import OpenGrad from "./modules/Dashboard/modules/OpenGrad"; import UserInterest from "./modules/Common/Authentication/pages/Onboarding/UserInterest/UserInterest"; +import OrganizationSetting from "./modules/Dashboard/modules/Settings/pages/Organization/Organization"; +import SettingsHome from "./modules/Dashboard/modules/Settings/pages/Settings/SettingsHome"; const Profile = lazy( () => import("./modules/Dashboard/modules/Profile/pages/Profile") @@ -731,6 +733,14 @@ function App() { path: "settings", element: , children: [ + { + path: "", + element: + }, + { + path: "organization", + element: + }, { path: "account", element: From 64a68354e502bd22f849fefcedb09b786764bd69 Mon Sep 17 00:00:00 2001 From: ansan johny Date: Sat, 12 Oct 2024 02:02:47 +0530 Subject: [PATCH 15/31] feat:submiticonsapcing --- .../Settings/pages/Organization/Organization.module.css | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/modules/Dashboard/modules/Settings/pages/Organization/Organization.module.css b/src/modules/Dashboard/modules/Settings/pages/Organization/Organization.module.css index df4cf3591..2d04c5326 100644 --- a/src/modules/Dashboard/modules/Settings/pages/Organization/Organization.module.css +++ b/src/modules/Dashboard/modules/Settings/pages/Organization/Organization.module.css @@ -40,6 +40,7 @@ } .submit { + margin-top: 20px; display: flex; justify-content: center; align-items: center; @@ -57,4 +58,4 @@ .errorsSpan { color: red; font-size: small; -} \ No newline at end of file +} From a26588482a700b14b3f8f8c90ff9fea311e3a04c Mon Sep 17 00:00:00 2001 From: ansan johny Date: Sat, 12 Oct 2024 03:36:51 +0530 Subject: [PATCH 16/31] feat:url fix --- .../Dashboard/components/SideNavBarBody.tsx | 42 +++++++++---------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/src/modules/Dashboard/components/SideNavBarBody.tsx b/src/modules/Dashboard/components/SideNavBarBody.tsx index 434b45f9b..6e2d60a43 100644 --- a/src/modules/Dashboard/components/SideNavBarBody.tsx +++ b/src/modules/Dashboard/components/SideNavBarBody.tsx @@ -54,16 +54,15 @@ const SideNavBarBody = ({ .filter( button => button.hasView && - ((!button.roles || + (!button.roles || button.roles?.some(role => userInfo?.roles?.includes(role) + ) || + button.dynamicType?.some(type => + userInfo?.dynamic_type?.includes( + type as ManagementTypes + ) )) - || - ( - button.dynamicType?.some(type => - userInfo?.dynamic_type?.includes(type as ManagementTypes) - )) - ) ) .map((button, i) => button.children ? ( @@ -87,12 +86,12 @@ const SideNavBarBody = ({ userInfo?.roles?.includes( role ) - ) - || - ( - button.dynamicType?.some(type => - userInfo?.dynamic_type?.includes(type as ManagementTypes) - ))) + ) || + button.dynamicType?.some(type => + userInfo?.dynamic_type?.includes( + type as ManagementTypes + ) + )) ) .map((button, i) => button.children ? ( @@ -110,7 +109,7 @@ const SideNavBarBody = ({ } display={ level2dropDownDisplay === - button.title + button.title ? "max-content" : "0" } @@ -124,12 +123,13 @@ const SideNavBarBody = ({ userInfo?.roles?.includes( role ) - ) - || - ( - button.dynamicType?.some(type => - userInfo?.dynamic_type?.includes(type as ManagementTypes) - ))) + ) || + button.dynamicType?.some( + type => + userInfo?.dynamic_type?.includes( + type as ManagementTypes + ) + )) ) .map((button, i) => ( } - onClick={() => navigate("/dashboard/settings/account")} + onClick={() => navigate("/dashboard/settings")} style={{ color: "#9297AA", backgroundColor: "#fff" From 65ef847ec974ab4030549b565dfd14b788429486 Mon Sep 17 00:00:00 2001 From: ansan johny Date: Sat, 12 Oct 2024 04:05:58 +0530 Subject: [PATCH 17/31] feat:settings bug fix --- .../pages/Organization/Organization.tsx | 66 ++++++++++--------- 1 file changed, 35 insertions(+), 31 deletions(-) diff --git a/src/modules/Dashboard/modules/Settings/pages/Organization/Organization.tsx b/src/modules/Dashboard/modules/Settings/pages/Organization/Organization.tsx index 79901008f..59a125bfe 100644 --- a/src/modules/Dashboard/modules/Settings/pages/Organization/Organization.tsx +++ b/src/modules/Dashboard/modules/Settings/pages/Organization/Organization.tsx @@ -10,9 +10,15 @@ import { getRoles, submitUserData } from "../../../../../Common/Authentication/services/newOnboardingApis"; -import ReactSelect from "react-select"; +import ReactSelect, { SingleValue } from "react-select"; import { useLocation, useNavigate } from "react-router-dom"; +// Define the Option type for ReactSelect +type Option = { + value: string; + label: string; +}; + const inputObject = { college: "College Name", department: "Department", @@ -54,14 +60,8 @@ export default function CollegePage({}: {}) { const [departments, setDepartments] = useState([{ id: "", title: "" }]); const [roles, setRoles] = useState([{ id: "", title: "" }]); - const [selectedCollege, setSelectedCollege] = useState({ - id: "", - title: "" - }); - const [selectedDepartment, setSelectedDepartment] = useState({ - id: "", - title: "" - }); + const [selectedCollege, setSelectedCollege] = useState
- {data ? ( + {props.lc ? ( <>
-

- {convertDateToDayAndMonthAndYear( - data?.meet_time - )} -

-

{getDayOfWeek(data?.meet_time)}

+

{props.lc?.title}

+

{getDayOfWeek(props.lc?.meet_time)}

{

- Venuesdf:{" "} - {data.meet_place || + Venue:{" "} + {props.lc.meet_place || props.lc?.meet_place}

}

Time:{" "} - {convert24to12( - extract24hTimeFromDateTime( - data.meet_time - ) - )} + {convertToFormatedDate(props.lc.meet_time) + + " " + + convert24to12( + extract24hTimeFromDateTime( + props.lc.meet_time + ) + )}

+ {props.lc.is_lc_member && ( + <> +

Meet Code: {props.lc.meet_code}

+

+ Total interests: + {" " + props.lc.total_interested} +

+

+ Total joinees: + {" " + props.lc.total_joined} +

+ + )}

Agenda

-

{data.agenda}

+

{props.lc.agenda}

-
-

Attendees

- {Array.isArray(data.attendees_details) && - data.attendees_details.map(attendee => ( -
- -
- ))} -
-
- -
+ {props.lc.image ? ( +
+ +
+ ) : null}
+ + {props.lc.is_lc_member + ? props.lc.is_started + ? "Join" + : "Join & Start meetup" + : props.lc.joined_at + ? "Joined" + : props.lc.is_interested + ? "Undo Interest" + : "I'm Interested Join"} + ) : (
{ - const nextMeet = getNextMeetingDate( - props.lc?.day || [], - props.lc?.meet_time === null ? "00:00" : String(props.lc?.meet_time) - ); - - const [selectedMeeting, setSelectedMeeting] = useState(""); - + const [meetups, setMeetups] = useState([]); + const [pastMeetups, setPastMeetups] = useState([]); + const [selectedMeeting, setSelectedMeeting] = useState(""); + useEffect(() => { + getLcMeetups(props.id ?? "").then(res => { + if (res) { + if (res.hasError) { + toast.error(res.message.general[0]); + } else { + setMeetups(res.meetups); + setPastMeetups(res.past); + } + } + }); + }, [props.lc]); + const navigate = useNavigate(); return (
@@ -40,8 +47,8 @@ const LcHome = (props: Props) => { ...props.temp, isReport: false, isHistory: false, - isTeam: false, - isSchedule: false + isTeam: false + // isSchedule: false }) } > @@ -59,7 +66,245 @@ const LcHome = (props: Props) => { Team
- {props.temp.isReport ? ( +
+
+
+ {props.temp.isReport ? ( + + ) : props.temp.isCreateMeeting ? ( + + ) : ( + <> +
+ {meetups.length > 0 ? ( + meetups.map(meetup => ( +
+
+
+ + + + {convertToFormatedDate( + meetup.meet_time + )} +
+
+ {meetup.is_started + ? "Ongoing" + : "Upcoming"} +
+
+
+

+ {meetup.title} +

+

+ {meetup.agenda} +

+
+

+ Venue Details +

+
+
+ + { + meetup.meet_place + } + +
+ + { + meetup.location + } + +
+
+ { + props.setTemp( + prev => ({ + ...prev, + isReport: + true + }) + ); + setSelectedMeeting( + meetup.id + ); + }} + > + Submit Report + + { + navigate( + "/dashboard/learning-circle/meetup/" + + meetup.id + ); + }} + > + More Info + +
+
+
+
+ )) + ) : ( + <> +
+

+ Next meeting not scheduled. +
+ Kindly schedule a meeting. +

+
+ + + )} +
+ + {/*
+
+ {props.lc?.meet_place && ( +

Venue: {props.lc?.meet_place}

+ )} + {props.lc?.meet_time && ( +

Time: {nextMeet?.formattedTime}

+ )} +
+ {props.lc?.meet_time && ( + + )} +
*/} + + )} +
+
+ {props.lc?.previous_meetings && + props.lc?.previous_meetings.length > 0 && ( +

Your past meetings

+ )} +
+ {pastMeetups.map((report, index) => ( +
{ + navigate( + "/dashboard/learning-circle/meetup/" + + report.id + ); + }} + > +
+

{index + 1}.

+

+ {convertToFormatedDate( + report.meet_time + )} +

+
+
+

+ {convertToFormatedDate( + report.meet_time + )}{" "} + {convert24to12( + extract24hTimeFromDateTime( + report.meet_time + ) + )} +

+ +
+
+ ))} +
+
+
+
+ {/* {props.temp.isReport ? ( ) : props.temp.isHistory ? ( @@ -67,8 +312,8 @@ const LcHome = (props: Props) => {
- {props.temp.isSchedule ? ( - { <>
{nextMeet && - props.lc?.meet_place && - props.lc?.meet_time ? ( + props.lc?.meet_place && + props.lc?.meet_time ? (

Next meeting on

@@ -103,7 +348,7 @@ const LcHome = (props: Props) => { onClick={() => { props.setTemp(prev => ({ ...prev, - isSchedule: true + isCreateMeeting: true })); }} > @@ -125,16 +370,18 @@ const LcHome = (props: Props) => {

)}

- {props.lc?.meet_time && ()} + {props.lc?.meet_time && ( + + )}
)} @@ -151,52 +398,11 @@ const LcHome = (props: Props) => {

Your past meetings

)}
- {props.lc?.previous_meetings.map( - (report, index) => ( -
{ - props.setTemp({ - ...props.temp, - isReport: false, - isHistory: true - }); - setSelectedMeeting(report.id); - }} - > -
-

{index + 1}.

-

- {convertToFormatedDate( - report.meet_time - )} -

-
-
-

- {convert24to12( - extract24hTimeFromDateTime( - report.meet_time - ) - )} -

- -
-
- ) - )} +
- )} + )} */}
); }; diff --git a/src/modules/Dashboard/modules/LearningCircle/pages/LcDashboard/components/LcMeetCreate.tsx b/src/modules/Dashboard/modules/LearningCircle/pages/LcDashboard/components/LcMeetCreate.tsx new file mode 100644 index 000000000..22c341b8d --- /dev/null +++ b/src/modules/Dashboard/modules/LearningCircle/pages/LcDashboard/components/LcMeetCreate.tsx @@ -0,0 +1,257 @@ +import { Dispatch, SetStateAction, useState } from "react"; +import styles from "../LcDashboard.module.css"; +import toast from "react-hot-toast"; +import { + createMeetup, + setLCMeetTime +} from "../../../services/LearningCircleAPIs"; +import { useFormik } from "formik"; +import { Switch } from "@chakra-ui/react"; + +type Props = { + setTemp: Dispatch>; + lc: LcDetail | undefined; + id: string | undefined; +}; + +const LcMeetCreate = (props: Props) => { + const formik = useFormik({ + initialValues: { + title: "", + location: "", + meet_time: "", + meet_place: "", + agenda: "", + need_pre_requirements: false, + pre_requirements: null, + is_public: true, + limit_attendees: false, + max_attendees: -1 + }, + onSubmit: values => { + createMeetup(values, props.id ?? "") + .then(res => { + console.log(res); + if (res) { + if (res.hasError) { + toast.error(res.message.general[0]); + } else { + toast.success(res.message.general[0]); + } + } + }) + .catch(err => { + toast.error("Failed to create meetup"); + }); + + props.setTemp(prev => ({ + ...prev, + isCreateMeeting: false + })); + }, + validate: values => { + if (values.location === "") { + return { location: "Location is required" }; + } else if (!values.location.startsWith("http")) { + return { + location: + "Location should be link to maps location or online meet link." + }; + } + } + }); + + return ( + <> +
+ Create a Meetup +

Enter details to schedule a meet

+
+ +
+
+
+ + + +
+
+ +
+ + {formik.touched.title && formik.errors.title ? ( +

+ {formik.errors.title} +

+ ) : null} +
+
+
+ +
+ + {formik.touched.agenda && formik.errors.agenda ? ( +

+ {formik.errors.agenda} +

+ ) : null} +
+
+
+ +
+ + {formik.touched.location && + formik.errors.location ? ( +

+ {formik.errors.location} +

+ ) : null} +
+
+
+ + { + formik.setFieldValue( + "is_public", + e.target.checked + ); + }} + /> +
+
+ + { + formik.setFieldValue( + "need_pre_requirements", + e.target.checked + ); + }} + /> +
+ {formik.values.need_pre_requirements && ( +
+ +
+ + {formik.touched.pre_requirements && + formik.errors.pre_requirements ? ( +

+ {formik.errors.pre_requirements} +

+ ) : null} +
+
+ )} +
+ + { + if (!e.target.checked) { + formik.setFieldValue("max_attendees", -1); + } else { + formik.setFieldValue("max_attendees", 100); + } + formik.setFieldValue( + "limit_attendees", + e.target.checked + ); + }} + /> +
+ {formik.values.limit_attendees && ( +
+ +
+ + {formik.touched.max_attendees && + formik.errors.max_attendees ? ( +

+ {formik.errors.max_attendees} +

+ ) : null} +
+
+ )} +
+ +
+
+
+ + ); +}; + +export default LcMeetCreate; diff --git a/src/modules/Dashboard/modules/LearningCircle/pages/LcDashboard/components/LcMeetups.tsx b/src/modules/Dashboard/modules/LearningCircle/pages/LcDashboard/components/LcMeetups.tsx new file mode 100644 index 000000000..22f9e582c --- /dev/null +++ b/src/modules/Dashboard/modules/LearningCircle/pages/LcDashboard/components/LcMeetups.tsx @@ -0,0 +1,94 @@ +import styles from "../../LearningCircle.module.css"; +import imageBottom from "../../../assets/images/LC3.webp"; +import { PowerfulButton } from "@/MuLearnComponents/MuButtons/MuButton"; +import { useNavigate } from "react-router-dom"; +import { useEffect, useState } from "react"; +import { BsChevronRight } from "react-icons/bs"; +import { getMeetups } from "../../../services/LearningCircleAPIs"; +import toast from "react-hot-toast"; + +const LcMeetups = () => { + const navigate = useNavigate(); + const [meetups, setMeetups] = useState(); + useEffect(() => { + getMeetups(setMeetups) + .then(() => {}) + .catch(error => { + console.log(error); + toast.error("Failed to fetch meetups"); + }); + }, []); + + return ( +
+ ); +}; + +export default LcMeetups; diff --git a/src/modules/Dashboard/modules/LearningCircle/pages/LcDashboard/components/LcReport.tsx b/src/modules/Dashboard/modules/LearningCircle/pages/LcDashboard/components/LcReport.tsx index 7a80f72e5..7d10a59d5 100644 --- a/src/modules/Dashboard/modules/LearningCircle/pages/LcDashboard/components/LcReport.tsx +++ b/src/modules/Dashboard/modules/LearningCircle/pages/LcDashboard/components/LcReport.tsx @@ -12,28 +12,9 @@ type Props = { }; const LcReport = (props: Props) => { - const [formData, setFormData] = useState({ - day: "", - meet_time: "", - agenda: "", - attendees: [] - }); + const [reportText, setReportText] = useState(""); const [uploadedImage, setUploadedImage] = useState(null); - useEffect(() => { - const now = new Date(); - const hours = now.getHours().toString().padStart(2, "0"); - const minutes = now.getMinutes().toString().padStart(2, "0"); - const year = now.getFullYear().toString(); - const month = (now.getMonth() + 1).toString().padStart(2, "0"); - const day = now.getDate().toString().padStart(2, "0"); - setFormData(prevState => ({ - ...prevState, - day: `${year}-${month}-${day}`, - meet_time: `${hours}:${minutes}:00` - })); - }, []); - const handleImageUpload = (event: React.ChangeEvent) => { const file = event.target.files && event.target.files[0]; if (file) { @@ -41,61 +22,15 @@ const LcReport = (props: Props) => { } }; - const handleMemberClick = (memberId: string) => { - setFormData(prevState => { - // Check if the attendee is already in the list - const isAlreadySelected = prevState.attendees.includes(memberId); - - // If already selected, remove them; otherwise, add them - const updatedAttendees = isAlreadySelected - ? prevState.attendees.filter(id => id !== memberId) // Remove the attendee - : [...prevState.attendees, memberId]; // Add the attendee - - return { - ...prevState, - attendees: updatedAttendees - }; - }); - }; - - const validateForm = (state: LcReport) => { - let errors: { [key: string]: string } = {}; - if (!state.day) { - errors.day = "Date is required"; - } - if (!state.meet_time) { - errors.time = "Time is required"; - } - if (!state.agenda.trim()) { - errors.agenda = "Agenda is required"; - } - if (state.attendees.length === 0) { - errors.attendees = "At least one attendee is required"; - } - if (!uploadedImage) { - errors.image = "Image is required"; - } else { - const allowedTypes = ["image/jpeg", "image/png", "image/gif"]; - if (!allowedTypes.includes(uploadedImage.type)) { - errors.image = - "Invalid image type. Please upload a JPEG, PNG, or GIF."; - } - } - { - Object.keys(errors).length > 0 - ? toast.error(Object.values(errors).join("\n")) - : null; - } - return Object.keys(errors).length > 0 ? false : true; - }; - const handleSubmit = (event: any) => { event.preventDefault(); - if (validateForm(formData)) { + if (!uploadedImage) { + toast.error("Please upload an image"); + return; + } + if (reportText.length > 0) { const data = new FormData(); - data.append("agenda", formData.agenda); - data.append("attendees", formData.attendees.join(",")); - data.append("time", formData.meet_time); + data.append("report_text", reportText); if (uploadedImage) { data.append("images", uploadedImage); } @@ -122,10 +57,21 @@ const LcReport = (props: Props) => { } ); - - return Failed to report meeting!; + return error?.response?.data?.message ? ( + + { + (error?.response?.data?.message?.general ?? [ + "Failed to report meeting" + ])[0] + } + + ) : ( + Failed to report meeting! + ); } }); + } else { + toast.error("Please fill the notes"); } }; @@ -136,7 +82,7 @@ const LcReport = (props: Props) => { return (
-
+ {/*
{ } />
-
+
*/}
-

Agenda

+

What happened on the meet? *

-
-

Attendees

-
- {props.lc?.members.map(member => ( -
handleMemberClick(member.id)} - > - -
- ))} - {/* */} -
-
diff --git a/src/modules/Dashboard/modules/LearningCircle/pages/LcDashboard/components/YourLc.tsx b/src/modules/Dashboard/modules/LearningCircle/pages/LcDashboard/components/YourLc.tsx new file mode 100644 index 000000000..e1cca1351 --- /dev/null +++ b/src/modules/Dashboard/modules/LearningCircle/pages/LcDashboard/components/YourLc.tsx @@ -0,0 +1,107 @@ +import styles from "../../LearningCircle.module.css"; +import imageBottom from "../../../assets/images/LC3.webp"; +import { PowerfulButton } from "@/MuLearnComponents/MuButtons/MuButton"; +import { useNavigate } from "react-router-dom"; +import { useEffect, useState } from "react"; +import { BsChevronRight } from "react-icons/bs"; +import { getUserLearningCircles } from "../../../services/LearningCircleAPIs"; + +const YourLc = ({ userCircleList }: { userCircleList: LcType[] }) => { + const navigate = useNavigate(); + + return ( +
+
+
    + {userCircleList && userCircleList.length > 0 ? ( + <> + Your learning circles + {userCircleList?.map((circle, pos) => ( +
    +
  • { + navigate( + `/dashboard/learning-circle/dashboard/${circle.id}` + ); + }} + > + + +
  • +
    + ))} + + ) : ( +
    + You haven't joined any circles yet + Nothing yet! +

    You haven't joined any learning circles yet.

    +
    + )} +
+
+
+ ); +}; + +export default YourLc; diff --git a/src/modules/Dashboard/modules/LearningCircle/pages/LearningCircle.module.css b/src/modules/Dashboard/modules/LearningCircle/pages/LearningCircle.module.css index 8d1abd845..8ae409cd5 100644 --- a/src/modules/Dashboard/modules/LearningCircle/pages/LearningCircle.module.css +++ b/src/modules/Dashboard/modules/LearningCircle/pages/LearningCircle.module.css @@ -29,6 +29,7 @@ } .learningCircleLandingPageMiddle { + width: 100%; display: flex; flex-direction: column; justify-content: center; @@ -1264,3 +1265,69 @@ transform: scaleX(-1); } } +.SwitchNav { + display: flex; + gap: 5px; + align-items: center; + .items { + padding: 8px 20px; + background-color: #f3f3f4; + color: black; + font-weight: 600; + border-radius: 15px; + &.active { + background-color: white; + border-radius: 15px 15px 0px 0px; + } + } + .plusItem { + border-left: 2px solid #8b8e92; + color: black; + font-size: 25px; + padding: 0px; + height: fit-content; + padding-left: 10px; + line-height: 1; + } +} + +.ContentWrapper { + width: 100%; + padding: 30px; + background-color: white; + display: flex; + flex-direction: column; + gap: 15px; + align-items: start; +} +.inputBox { + background: #fff; + margin: 0px 10px; + input { + width: 100%; + background-color: rgba(238, 242, 255, 1); + border: none; + border-radius: 10px; + padding: 10px; + } +} +.modalinfo { + margin: 10px; + color: #22222290; + font-size: 15px; +} +.meetupGrid { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 20px; + .meetupCard { + background: #fdfdfd; + color: #222; + padding: 20px; + box-shadow: 0px 0px 5px 1px rgba(0, 0, 0, 0.05); + border-radius: 10px; + } + @media screen and (max-width: 768px) { + grid-template-columns: 1fr; + } +} diff --git a/src/modules/Dashboard/modules/LearningCircle/pages/LearningCircleLandingPage.tsx b/src/modules/Dashboard/modules/LearningCircle/pages/LearningCircleLandingPage.tsx index 59fd3de51..849402ff9 100644 --- a/src/modules/Dashboard/modules/LearningCircle/pages/LearningCircleLandingPage.tsx +++ b/src/modules/Dashboard/modules/LearningCircle/pages/LearningCircleLandingPage.tsx @@ -1,24 +1,30 @@ import styles from "./LearningCircle.module.css"; import imageTop from "../assets/images/LC2.webp"; -import imageBottom from "../assets/images/LC3.webp"; import { PowerfulButton } from "@/MuLearnComponents/MuButtons/MuButton"; import { useNavigate } from "react-router-dom"; import { useEffect, useState } from "react"; -import { BsChevronRight } from "react-icons/bs"; -import { getUserLearningCircles } from "../services/LearningCircleAPIs"; +import { + getUserLearningCircles, + joinMeetup +} from "../services/LearningCircleAPIs"; import MuLoader from "@/MuLearnComponents/MuLoader/MuLoader"; +import YourLc from "./LcDashboard/components/YourLc"; +import LcMeetups from "./LcDashboard/components/LcMeetups"; +import MuModal from "@/MuLearnComponents/MuModal/MuModal"; +import toast from "react-hot-toast"; const LearningCircleLandingPage = () => { const navigate = useNavigate(); const [userCircleList, setUserCircleList] = useState(); const [isLoading, setIsLoading] = useState(true); - + const [curpage, setCurPage] = useState(0); + const [meetingCodeModalOpen, setMeetingCodeModalOpen] = useState(false); useEffect(() => { getUserLearningCircles(setUserCircleList).then(() => { setIsLoading(false); }); }, []); - + const [meetupCode, setMeetupCode] = useState(""); const handleJoin = () => { navigate("/dashboard/learning-circle/find-circle"); }; @@ -27,8 +33,46 @@ const LearningCircleLandingPage = () => { navigate("/dashboard/learning-circle/create-circle"); }; + const joinMeet = () => { + if (meetupCode.length !== 6) { + toast.error("Invalid meetup code"); + return; + } + joinMeetup(meetupCode); + setMeetingCodeModalOpen(false); + }; + + const handleJoinMeetup = () => { + setMeetingCodeModalOpen(true); + }; return ( <> + { + setMeetingCodeModalOpen(false); + }} + title={"Enter Meeting Code"} + type={"success"} + onDone={joinMeet} + > +
+ { + setMeetupCode(e.target.value.toUpperCase()); + }} + /> +
+

+ Enter the 6 digit code provided by the meetup organizer to + join the meetup and earn karma points. +

+
{isLoading ? (
@@ -49,6 +93,11 @@ const LearningCircleLandingPage = () => { styles.learningCircleLandingPageButton } > + { onClick={handleJoin} />
- -
-
    - {userCircleList && userCircleList.length > 0 ? ( - <> - Your learning circles - {userCircleList?.map((circle, pos) => ( -
    -
  • { - navigate( - `/dashboard/learning-circle/dashboard/${circle.id}` - ); - }} - > - - -
  • -
    - ))} - - ) : ( -
    - You haven't joined any circles yet - Nothing yet! -

    - You haven't joined any learning circles - yet. -

    -
    - )} -
+
+
+ + +
+ {curpage === 0 ? ( + + ) : ( + + )}
)} diff --git a/src/modules/Dashboard/modules/LearningCircle/pages/Meetup/LcMeetup.module.css b/src/modules/Dashboard/modules/LearningCircle/pages/Meetup/LcMeetup.module.css new file mode 100644 index 000000000..e69de29bb diff --git a/src/modules/Dashboard/modules/LearningCircle/pages/Meetup/LcMeetup.tsx b/src/modules/Dashboard/modules/LearningCircle/pages/Meetup/LcMeetup.tsx new file mode 100644 index 000000000..9fccd4a27 --- /dev/null +++ b/src/modules/Dashboard/modules/LearningCircle/pages/Meetup/LcMeetup.tsx @@ -0,0 +1,20 @@ +import { useParams } from "react-router-dom"; +import LcHistory from "../LcDashboard/components/LcHistory"; +import { useEffect, useState } from "react"; +import { getMeetupInfo } from "../../services/LearningCircleAPIs"; +import toast from "react-hot-toast"; + +export default function LcMeetupIfo() { + const params = useParams(); + const [data, setData] = useState(); + useEffect(() => { + getMeetupInfo(setData, params.id ?? "") + .then(res => { + console.log(res); + }) + .catch(() => { + toast.error("Failed to fetch data"); + }); + }, []); + return data ? : <>Loading; +} diff --git a/src/modules/Dashboard/modules/LearningCircle/services/LearningCircleAPIs.ts b/src/modules/Dashboard/modules/LearningCircle/services/LearningCircleAPIs.ts index c90d7b54d..4292b2925 100644 --- a/src/modules/Dashboard/modules/LearningCircle/services/LearningCircleAPIs.ts +++ b/src/modules/Dashboard/modules/LearningCircle/services/LearningCircleAPIs.ts @@ -24,6 +24,109 @@ export const getUserLearningCircles = async ( } }; +export const joinMeetup = async (meetId: string) => { + try { + const response = await privateGateway.post( + dynamicRoute(dashboardRoutes.joinMeetup, meetId) + ); + const message: any = response?.data; + toast.success(message.message?.general[0] ?? "Failed to join meetup"); + } catch (err: unknown) { + const error = err as AxiosError; + toast.error( + ((error?.response?.data as any).message?.general ?? [ + "Failed to join meetup" + ])[0] + ); + if (error?.response) { + throw error; + } + toast.error("Failed to join meetup"); + } +}; + +export const interestedMeetup = async ( + meetId: string, + undo: boolean = false +) => { + try { + if (undo) { + const response = await privateGateway.delete( + dynamicRoute(dashboardRoutes.interestedMeetup, meetId) + ); + const message: any = response?.data; + toast.success( + message.message?.general[0] ?? "Failed to undo interest" + ); + return; + } + const response = await privateGateway.post( + dynamicRoute(dashboardRoutes.interestedMeetup, meetId) + ); + const message: any = response?.data; + toast.success(message.message?.general[0] ?? "Failed to show interest"); + } catch (err: unknown) { + console.log(err); + const error = err as AxiosError; + toast.error( + ((error?.response?.data as any).message?.general ?? [ + "Failed to show interest" + ])[0] + ); + if (error?.response) { + throw error; + } + toast.error("Failed to show interest"); + } +}; + +export const getMeetupInfo = async ( + setMeetup: + | UseStateFunc + | UseStateFunc, + meetId: string +) => { + try { + console.log(meetId); + const response = await privateGateway.get( + dynamicRoute(dashboardRoutes.getMeetupInfo, meetId) + ); + console.log(response); + const message: any = response?.data; + setMeetup(message.response); + } catch (err: unknown) { + const error = err as AxiosError; + if (error?.response) { + throw error; + } + } +}; +export const getMeetups = async ( + setMeetup: + | UseStateFunc + | UseStateFunc, + meetId: string | undefined = undefined +) => { + try { + console.log(meetId); + const response = await privateGateway.get(dashboardRoutes.getMeetups, { + params: meetId + ? { + meet_id: meetId + } + : {} + }); + console.log(response); + const message: any = response?.data; + setMeetup(message.response); + } catch (err: unknown) { + const error = err as AxiosError; + if (error?.response) { + throw error; + } + } +}; + export const getUserOrg = (setOrg: { (value: SetStateAction): void; (arg0: any): void; @@ -235,6 +338,36 @@ export const updateLcNote = async (data: LcNote) => { } }; +export const getLcMeetups = async (id: string | undefined) => { + try { + const response = await privateGateway.get( + dynamicRoute(lcRoutes.getLcMeetups, id as string) + ); + const message: any = response?.data; + return message.response; + } catch (err) { + const error = err as AxiosError; + if (error?.response) { + throw error; + } + } +}; + +export const createMeetup = async (data: LcMeetup, id: string) => { + try { + const response = await privateGateway.post( + dynamicRoute(lcRoutes.createMeet, id as string), + data + ); + const message: any = response?.data; + return message; + } catch (err) { + const error = err as AxiosError; + if (error?.response) { + throw error; + } + } +}; export const setLCMeetTime = async ( data: LcMeetSchedule, id: string | undefined diff --git a/src/modules/Dashboard/modules/LearningCircle/services/LearningCircleInterface.d.ts b/src/modules/Dashboard/modules/LearningCircle/services/LearningCircleInterface.d.ts index ae9f183f7..8962d6ff9 100644 --- a/src/modules/Dashboard/modules/LearningCircle/services/LearningCircleInterface.d.ts +++ b/src/modules/Dashboard/modules/LearningCircle/services/LearningCircleInterface.d.ts @@ -45,6 +45,7 @@ interface LcDashboardTempData { isTeam: boolean; isSchedule: boolean; reRender: boolean; + isCreateMeeting: boolean; } interface LcMeetSchedule { @@ -53,6 +54,35 @@ interface LcMeetSchedule { day: string; } +interface LcMeetup { + title: string; + location: string; + meet_time: string; + meet_place: string; + agenda: string; + need_pre_requirements: boolean; + pre_requirements: string | null; + is_public: boolean; + limit_attendees: boolean; + max_attendees: number; +} + +type LcMeetupInfo = LcMeetup & { + id: string; + is_started: boolean; + is_report_submitted: boolean; + meet_code: string | null; + image: string | null; +}; + +type LcMeetupDetailInfo = LcMeetupInfo & { + is_interested: boolean; + joined_at: string | null; + total_interested: number; + total_joined: number; + lc_members: number; + is_lc_member: boolean; +}; interface LcNote { note: string; id: string | undefined; @@ -64,13 +94,6 @@ interface ChecklistItem { isChecked: boolean; } -interface LcReport { - agenda: string; - attendees: string[]; - day: string; - meet_time: string; -} - interface LcPastReports { id: string; meet_time: string; diff --git a/src/services/endpoints.ts b/src/services/endpoints.ts index 5b6f557f7..9dcc901ef 100644 --- a/src/services/endpoints.ts +++ b/src/services/endpoints.ts @@ -1,3 +1,5 @@ +import { createMeetup } from "src/modules/Dashboard/modules/LearningCircle/services/LearningCircleAPIs"; + export const dynamicRoute = (route: string, ...args: string[]) => { let replacedRoute = route; args.forEach(arg => { @@ -9,12 +11,14 @@ export const dynamicRoute = (route: string, ...args: string[]) => { }; export const lcRoutes = { - createReport: "/api/v1/dashboard/lc/${LcID}/report/create/", + createReport: "/api/v1/dashboard/lc//meets/report/${meetId}/", getReport: "/api/v1/dashboard/lc/${LcID}/report/${ReportID}/show/", transferLead: "/api/v1/dashboard/lc/${LcID}/lead-transfer/${MemberID}/", approveRejectRemoveUser: "/api/v1/dashboard/lc/${LcID}/user-accept-reject/${MemberID}/", scheduleMeet: "/api/v1/dashboard/lc/${LcID}/schedule-meet/", + createMeet: "/api/v1/dashboard/lc/${LcID}/meet/create/", + getLcMeetups: "/api/v1/dashboard/lc/${LcID}/meet/list/", getDetailsUpdateNote: "/api/v1/dashboard/lc/${LcID}/details/" }; diff --git a/src/services/urls.ts b/src/services/urls.ts index c7d6d4baf..2ef8e3021 100644 --- a/src/services/urls.ts +++ b/src/services/urls.ts @@ -1,3 +1,5 @@ +import { joinMeetup } from "src/modules/Dashboard/modules/LearningCircle/services/LearningCircleAPIs"; + export const onboardingRoutes = { countryList: "/api/v1/register/country/list/", stateList: "/api/v1/register/state/list/", @@ -126,6 +128,10 @@ export const dashboardRoutes = { lc: "/api/v1/dashboard/lc/", searchLearningCircleWithCircleCode: "/api/v1/dashboard/lc/list-all/", getCampusLearningCircles: "/api/v1/dashboard/lc/", + getMeetups: "/api/v1/dashboard/lc/meets/list/", + getMeetupInfo: "/api/v1/dashboard/lc/meets/info/${meetId}/", + joinMeetup: "/api/v1/dashboard/lc/meets/join/${meetId}/", + interestedMeetup: "/api/v1/dashboard/lc/meets/interested/${meetId}/", getLearningCirclesLead: "/api/v1/dashboard/lc/lead/", createLearningCircle: "/api/v1/dashboard/lc/create/", listLearningCircle: "/api/v1/dashboard/lc/list-all/", From 186e329cfe04cd80f001af96fc84298c27741629 Mon Sep 17 00:00:00 2001 From: ansan johny Date: Sun, 13 Oct 2024 12:34:28 +0530 Subject: [PATCH 21/31] fix:content and removed settings --- .../pages/Onboarding/UserInterest/UserInterest.tsx | 13 +++++++------ src/modules/Dashboard/components/SideNavBarBody.tsx | 2 +- .../modules/InterestGroup/InterestGroupForm.tsx | 8 ++++---- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/src/modules/Common/Authentication/pages/Onboarding/UserInterest/UserInterest.tsx b/src/modules/Common/Authentication/pages/Onboarding/UserInterest/UserInterest.tsx index 68b821748..1858ece18 100644 --- a/src/modules/Common/Authentication/pages/Onboarding/UserInterest/UserInterest.tsx +++ b/src/modules/Common/Authentication/pages/Onboarding/UserInterest/UserInterest.tsx @@ -23,18 +23,19 @@ const CheckMark = () => ( ); const INITIAL_INTERESTS = [ - { title: "Software", value: "software", img: software, checked: false }, - { title: "Maker", value: "maker", img: maker, checked: false }, - { title: "Management", value: "management", img: management, checked: false }, + { title: "Coder", value: "coder", img: software, checked: false }, + { title: "Hardware", value: "hardware", img: maker, checked: false }, + { title: "Manager", value: "manager", img: management, checked: false }, { title: "Creative", value: "creative", img: creative, checked: false }, { title: "Others", value: "others", img: others, checked: false } ]; const INITIAL_ENDGOALS = [ { title: "Job", value: "job", checked: false }, - { title: "Higher Education", value: "higher_education", checked: false }, + { title: "Research & Development", value: "r&d", checked: false }, { title: "Entrepreneurship", value: "entrepreneurship", checked: false }, { title: "Gig Works", value: "gig_work", checked: false }, + { title: "Higher Education", value: "higher_education", checked: false }, { title: "Others", value: "others", checked: false } ]; @@ -201,9 +202,9 @@ export default function UserInterest() {
mulearn -

{stepTwo ? "What describes you the most!" : "Your dynamic area of interest!"}

+

{stepTwo ? "What do you expect by MuLearning " : "What describes you the most!"}

- {stepTwo ? "Choose one or goals you expect from µLearn." : "Please select your interested area"} + {stepTwo ? "Pick your goal." : "Please select your interested area"}

{stepTwo ? renderItems(endgoals, false) : renderItems(interests, true)} diff --git a/src/modules/Dashboard/components/SideNavBarBody.tsx b/src/modules/Dashboard/components/SideNavBarBody.tsx index 6e2d60a43..48992a133 100644 --- a/src/modules/Dashboard/components/SideNavBarBody.tsx +++ b/src/modules/Dashboard/components/SideNavBarBody.tsx @@ -191,7 +191,7 @@ const SideNavBarBody = ({ } - onClick={() => navigate("/dashboard/settings")} + onClick={() => navigate("/dashboard/settings/account")} style={{ color: "#9297AA", backgroundColor: "#fff" diff --git a/src/modules/Dashboard/modules/InterestGroup/InterestGroupForm.tsx b/src/modules/Dashboard/modules/InterestGroup/InterestGroupForm.tsx index 9a43ef6fd..196aac755 100644 --- a/src/modules/Dashboard/modules/InterestGroup/InterestGroupForm.tsx +++ b/src/modules/Dashboard/modules/InterestGroup/InterestGroupForm.tsx @@ -16,11 +16,11 @@ const IntrestGroupForm = forwardRef( category: "others" }); const interestGroup = [ - { label: "Software", value: "software" }, - { label: "Maker", value: "maker" }, + { label: "Coder", value: "coder" }, + { label: "Hardware", value: "hardware" }, { - label: "Management", - value: "management" + label: "Manager", + value: "manager" }, { label: "Creative", value: "creative" }, { label: "Others", value: "others" } From 3b2b39bd067e17527b62af46499d7d2e96d27f36 Mon Sep 17 00:00:00 2001 From: Aswanth Vc Date: Sun, 13 Oct 2024 13:23:15 +0530 Subject: [PATCH 22/31] feat: LC design fix and college selection page on onboarding --- src/App.tsx | 4 + .../CollegePage/CollegePage.module.css | 18 + .../Onboarding/CollegePage/CollegePage.tsx | 406 +++++++++--------- .../Onboarding/UserInterest/UserInterest.tsx | 274 ++++++++---- .../Authentication/services/onboardingApis.ts | 29 ++ .../pages/LcDashboard/LcDashboard.module.css | 33 +- .../LcDashboard/components/LcHistory.tsx | 50 ++- .../pages/LcDashboard/components/LcHome.tsx | 107 ++--- .../pages/LearningCircle.module.css | 3 + 9 files changed, 562 insertions(+), 362 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index 6a3bf7332..8b9c6c752 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -310,6 +310,10 @@ function App() { path: "/register/interests", element: }, + { + path: "/register/organization", + element: + }, { path: "/signin", element: diff --git a/src/modules/Common/Authentication/pages/Onboarding/CollegePage/CollegePage.module.css b/src/modules/Common/Authentication/pages/Onboarding/CollegePage/CollegePage.module.css index 2f16e3978..6f649a823 100644 --- a/src/modules/Common/Authentication/pages/Onboarding/CollegePage/CollegePage.module.css +++ b/src/modules/Common/Authentication/pages/Onboarding/CollegePage/CollegePage.module.css @@ -8,6 +8,22 @@ } .wrapper form { width: 20rem; + /* background: rgba(238, 242, 255, 1); + border-radius: 10px; + padding: 20px; */ +} +.input_field { + display: flex; + justify-content: space-between; + align-items: center; + padding: 10px; + /* background: #eaeaea; */ + background: #dddddd30; + font-size: 14px; + border-radius: 10px; + margin-top: 20px; + color: rgb(86, 86, 255); + font-weight: 600; } .inputBox { width: 100%; @@ -32,6 +48,8 @@ display: flex; justify-content: center; align-items: center; + margin-top: 20px; + gap: 10px; } .submit button { width: 100%; diff --git a/src/modules/Common/Authentication/pages/Onboarding/CollegePage/CollegePage.tsx b/src/modules/Common/Authentication/pages/Onboarding/CollegePage/CollegePage.tsx index 328a67c12..b92c8bf5f 100644 --- a/src/modules/Common/Authentication/pages/Onboarding/CollegePage/CollegePage.tsx +++ b/src/modules/Common/Authentication/pages/Onboarding/CollegePage/CollegePage.tsx @@ -6,28 +6,30 @@ import { FormikTextInputWithoutLabel as SimpleInput } from "@/MuLearnComponents/ import { useEffect, useState } from "react"; import { getColleges, - getDepartments, - getRoles, - submitUserData + getCompanies, + getDepartments } from "../../../services/newOnboardingApis"; import ReactSelect from "react-select"; import { useLocation, useNavigate } from "react-router-dom"; +import OnboardingTemplate from "../../../components/OnboardingTeamplate/OnboardingTemplate"; +import OnboardingHeader from "../../../components/OnboardingHeader/OnboardingHeader"; +import { Switch } from "@chakra-ui/react"; +import { selectOrganization } from "../../../services/onboardingApis"; const inputObject = { - college: "College Name", + organization: "Organization", department: "Department", graduationYear: "Graduation Year" }; const scheme = z.object({ - college: z + organization: z .string() - .required(`${inputObject.college} is Required`) - .min(3, `${inputObject.college} must be at least 3 characters`) - .max(100, `${inputObject.college} must be at most 100 characters`), + .required(`${inputObject.organization} is Required`) + .min(3, `${inputObject.organization} must be at least 3 characters`) + .max(100, `${inputObject.organization} must be at most 100 characters`), department: z .string() - .required(`${inputObject.department} is Required`) .min(2, `${inputObject.department} must be at least 2 characters`) .max(100, `${inputObject.department} must be at most 100 characters`), graduationYear: z @@ -44,11 +46,7 @@ const scheme = z.object({ }) }); -export default function CollegePage({ - selectedRole -}: { - selectedRole: string; -}) { +export default function CollegePage() { const navigate = useNavigate(); const location = useLocation(); @@ -57,9 +55,9 @@ export default function CollegePage({ const [isloading, setIsLoading] = useState(true); const [colleges, setColleges] = useState([{ id: "", title: "" }]); const [departments, setDepartments] = useState([{ id: "", title: "" }]); - const [roles, setRoles] = useState([{ id: "", title: "" }]); - - const [selectedCollege, setSelectedCollege] = useState({ + const [isCollege, setIsCollege] = useState(true); + const [companies, setCompanies] = useState([{ id: "", title: "" }]); + const [selectedOrganization, setSelectedOrganization] = useState({ id: "", title: "" }); @@ -68,11 +66,6 @@ export default function CollegePage({ title: "" }); - const getRoleTitle = (id: string) => { - const slice = roles.filter(val => val.id === id); - if (slice[0]) return slice[0].title; - }; - const CustomFilter = ( { label, value }: { label: string; value: string }, string: string @@ -83,194 +76,211 @@ export default function CollegePage({ }; useEffect(() => { - if (userData === undefined || userData === null) { - navigate("/register", { replace: true }); - } else { - getColleges({ - setIsLoading: setIsLoading, - setColleges: setColleges - }); - getDepartments({ - setIsLoading: setIsLoading, - setDepartments: setDepartments - }); - getRoles().then((res: any) => { - setRoles(res); - setIsLoading(false); - }); - } + getColleges({ + setIsLoading: setIsLoading, + setColleges: setColleges + }); + getDepartments({ + setIsLoading: setIsLoading, + setDepartments: setDepartments + }); + getCompanies({ + setIsLoading: setIsLoading, + setCompanies: setCompanies + }); }, []); - - // useEffect(() => { - // setSelectedRole( - // roles.find((role: any) => role.id === userData.role)?.title || "" - // ); - // }, [userData, roles]); const onSubmit = async (values: any) => { - const newUserData: any = { - user: { - full_name: userData.user.full_name, - // mobile: userData.user.mobile, - email: userData.user.email, - password: userData.user.password, - district: userData.district - }, - organization: { - ...(values.department !== "Others" && { - department: values.department - }), - year_of_graduation: values.graduationYear, - organizations: [ - ...(values.college !== "Others" ? [values.college] : []), - ...userData.communities - ], - verified: true - } - }; - - if (selectedRole) newUserData.user["role"] = selectedRole; - - if (userData.referral) - newUserData["referral"] = { muid: userData.referral.muid }; - - if (userData.param) { - newUserData["integration"] = userData.integration; - } - - if (userData.role === "Enabler") - delete newUserData.organization.year_of_graduation; - - if (userData.gender) { - newUserData.user["gender"] = userData.gender; - } - - if (userData.dob) { - newUserData.user["dob"] = userData.dob; - } - console.log(newUserData); - - submitUserData({ + selectOrganization({ setIsLoading: setIsLoading, - userData: newUserData, + userData: { + organization: values.organization, + department: values.department, + graduation_year: + values.graduationYear == null || values.graduationYear != "" + ? values.graduationYear + : null + }, navigate: navigate }); }; // console.log(userData); return ( - [key, ""]) - )} - validationSchema={scheme} - onSubmit={(value, action) => onSubmit(value)} - > - {formik => ( -
-
-
-
- Please enter your college details -
-
- ({ - value: college.id, - label: college.title - })) - ] as any - } - name="college" - placeholder="College" - value={selectedCollege.title} - filterOption={CustomFilter} - isDisabled={isloading} - onChange={(e: any) => { - setSelectedCollege(e); - formik.setFieldValue( - "college", - e.value - ); - inputObject.college = e.value; - }} - /> -
- {formik.touched.college && - formik.errors.college && ( - - {formik.errors.college} - - )} -
- ({ - value: department.id, - label: department.title - })) - ] as any - } - name="department" - placeholder="Department" - value={selectedDepartment.title} - isDisabled={isloading} - filterOption={CustomFilter} - onChange={(e: any) => { - setSelectedDepartment(e); - formik.setFieldValue( - "department", - e.value - ); - inputObject.department = e.value; - }} - /> -
- {formik.touched.department && - formik.errors.department && ( - - {formik.errors.department} - - )} - {getRoleTitle(selectedRole) === "Student" && ( + + + [key, ""]) + )} + validationSchema={scheme} + onSubmit={(value, action) => onSubmit(value)} + > + {formik => ( +
+
+ +
+ Please enter your organization details +
+
+ Not a college ?{" "} + { + setIsCollege(!isCollege); + }} + /> +
- ({ + value: college.id, + label: college.title + })) + : companies.map( + company => ({ + value: company.id, + label: company.title + }) + )) + ] as any + } + name="organization" + placeholder={ + isCollege + ? "College" + : "Organization" + } + value={selectedOrganization.title} + filterOption={CustomFilter} + isDisabled={isloading} + onChange={(e: any) => { + setSelectedOrganization(e); + formik.setFieldValue( + "organization", + e.value + ); + inputObject.organization = e.value; + }} /> - {formik.touched.graduationYear && - formik.errors.graduationYear && ( - - {formik.errors.graduationYear} - - )}
- )} + {formik.touched.college && + formik.errors.college && ( + + {formik.errors.college} + + )} + {isCollege ? ( + <> +
+ ({ + value: department.id, + label: department.title + }) + ) + ] as any + } + name="department" + className={styles.inputBox} + placeholder="Department" + value={selectedDepartment.title} + isDisabled={isloading} + filterOption={CustomFilter} + onChange={(e: any) => { + setSelectedDepartment(e); + formik.setFieldValue( + "department", + e.value + ); + inputObject.department = + e.value; + }} + /> +
+ {formik.touched.department && + formik.errors.department && ( + + {formik.errors.department} + + )} +
+ + {formik.touched.graduationYear && + formik.errors + .graduationYear && ( + + { + formik.errors + .graduationYear + } + + )} +
+ + ) : ( + <> + )} -
- - {isloading ? "Please wait..." : "Submit"} - -
- +
+ { + e.preventDefault(); + navigate( + "/dashboard/connect-discord" + ); + }} + > + Skip + + + {isloading + ? "Please wait..." + : "Submit"} + +
+ +
-
- )} - + )} + + ); } diff --git a/src/modules/Common/Authentication/pages/Onboarding/UserInterest/UserInterest.tsx b/src/modules/Common/Authentication/pages/Onboarding/UserInterest/UserInterest.tsx index 68b821748..a464ca17f 100644 --- a/src/modules/Common/Authentication/pages/Onboarding/UserInterest/UserInterest.tsx +++ b/src/modules/Common/Authentication/pages/Onboarding/UserInterest/UserInterest.tsx @@ -17,15 +17,28 @@ import software from "/src/modules/Common/Authentication/assets/interests/softwa import others from "/src/modules/Common/Authentication/assets/interests/others.svg"; const CheckMark = () => ( - - + + ); const INITIAL_INTERESTS = [ { title: "Software", value: "software", img: software, checked: false }, { title: "Maker", value: "maker", img: maker, checked: false }, - { title: "Management", value: "management", img: management, checked: false }, + { + title: "Management", + value: "management", + img: management, + checked: false + }, { title: "Creative", value: "creative", img: creative, checked: false }, { title: "Others", value: "others", img: others, checked: false } ]; @@ -60,17 +73,25 @@ export default function UserInterest() { useEffect(() => { const fetchInterestGroups = async () => { try { - const res = await publicGateway.get(onboardingRoutes.interestGroups); - const data: InterestGroup[] = res.data?.response?.interestGroup ?? []; - - const interestGroupsData = interests.reduce((acc, interest) => ({ - ...acc, - [interest.value]: data.filter(group => group.category === interest.value) - }), {}); - + const res = await publicGateway.get( + onboardingRoutes.interestGroups + ); + const data: InterestGroup[] = + res.data?.response?.interestGroup ?? []; + + const interestGroupsData = interests.reduce( + (acc, interest) => ({ + ...acc, + [interest.value]: data.filter( + group => group.category === interest.value + ) + }), + {} + ); + setInterestGroups(interestGroupsData); } catch (err) { - console.error('Failed to fetch interest groups:', err); + console.error("Failed to fetch interest groups:", err); } }; @@ -80,24 +101,34 @@ export default function UserInterest() { const handleChange = useCallback((value: string, isInterest: boolean) => { const setter = isInterest ? setInterests : setEndgoals; const otherSetter = isInterest ? setOtherInterest : setOtherEndgoal; - - - setter((prev:any) => { - const newItems = prev.map((item:any) => - item.value === value ? { ...item, checked: !item.checked } : item + + setter((prev: any) => { + const newItems = prev.map((item: any) => + item.value === value + ? { ...item, checked: !item.checked } + : item ); - - if (value === "others" && newItems.find((item:any) => item.value === "others")?.checked === false) { + + if ( + value === "others" && + newItems.find((item: any) => item.value === "others") + ?.checked === false + ) { otherSetter([]); } - + return newItems; }); }, []); const handleContinue = useCallback(() => { - const selectedInterests = interests.filter(interest => interest.checked); - if (selectedInterests.some(i => i.value === "others") && otherInterest.length === 0) { + const selectedInterests = interests.filter( + interest => interest.checked + ); + if ( + selectedInterests.some(i => i.value === "others") && + otherInterest.length === 0 + ) { return; } if (selectedInterests.length > 0 || otherInterest.length > 0) { @@ -106,9 +137,13 @@ export default function UserInterest() { }, [interests, otherInterest]); const handleSubmit = useCallback(async () => { - const selectedInterests = interests.filter(i => i.checked).map(i => i.value); - const selectedEndgoals = endgoals.filter(e => e.checked).map(e => e.value); - + const selectedInterests = interests + .filter(i => i.checked) + .map(i => i.value); + const selectedEndgoals = endgoals + .filter(e => e.checked) + .map(e => e.value); + const data = { choosen_interests: selectedInterests, choosen_endgoals: selectedEndgoals, @@ -117,80 +152,123 @@ export default function UserInterest() { }; try { - const res = await privateGateway.post(onboardingRoutes.interests, data); + const res = await privateGateway.post( + onboardingRoutes.interests, + data + ); toast.success(res.data?.message.general[0]); - navigate("/dashboard/connect-discord"); + navigate("/register/organization"); } catch (err: any) { - toast.error(err.response?.data.message.general[0] || "Unexpected Error occurred"); + toast.error( + err.response?.data.message.general[0] || + "Unexpected Error occurred" + ); } }, [interests, endgoals, otherInterest, otherEndgoal, navigate]); const isInterestSelected = interests.some(interest => interest.checked); const isEndgoalSelected = endgoals.some(endgoal => endgoal.checked); - const renderItems = useCallback((items: typeof interests | typeof endgoals, isInterest: boolean) => ( -
- {items.map(item => { - const isOthers = item.value === "others"; - const isChecked = item.checked; - const otherItems = isInterest ? otherInterest : otherEndgoal; - const setOtherItems = isInterest ? setOtherInterest : setOtherEndgoal; - - return ( -
handleChange(item.value, isInterest)} - > - {isChecked && } - {isInterest ? ( -
- -

{item.title}

-
- ) : ( -

{item.title}

- )} - {isInterest && ( - <> -
e.stopPropagation()}> - - - - -
-
-

This category includes:

-
    - {interestGroups[item.value]?.map((group: InterestGroup) => ( -
  • {group.name}
  • - ))} -
+ const renderItems = useCallback( + (items: typeof interests | typeof endgoals, isInterest: boolean) => ( +
+ {items.map(item => { + const isOthers = item.value === "others"; + const isChecked = item.checked; + const otherItems = isInterest + ? otherInterest + : otherEndgoal; + const setOtherItems = isInterest + ? setOtherInterest + : setOtherEndgoal; + + return ( +
handleChange(item.value, isInterest)} + > + {isChecked && } + {isInterest ? ( +
+ +

{item.title}

- - )} - {isOthers && isChecked && ( -
e.stopPropagation()}> - { - if (e.target.value.length > 0) { - setOtherItems([...otherItems, e.target.value]); - e.target.value = ""; + ) : ( +

{item.title}

+ )} + {isInterest && ( + <> +
e.stopPropagation()} + > + + + + +
+
+

This category includes:

+
    + {interestGroups[item.value]?.map( + (group: InterestGroup) => ( +
  • + {group.name} +
  • + ) + )} +
+
+ + )} + {isOthers && isChecked && ( +
e.stopPropagation()}> + { + if (e.target.value.length > 0) { + setOtherItems([ + ...otherItems, + e.target.value + ]); + e.target.value = ""; + } + }} + onChange={setOtherItems} + name={`other_${ + isInterest + ? "interests" + : "endgoals" + }`} + placeHolder={`Specify your ${ + isInterest ? "interest" : "endgoal" + }`} + separators={ + isInterest ? [","] : undefined } - }} - onChange={setOtherItems} - name={`other_${isInterest ? 'interests' : 'endgoals'}`} - placeHolder={`Specify your ${isInterest ? 'interest' : 'endgoal'}`} - separators={isInterest ? [","] : undefined} - /> -
- )} -
- ); - })} -
- ), [handleChange, interestGroups, otherInterest, otherEndgoal]); + /> +
+ )} +
+ ); + })} +
+ ), + [handleChange, interestGroups, otherInterest, otherEndgoal] + ); return ( <> @@ -201,12 +279,20 @@ export default function UserInterest() {
mulearn -

{stepTwo ? "What describes you the most!" : "Your dynamic area of interest!"}

+

+ {stepTwo + ? "What describes you the most!" + : "Your dynamic area of interest!"} +

- {stepTwo ? "Choose one or goals you expect from µLearn." : "Please select your interested area"} + {stepTwo + ? "Choose one or goals you expect from µLearn." + : "Please select your interested area"}

- - {stepTwo ? renderItems(endgoals, false) : renderItems(interests, true)} + + {stepTwo + ? renderItems(endgoals, false) + : renderItems(interests, true)} {(stepTwo ? isEndgoalSelected : isInterestSelected) && ( ); -} \ No newline at end of file +} diff --git a/src/modules/Common/Authentication/services/onboardingApis.ts b/src/modules/Common/Authentication/services/onboardingApis.ts index 9c6905945..874bd892a 100644 --- a/src/modules/Common/Authentication/services/onboardingApis.ts +++ b/src/modules/Common/Authentication/services/onboardingApis.ts @@ -4,6 +4,8 @@ import { NavigateFunction } from "react-router-dom"; import { useFormik } from "formik"; import { getInfo } from "../../../Dashboard/modules/ConnectDiscord/services/apis"; import { Dispatch, SetStateAction } from "react"; +import { privateGateway } from "@/MuLearnServices/apiGateways"; +import toast from "react-hot-toast"; // Define the type of MyValues type NN = { name: string; id: string }; @@ -234,6 +236,33 @@ export const getCommunities = ({ setIsLoading && setIsLoading(false); }; +export const selectOrganization = async ({ + setIsLoading, + userData, + navigate +}: { + setIsLoading: Dispatch>; + userData: Object; + navigate: NavigateFunction; +}) => { + try { + setIsLoading(true); + const res = await privateGateway.post( + "/api/v1/dashboard/user/organization/", + userData + ); + if (res.status == 200 && !res.data.hasError) { + toast.success(res.data.message.general[0]); + navigate("/dashboard/connect-discord"); + } else { + toast.error("Organization selection failed."); + } + setIsLoading(false); + } catch (err: any) { + toast.error("Unable to select organization."); + } +}; + // POST request for registration export const registerUser = ( setFormSuccess: FormSuccess, diff --git a/src/modules/Dashboard/modules/LearningCircle/pages/LcDashboard/LcDashboard.module.css b/src/modules/Dashboard/modules/LearningCircle/pages/LcDashboard/LcDashboard.module.css index 07384052b..4bc69c08d 100644 --- a/src/modules/Dashboard/modules/LearningCircle/pages/LcDashboard/LcDashboard.module.css +++ b/src/modules/Dashboard/modules/LearningCircle/pages/LcDashboard/LcDashboard.module.css @@ -161,7 +161,6 @@ width: 45%; } .ReportWrapper .DetailSection .Sectionone > div label { - color: black; font-size: 18px; font-weight: 600; } @@ -187,7 +186,6 @@ gap: 10px; } .ReportWrapper .DetailSection .SectionTwo p { - color: black; font-size: 18px; font-weight: 600; } @@ -405,17 +403,37 @@ align-items: flex-start; } .HistoryDataWrapper .Headings { - width: 38%; + width: 43%; text-align: left; } .HistoryDataWrapper .detailedSection { - width: 60%; + width: 55%; } .HistoryDataWrapper .SectionBottom .Headings > div { display: flex; flex-wrap: wrap; gap: 5px; } +.Headings .meetupTags { + display: flex; + flex-direction: row; + flex-wrap: wrap; + width: 100%; + + .meetupInfoTag { + display: flex; + gap: 10px; + align-items: center; + justify-content: start; + padding: 5px 10px; + background-color: white; + color: #456ff6; + border: 1px dashed #456ff6; + border-radius: 10px; + margin: 5px; + } +} + .HistoryDataWrapper .SectionBottom .detailedSection { display: flex !important; flex-direction: row; @@ -463,7 +481,7 @@ display: flex; width: 100%; justify-content: space-between; - gap: 2%; + gap: 20px; flex-wrap: wrap; } @@ -536,7 +554,7 @@ .ContainerWrapper .ContentWrapper .BottomContainer { display: flex; flex-direction: column; - width: 100%; + width: 68%; gap: 10px; } .ContainerWrapper .ContentWrapper .BottomContainer > div { @@ -556,6 +574,9 @@ .ContainerWrapper .ContentWrapper .TopContainer .sectionOne { width: 100%; } + .ContainerWrapper .ContentWrapper .TopContainer .BottomContainer { + width: 100%; + } .ContainerWrapper .ContentWrapper .TopContainer { gap: 15px; } diff --git a/src/modules/Dashboard/modules/LearningCircle/pages/LcDashboard/components/LcHistory.tsx b/src/modules/Dashboard/modules/LearningCircle/pages/LcDashboard/components/LcHistory.tsx index 14d27edaa..aff699a78 100644 --- a/src/modules/Dashboard/modules/LearningCircle/pages/LcDashboard/components/LcHistory.tsx +++ b/src/modules/Dashboard/modules/LearningCircle/pages/LcDashboard/components/LcHistory.tsx @@ -11,6 +11,7 @@ import { } from "../../../services/utils"; import MuLoader from "@/MuLearnComponents/MuLoader/MuLoader"; import { PowerfulButton } from "@/MuLearnComponents/MuButtons/MuButton"; +import toast from "react-hot-toast"; type Props = { id: string | undefined; @@ -37,7 +38,41 @@ const LcHistory = (props: Props) => {

{props.lc?.title}

{getDayOfWeek(props.lc?.meet_time)}

-
+
+ {props.lc.is_lc_member && ( +
+

{ + navigator.clipboard.writeText( + props.lc?.meet_code ?? + "NOTCOPIED" + ); + toast.success("Code Copied"); + }} + > + {" "} + + + + + {props.lc.meet_code} +

+

+ {props.lc.total_interested}{" "} + Interests Submitted +

+

+ {props.lc.total_joined} Joined +

+
+ )} {

Venue:{" "} @@ -55,19 +90,6 @@ const LcHistory = (props: Props) => { ) )}

- {props.lc.is_lc_member && ( - <> -

Meet Code: {props.lc.meet_code}

-

- Total interests: - {" " + props.lc.total_interested} -

-

- Total joinees: - {" " + props.lc.total_joined} -

- - )}
diff --git a/src/modules/Dashboard/modules/LearningCircle/pages/LcDashboard/components/LcHome.tsx b/src/modules/Dashboard/modules/LearningCircle/pages/LcDashboard/components/LcHome.tsx index 22cc8ec0f..b2af21824 100644 --- a/src/modules/Dashboard/modules/LearningCircle/pages/LcDashboard/components/LcHome.tsx +++ b/src/modules/Dashboard/modules/LearningCircle/pages/LcDashboard/components/LcHome.tsx @@ -1,6 +1,6 @@ import { Dispatch, SetStateAction, useEffect, useState } from "react"; import styles from "../LcDashboard.module.css"; -import { CalenderIcon, EditLogo, RightArrow } from "../../../assets/svg"; +import { CalenderIcon, RightArrow } from "../../../assets/svg"; import LcReport from "./LcReport"; import { convertToFormatedDate } from "../../../../../utils/common"; import LcMeetCreate from "./LcMeetCreate"; @@ -214,7 +214,8 @@ const LcHome = (props: Props) => { Kindly schedule a meeting.

- + Schedule Meet + )}
@@ -253,55 +254,61 @@ const LcHome = (props: Props) => { )}
-
- {props.lc?.previous_meetings && - props.lc?.previous_meetings.length > 0 && ( -

Your past meetings

- )} -
- {pastMeetups.map((report, index) => ( -
{ - navigate( - "/dashboard/learning-circle/meetup/" + - report.id - ); - }} - > -
-

{index + 1}.

-

- {convertToFormatedDate( - report.meet_time - )} -

-
-
-

- {convertToFormatedDate( - report.meet_time - )}{" "} - {convert24to12( - extract24hTimeFromDateTime( + {!props.temp.isSchedule && + !props.temp.isTeam && + !props.temp.isReport ? ( +

+ {props.lc?.previous_meetings && + props.lc?.previous_meetings.length > 0 && ( +

Your past meetings

+ )} +
+ {pastMeetups.map((report, index) => ( +
{ + navigate( + "/dashboard/learning-circle/meetup/" + + report.id + ); + }} + > +
+

{index + 1}.

+

+ {convertToFormatedDate( report.meet_time - ) - )} -

- + )} +

+
+
+

+ {convertToFormatedDate( + report.meet_time + )}{" "} + {convert24to12( + extract24hTimeFromDateTime( + report.meet_time + ) + )} +

+ +
-
- ))} + ))} +
-
+ ) : ( + <> + )}
{/* {props.temp.isReport ? ( diff --git a/src/modules/Dashboard/modules/LearningCircle/pages/LearningCircle.module.css b/src/modules/Dashboard/modules/LearningCircle/pages/LearningCircle.module.css index 8ae409cd5..ddc43678a 100644 --- a/src/modules/Dashboard/modules/LearningCircle/pages/LearningCircle.module.css +++ b/src/modules/Dashboard/modules/LearningCircle/pages/LearningCircle.module.css @@ -165,6 +165,9 @@ .learningCircleLandingPageLevel div { font-size: 0.8rem; } + .learningCircleLandingPage .learningCircleLandingPageButton button { + font-size: 15px; + } } @media (width<=820px) { From 77d09c1e0d98ff278adae57eeb3217ce18c14a06 Mon Sep 17 00:00:00 2001 From: Aswanth Vc Date: Sun, 13 Oct 2024 13:28:31 +0530 Subject: [PATCH 23/31] fix: removed error causing attribute --- .../Authentication/pages/Onboarding/RolePage/RolePage.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/Common/Authentication/pages/Onboarding/RolePage/RolePage.tsx b/src/modules/Common/Authentication/pages/Onboarding/RolePage/RolePage.tsx index caa300853..c98715aef 100644 --- a/src/modules/Common/Authentication/pages/Onboarding/RolePage/RolePage.tsx +++ b/src/modules/Common/Authentication/pages/Onboarding/RolePage/RolePage.tsx @@ -120,7 +120,7 @@ export default function Rolepage() {
*/} {nextPage && (nextPage === "select-college" ? ( - + ) : ( ))} From 1d760644c283ead3857a85a036f45bd4a8b97520 Mon Sep 17 00:00:00 2001 From: Aswanth Vc Date: Sun, 13 Oct 2024 18:27:30 +0530 Subject: [PATCH 24/31] feat: Onboard and lc optimization --- .../AccountCreation/AccountCreation.tsx | 300 ++---------------- .../Onboarding/CollegePage/CollegePage.tsx | 38 ++- .../pages/Onboarding/SignIn/SignIn.tsx | 8 +- .../Onboarding/UserInterest/UserInterest.tsx | 19 +- .../services/newOnboardingApis.ts | 7 +- .../Authentication/services/onboardingApis.ts | 7 +- .../LcDashboard/components/LcHistory.tsx | 17 +- .../LearningCircle/pages/Meetup/LcMeetup.tsx | 7 +- 8 files changed, 95 insertions(+), 308 deletions(-) diff --git a/src/modules/Common/Authentication/pages/Onboarding/AccountCreation/AccountCreation.tsx b/src/modules/Common/Authentication/pages/Onboarding/AccountCreation/AccountCreation.tsx index 44c4612c5..4e07133c0 100644 --- a/src/modules/Common/Authentication/pages/Onboarding/AccountCreation/AccountCreation.tsx +++ b/src/modules/Common/Authentication/pages/Onboarding/AccountCreation/AccountCreation.tsx @@ -66,29 +66,17 @@ const scheme = z.object({ export default function AccountCreation() { let { role } = useParams(); - // const [popUP, setPopUp] = useState(role ? false : true); - // const toast = useToast(); const navigate = useNavigate(); - // const [roles, setRoles] = useState([{ id: "", title: "" }]); const urlParams = new URLSearchParams(window.location.search); const param = urlParams.get("param"); const referralId = urlParams.get("referral_id"); - // const [selectedRoleId, setSelectedRoleId] = useState(""); - // const [selectedRole, setSelectedRole] = useState(""); - - //ref to community selector for resetting - temporary fix - // const community_select_ref = useRef(); const [isLoading, setIsLoading] = useState(false); const [isVisible, setVisible] = useState(false); - // const [isVisibleC, setVisibleC] = useState(false); const [dwmsData, setDWMSData] = useState(); const [isTncChecked, setTncChecked] = useState(false); - // const [communitiesList, setCommunitiesList] = useState([ - // { id: "", title: "" } - // ]); const [initialValues, setInitialValues] = useState({ email: "", fullName: "", @@ -97,6 +85,7 @@ export default function AccountCreation() { muid: "", communities: [] }); + const ruri = window.location.href.split("=")[1]; role = role === "student" || role === "mentor" || role === "enabler" @@ -131,16 +120,12 @@ export default function AccountCreation() { setIsLoading(false); }, []); - // console.log(roles.find(e => e.title.toLowerCase() === role)?.id); const onsubmit = async (values: any, actions: any) => { if (!isTncChecked) { toast.error("Please accept the terms and conditions"); return; } - - // console.log(values); - const userData: { user: { full_name: any; @@ -164,24 +149,10 @@ export default function AccountCreation() { } }; - // if (values.lastName) { - // userData.user.last_name = values.lastName; - // } - - if (values.muid) { - userData.referral = { muid: values.muid }; - } else if (referralId) { - userData.referral = { muid: referralId }; - } - if (dwmsData && dwmsData.gender) { userData.gender = dwmsData.gender; } - if (values.communities) { - userData.communities = values.communities; - } - if (param) { userData.integration = { param: param, @@ -193,24 +164,19 @@ export default function AccountCreation() { userData.dob = dwmsData.dob; } - // const isSuccess = await validate({ - // userData: userData, - // setIsSubmitting: setIsLoading - // // toast: toast // Make sure to pass the toast parameter correctly - // }); submitUserData({ setIsLoading: setIsLoading, - userData: userData, - // toast: toast, - navigate: navigate + userData: userData + }).then(res => { + if (res) { + navigate( + ruri + ? `/register/interests/?ruri=${ruri}` + : "/register/interests" + ); + } }); - // if (isSuccess && selectedRole.toLowerCase() !== "other") { - // navigate("/register/about", { state: userData }); - // } else if (isSuccess && selectedRole.toLowerCase() === "other") { - - // } }; - // console.log(selectedRole, role); return ( @@ -226,51 +192,6 @@ export default function AccountCreation() { > {formik => (
- {/* {popUP && ( -
-
- mulearn -

What describes you the most!

-

- Choose the role that best fits your - profile. -

-
- {roleOptions.map((roleOption: any) => { - let classname = `${ - styles.rolePageCard - } ${ - selectedRole === - roleOption.value && - styles.active - }`; - return ( -
{ - let rolId = roles.find( - role => - role.title === - roleOption.value - )?.id; - setSelectedRoleId( - rolId || "" - ); - setSelectedRole( - roleOption.value - ); - setPopUp(false); - }} - > - {roleOption.icon} -

{roleOption.title}

-
- ); - })} -
-
-
- )} */}
@@ -359,197 +280,8 @@ export default function AccountCreation() { )}
- {/*
- -
*/}
- {/*
- -
- -
-
*/} - {/*
-
-
- -
- - -
-
-
- -
- -
-
*/} - {/*
- - {isLoading ? "Validating..." : "Submit"} + {isLoading ? "Validating..." : "Register"}
@@ -604,7 +336,15 @@ export default function AccountCreation() {

Already have an account?{" "} - Sign In + + Sign In +

diff --git a/src/modules/Common/Authentication/pages/Onboarding/CollegePage/CollegePage.tsx b/src/modules/Common/Authentication/pages/Onboarding/CollegePage/CollegePage.tsx index b92c8bf5f..54c7e4bf1 100644 --- a/src/modules/Common/Authentication/pages/Onboarding/CollegePage/CollegePage.tsx +++ b/src/modules/Common/Authentication/pages/Onboarding/CollegePage/CollegePage.tsx @@ -48,10 +48,6 @@ const scheme = z.object({ export default function CollegePage() { const navigate = useNavigate(); - - const location = useLocation(); - let userData: any = location.state as Object; - const [isloading, setIsLoading] = useState(true); const [colleges, setColleges] = useState([{ id: "", title: "" }]); const [departments, setDepartments] = useState([{ id: "", title: "" }]); @@ -66,6 +62,8 @@ export default function CollegePage() { title: "" }); + const ruri = window.location.href.split("=")[1]; + const CustomFilter = ( { label, value }: { label: string; value: string }, string: string @@ -93,14 +91,26 @@ export default function CollegePage() { selectOrganization({ setIsLoading: setIsLoading, userData: { - organization: values.organization, - department: values.department, + organization: + values.organization == "Others" + ? null + : values.organization, + department: + values.department == "Others" ? null : values.department, graduation_year: values.graduationYear == null || values.graduationYear != "" ? values.graduationYear - : null - }, - navigate: navigate + : null, + is_student: isCollege + } + }).then(res => { + if (res) { + if (ruri) { + navigate(`/${ruri}`); + } else { + navigate("/dashboard/connect-discord"); + } + } }); }; // console.log(userData); @@ -260,9 +270,13 @@ export default function CollegePage() { variant="outline" onClick={e => { e.preventDefault(); - navigate( - "/dashboard/connect-discord" - ); + if (ruri) { + navigate(`/${ruri}`); + } else { + navigate( + "/dashboard/connect-discord" + ); + } }} > Skip diff --git a/src/modules/Common/Authentication/pages/Onboarding/SignIn/SignIn.tsx b/src/modules/Common/Authentication/pages/Onboarding/SignIn/SignIn.tsx index 77d3a427f..9c6a82645 100644 --- a/src/modules/Common/Authentication/pages/Onboarding/SignIn/SignIn.tsx +++ b/src/modules/Common/Authentication/pages/Onboarding/SignIn/SignIn.tsx @@ -153,7 +153,13 @@ export default function SignIn() {
diff --git a/src/modules/Common/Authentication/pages/Onboarding/UserInterest/UserInterest.tsx b/src/modules/Common/Authentication/pages/Onboarding/UserInterest/UserInterest.tsx index 90d21a549..1f77b1a13 100644 --- a/src/modules/Common/Authentication/pages/Onboarding/UserInterest/UserInterest.tsx +++ b/src/modules/Common/Authentication/pages/Onboarding/UserInterest/UserInterest.tsx @@ -65,6 +65,7 @@ export default function UserInterest() { const [stepTwo, setStepTwo] = useState(false); const [interestGroups, setInterestGroups] = useState({}); const navigate = useNavigate(); + const ruri = window.location.href.split("=")[1]; useEffect(() => { const fetchInterestGroups = async () => { @@ -153,7 +154,11 @@ export default function UserInterest() { data ); toast.success(res.data?.message.general[0]); - navigate("/register/organization"); + navigate( + ruri + ? `/register/organization/?ruri=${ruri}` + : "/register/organization" + ); } catch (err: any) { toast.error( err.response?.data.message.general[0] || @@ -275,9 +280,15 @@ export default function UserInterest() {
mulearn -

{stepTwo ? "What do you expect by MuLearning " : "What describes you the most!"}

+

+ {stepTwo + ? "What do you expect by MuLearning " + : "What describes you the most!"} +

- {stepTwo ? "Pick your goal." : "Please select your interested area"} + {stepTwo + ? "Pick your goal." + : "Please select your interested area"}

{stepTwo @@ -292,7 +303,7 @@ export default function UserInterest() { isLoading={false} onClick={stepTwo ? handleSubmit : handleContinue} > - {stepTwo ? "Submit" : "Continue"} + Continue )}
diff --git a/src/modules/Common/Authentication/services/newOnboardingApis.ts b/src/modules/Common/Authentication/services/newOnboardingApis.ts index 43735aafc..cdd59daa6 100644 --- a/src/modules/Common/Authentication/services/newOnboardingApis.ts +++ b/src/modules/Common/Authentication/services/newOnboardingApis.ts @@ -147,12 +147,10 @@ export const getCompanies = async ({ export const submitUserData = async ({ setIsLoading, - userData, - navigate + userData }: { setIsLoading: Dispatch>; userData: Object; - navigate: NavigateFunction; }) => { console.log("UserData", userData); try { @@ -164,13 +162,14 @@ export const submitUserData = async ({ const tokens = res.data.response; localStorage.setItem("accessToken", tokens.accessToken); localStorage.setItem("refreshToken", tokens.refreshToken); - navigate("/register/interests"); + return true; } catch (err: any) { setIsLoading(false); const messages = err.response.data.message.general[0]; showToasts({ messages: messages }); + return false; } }; diff --git a/src/modules/Common/Authentication/services/onboardingApis.ts b/src/modules/Common/Authentication/services/onboardingApis.ts index 874bd892a..75ec01e5e 100644 --- a/src/modules/Common/Authentication/services/onboardingApis.ts +++ b/src/modules/Common/Authentication/services/onboardingApis.ts @@ -238,12 +238,10 @@ export const getCommunities = ({ export const selectOrganization = async ({ setIsLoading, - userData, - navigate + userData }: { setIsLoading: Dispatch>; userData: Object; - navigate: NavigateFunction; }) => { try { setIsLoading(true); @@ -253,7 +251,7 @@ export const selectOrganization = async ({ ); if (res.status == 200 && !res.data.hasError) { toast.success(res.data.message.general[0]); - navigate("/dashboard/connect-discord"); + return true; } else { toast.error("Organization selection failed."); } @@ -261,6 +259,7 @@ export const selectOrganization = async ({ } catch (err: any) { toast.error("Unable to select organization."); } + return false; }; // POST request for registration diff --git a/src/modules/Dashboard/modules/LearningCircle/pages/LcDashboard/components/LcHistory.tsx b/src/modules/Dashboard/modules/LearningCircle/pages/LcDashboard/components/LcHistory.tsx index aff699a78..2b70f028b 100644 --- a/src/modules/Dashboard/modules/LearningCircle/pages/LcDashboard/components/LcHistory.tsx +++ b/src/modules/Dashboard/modules/LearningCircle/pages/LcDashboard/components/LcHistory.tsx @@ -16,6 +16,7 @@ import toast from "react-hot-toast"; type Props = { id: string | undefined; lc: LcMeetupDetailInfo | undefined; + setLc: UseStateFunc; }; const LcHistory = (props: Props) => { @@ -23,10 +24,22 @@ const LcHistory = (props: Props) => { const handleInterested = (e: any) => { e.preventDefault(); if (props.lc?.is_lc_member) { - joinMeetup(props.lc?.id ?? ""); + joinMeetup(props.lc?.id ?? "").then(res => { + props.setLc({ + ...props.lc, + joined_at: new Date().toISOString() + } as any); + }); return; } - interestedMeetup(props.lc?.id ?? "", props.lc?.is_interested); + interestedMeetup(props.lc?.id ?? "", props.lc?.is_interested).then( + res => { + props.setLc({ + ...props.lc, + is_interested: !props.lc?.is_interested + } as any); + } + ); }; return (
diff --git a/src/modules/Dashboard/modules/LearningCircle/pages/Meetup/LcMeetup.tsx b/src/modules/Dashboard/modules/LearningCircle/pages/Meetup/LcMeetup.tsx index 9fccd4a27..4e43e1806 100644 --- a/src/modules/Dashboard/modules/LearningCircle/pages/Meetup/LcMeetup.tsx +++ b/src/modules/Dashboard/modules/LearningCircle/pages/Meetup/LcMeetup.tsx @@ -3,6 +3,7 @@ import LcHistory from "../LcDashboard/components/LcHistory"; import { useEffect, useState } from "react"; import { getMeetupInfo } from "../../services/LearningCircleAPIs"; import toast from "react-hot-toast"; +import MuLoader from "@/MuLearnComponents/MuLoader/MuLoader"; export default function LcMeetupIfo() { const params = useParams(); @@ -16,5 +17,9 @@ export default function LcMeetupIfo() { toast.error("Failed to fetch data"); }); }, []); - return data ? : <>Loading; + return data ? ( + + ) : ( + + ); } From f0a53ed3bf5a031784d00b63a3062edfb0b1dc50 Mon Sep 17 00:00:00 2001 From: Aswanth Vc Date: Sun, 13 Oct 2024 18:56:23 +0530 Subject: [PATCH 25/31] fix: onboard build --- .../Authentication/pages/Onboarding/RolePage/RolePage.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/modules/Common/Authentication/pages/Onboarding/RolePage/RolePage.tsx b/src/modules/Common/Authentication/pages/Onboarding/RolePage/RolePage.tsx index c98715aef..2769a2f8e 100644 --- a/src/modules/Common/Authentication/pages/Onboarding/RolePage/RolePage.tsx +++ b/src/modules/Common/Authentication/pages/Onboarding/RolePage/RolePage.tsx @@ -72,8 +72,8 @@ export default function Rolepage() { submitUserData({ setIsLoading: setIsLoading, - userData: newUserData, - navigate: navigate + userData: newUserData + // navigate: navigate # want to handle this if this page is used in other places }); }; From d789f42d4d14ee92c54ed56162f513108d5745ad Mon Sep 17 00:00:00 2001 From: Aswanth Vc Date: Sun, 13 Oct 2024 18:56:23 +0530 Subject: [PATCH 26/31] fix: onboard build --- .../pages/Onboarding/CompanyPage/CompanyPage.tsx | 4 ++-- .../Authentication/pages/Onboarding/RolePage/RolePage.tsx | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/modules/Common/Authentication/pages/Onboarding/CompanyPage/CompanyPage.tsx b/src/modules/Common/Authentication/pages/Onboarding/CompanyPage/CompanyPage.tsx index f901ad680..f47c96710 100644 --- a/src/modules/Common/Authentication/pages/Onboarding/CompanyPage/CompanyPage.tsx +++ b/src/modules/Common/Authentication/pages/Onboarding/CompanyPage/CompanyPage.tsx @@ -153,8 +153,8 @@ export default function CompanyPage({ // console.log(newUserData); submitUserData({ setIsLoading: setIsLoading, - userData: newUserData, - navigate: navigate + userData: newUserData + // navigate: navigate }); }; diff --git a/src/modules/Common/Authentication/pages/Onboarding/RolePage/RolePage.tsx b/src/modules/Common/Authentication/pages/Onboarding/RolePage/RolePage.tsx index c98715aef..2769a2f8e 100644 --- a/src/modules/Common/Authentication/pages/Onboarding/RolePage/RolePage.tsx +++ b/src/modules/Common/Authentication/pages/Onboarding/RolePage/RolePage.tsx @@ -72,8 +72,8 @@ export default function Rolepage() { submitUserData({ setIsLoading: setIsLoading, - userData: newUserData, - navigate: navigate + userData: newUserData + // navigate: navigate # want to handle this if this page is used in other places }); }; From 4a479bc4a16d3f0c0d5a996cc2595942891b5a71 Mon Sep 17 00:00:00 2001 From: Aswanth Vc Date: Sun, 13 Oct 2024 21:17:51 +0530 Subject: [PATCH 27/31] feat: meetup card and improvements --- .../pages/LcDashboard/LcDashboard.module.css | 146 +++++++++++++++--- .../LcDashboard/components/LcHistory.tsx | 37 ++++- .../LcDashboard/components/LcMeetCreate.tsx | 137 ++++++++++++++-- .../LcDashboard/components/LcMeetups.tsx | 77 +++++---- .../pages/LearningCircle.module.css | 47 ++++++ .../services/LearningCircleInterface.d.ts | 2 + 6 files changed, 384 insertions(+), 62 deletions(-) diff --git a/src/modules/Dashboard/modules/LearningCircle/pages/LcDashboard/LcDashboard.module.css b/src/modules/Dashboard/modules/LearningCircle/pages/LcDashboard/LcDashboard.module.css index 4bc69c08d..d55708f69 100644 --- a/src/modules/Dashboard/modules/LearningCircle/pages/LcDashboard/LcDashboard.module.css +++ b/src/modules/Dashboard/modules/LearningCircle/pages/LcDashboard/LcDashboard.module.css @@ -356,6 +356,17 @@ display: flex; flex-direction: column; gap: 10px; + + .title { + font-size: 15px; + font-weight: 600; + margin-bottom: 20px; + color: #ddddddf8; + text-align: left; + width: fit-content; + padding-bottom: 10px; + border-bottom: 1px solid #ddddddf8; + } } .loading { @@ -414,23 +425,31 @@ flex-wrap: wrap; gap: 5px; } -.Headings .meetupTags { - display: flex; - flex-direction: row; - flex-wrap: wrap; - width: 100%; - - .meetupInfoTag { - display: flex; - gap: 10px; - align-items: center; - justify-content: start; - padding: 5px 10px; - background-color: white; - color: #456ff6; - border: 1px dashed #456ff6; +.Headings { + .info { + padding: 10px; + background: #dddddd50; border-radius: 10px; - margin: 5px; + margin: 10px 0; + } + .meetupTags { + display: flex; + flex-direction: row; + flex-wrap: wrap; + width: 100%; + + .meetupInfoTag { + display: flex; + gap: 10px; + align-items: center; + justify-content: start; + padding: 5px 10px; + background-color: white; + color: #456ff6; + border: 1px dashed #456ff6; + border-radius: 10px; + margin: 5px; + } } } @@ -439,10 +458,38 @@ flex-direction: row; flex-wrap: wrap; } -.HistoryDataWrapper .SectionBottom .detailedSection img { - height: 280px; - width: 460px; - object-fit: cover; +.detailedSection { + .tasks { + display: flex; + flex-direction: column; + gap: 10px; + width: 100%; + width: 100%; + color: black; + .task { + width: 100%; + display: flex; + flex-direction: row; + justify-content: start; + gap: 10px; + align-items: center; + padding: 10px; + background-color: rgba(238, 242, 255, 1); + border-radius: 10px; + font-size: 15px; + span { + font-size: 17px; + font-weight: 900; + padding-right: 10px; + border-right: 1px solid #dddddd; + } + } + } + .HistoryDataWrapper .SectionBottom .detailedSection img { + height: 280px; + width: 460px; + object-fit: cover; + } } @media screen and (max-width: 1000px) { .HistoryDataWrapper .Headings, @@ -1248,6 +1295,7 @@ input[type="time"]::-webkit-calendar-picker-indicator { padding: 20px; margin: 20px 10px; border-radius: 5px; + text-align: left; .title { font-size: 18px; font-weight: 800; @@ -1360,6 +1408,64 @@ input[type="time"]::-webkit-calendar-picker-indicator { height: 50px; } +.input_field { + .inputBox { + .tasks { + display: flex; + gap: 10px; + align-items: center; + justify-content: center; + button { + height: fit-content; + padding: 12px; + background: var(--blue); + border-radius: 10px; + color: #fff; + } + } + } + .addedTasks { + display: flex; + justify-content: space-between; + flex-direction: column; + gap: 10px; + align-items: center; + + .task { + display: flex; + justify-content: space-between; + width: 100%; + font-size: 13px; + align-items: center; + padding: 10px; + background: #dddddd50; + border-radius: 10px; + justify-content: center; + div { + display: flex; + flex-direction: row; + align-items: center; + width: 100%; + gap: 10px; + span { + font-size: 15px; + font-weight: 900; + } + p { + font-size: 15px !important; + font-weight: 500; + } + } + } + .taskAdd { + background: var(--blue); + height: fit-content; + padding: 12px; + border-radius: 10px; + color: #fff; + } + } +} /* @media (max-width: 1500px) { .edit_profile_container { left: unset; diff --git a/src/modules/Dashboard/modules/LearningCircle/pages/LcDashboard/components/LcHistory.tsx b/src/modules/Dashboard/modules/LearningCircle/pages/LcDashboard/components/LcHistory.tsx index 2b70f028b..9a0b8292a 100644 --- a/src/modules/Dashboard/modules/LearningCircle/pages/LcDashboard/components/LcHistory.tsx +++ b/src/modules/Dashboard/modules/LearningCircle/pages/LcDashboard/components/LcHistory.tsx @@ -43,6 +43,7 @@ const LcHistory = (props: Props) => { }; return (
+

Learning Circle Meetup

{props.lc ? ( <>
@@ -77,6 +78,29 @@ const LcHistory = (props: Props) => { {props.lc.meet_code}

+

{ + navigator.clipboard.writeText( + window.location.href ?? + "NOTCOPIED" + ); + toast.success("Link Copied"); + }} + > + {" "} + + + + + Copy Link +

{props.lc.total_interested}{" "} Interests Submitted @@ -87,13 +111,13 @@ const LcHistory = (props: Props) => {

)} { -

+

Venue:{" "} {props.lc.meet_place || props.lc?.meet_place}

} -

+

Time:{" "} {convertToFormatedDate(props.lc.meet_time) + " " + @@ -108,6 +132,15 @@ const LcHistory = (props: Props) => {

Agenda

{props.lc.agenda}

+

Tasks

+
+ {props.lc.tasks.map((task, index) => ( +
+ {index + 1} + {task} +
+ ))} +
diff --git a/src/modules/Dashboard/modules/LearningCircle/pages/LcDashboard/components/LcMeetCreate.tsx b/src/modules/Dashboard/modules/LearningCircle/pages/LcDashboard/components/LcMeetCreate.tsx index 22c341b8d..5bce1ad11 100644 --- a/src/modules/Dashboard/modules/LearningCircle/pages/LcDashboard/components/LcMeetCreate.tsx +++ b/src/modules/Dashboard/modules/LearningCircle/pages/LcDashboard/components/LcMeetCreate.tsx @@ -1,4 +1,4 @@ -import { Dispatch, SetStateAction, useState } from "react"; +import { createRef, Dispatch, SetStateAction, useRef, useState } from "react"; import styles from "../LcDashboard.module.css"; import toast from "react-hot-toast"; import { @@ -7,6 +7,7 @@ import { } from "../../../services/LearningCircleAPIs"; import { useFormik } from "formik"; import { Switch } from "@chakra-ui/react"; +import { PowerfulButton } from "@/MuLearnComponents/MuButtons/MuButton"; type Props = { setTemp: Dispatch>; @@ -15,6 +16,9 @@ type Props = { }; const LcMeetCreate = (props: Props) => { + const [tasks, setTasks] = useState([]); + const taskInputRef = createRef(); + const [isLoading, setIsLoading] = useState(false); const formik = useFormik({ initialValues: { title: "", @@ -26,12 +30,18 @@ const LcMeetCreate = (props: Props) => { pre_requirements: null, is_public: true, limit_attendees: false, - max_attendees: -1 + max_attendees: -1, + is_online: false }, onSubmit: values => { - createMeetup(values, props.id ?? "") + if (tasks.length === 0) { + toast.error("Please add tasks"); + return; + } + setIsLoading(true); + createMeetup({ ...values, tasks: tasks }, props.id ?? "") .then(res => { - console.log(res); + setIsLoading(false); if (res) { if (res.hasError) { toast.error(res.message.general[0]); @@ -41,6 +51,7 @@ const LcMeetCreate = (props: Props) => { } }) .catch(err => { + setIsLoading(false); toast.error("Failed to create meetup"); }); @@ -112,7 +123,7 @@ const LcMeetCreate = (props: Props) => {
- +
+
+

Attendees List

+
+ {attendees.map(attendee => ( + + ))} +
+
diff --git a/src/modules/Dashboard/modules/LearningCircle/services/LearningCircleAPIs.ts b/src/modules/Dashboard/modules/LearningCircle/services/LearningCircleAPIs.ts index 4292b2925..494fb958d 100644 --- a/src/modules/Dashboard/modules/LearningCircle/services/LearningCircleAPIs.ts +++ b/src/modules/Dashboard/modules/LearningCircle/services/LearningCircleAPIs.ts @@ -338,6 +338,22 @@ export const updateLcNote = async (data: LcNote) => { } }; +export const getMeetupAttendees = async (id: string | undefined) => { + try { + console.log(dynamicRoute(lcRoutes.getLcAttendees, id as string)); + const response = await privateGateway.get( + dynamicRoute(lcRoutes.getLcAttendees, id as string) + ); + const message: any = response?.data; + return message.response; + } catch (err) { + const error = err as AxiosError; + if (error?.response) { + throw error; + } + } +}; + export const getLcMeetups = async (id: string | undefined) => { try { const response = await privateGateway.get( diff --git a/src/services/endpoints.ts b/src/services/endpoints.ts index 9dcc901ef..bd2c2943d 100644 --- a/src/services/endpoints.ts +++ b/src/services/endpoints.ts @@ -11,7 +11,7 @@ export const dynamicRoute = (route: string, ...args: string[]) => { }; export const lcRoutes = { - createReport: "/api/v1/dashboard/lc//meets/report/${meetId}/", + createReport: "/api/v1/dashboard/lc/meets/report/${meetId}/", getReport: "/api/v1/dashboard/lc/${LcID}/report/${ReportID}/show/", transferLead: "/api/v1/dashboard/lc/${LcID}/lead-transfer/${MemberID}/", approveRejectRemoveUser: @@ -19,6 +19,7 @@ export const lcRoutes = { scheduleMeet: "/api/v1/dashboard/lc/${LcID}/schedule-meet/", createMeet: "/api/v1/dashboard/lc/${LcID}/meet/create/", getLcMeetups: "/api/v1/dashboard/lc/${LcID}/meet/list/", + getLcAttendees: "/api/v1/dashboard/lc/meets/attendees/${meetId}/", getDetailsUpdateNote: "/api/v1/dashboard/lc/${LcID}/details/" }; From b4a95c7b6bb25726489c6fde2b28d04011cc2b84 Mon Sep 17 00:00:00 2001 From: Aswanth Vc Date: Sun, 20 Oct 2024 16:06:48 +0530 Subject: [PATCH 29/31] feat: Learning Circle Pages --- package-lock.json | 413 +++++++++++------- package.json | 2 + src/App.tsx | 15 + .../Authentication/pages/Onboarding.tsx | 4 - .../Onboarding/CollegePage/CollegePage.tsx | 1 - .../pages/Onboarding/SignIn/SignIn.tsx | 2 - .../Authentication/pages/ResetPassword.tsx | 1 - .../Dashboard/layouts/DashboardRootLayout.tsx | 8 +- .../pages/LcAdmin/LcAdmin.module.css | 0 .../LearningCircle/pages/LcAdmin/LcAdmin.tsx | 96 ++++ .../pages/LcDashboard/LcDashboard.module.css | 172 +++++++- .../components/LcAttendeeReport.tsx | 276 ++++++++++++ .../LcDashboard/components/LcHistory.tsx | 89 +++- .../pages/LcDashboard/components/LcHome.tsx | 161 +++++-- .../LcDashboard/components/LcMeetCreate.tsx | 23 +- .../LcDashboard/components/LcMeetups.tsx | 21 +- .../pages/LcDashboard/components/LcReport.tsx | 174 ++++++-- .../LcDashboard/components/YourMeetups.tsx | 108 +++++ .../pages/LearningCircle.module.css | 6 +- .../pages/LearningCircleLandingPage.tsx | 17 +- .../services/LearningCircleAPIs.ts | 109 ++++- .../services/LearningCircleInterface.d.ts | 17 +- src/services/endpoints.ts | 3 +- src/services/urls.ts | 5 + 24 files changed, 1407 insertions(+), 316 deletions(-) create mode 100644 src/modules/Dashboard/modules/LearningCircle/pages/LcAdmin/LcAdmin.module.css create mode 100644 src/modules/Dashboard/modules/LearningCircle/pages/LcAdmin/LcAdmin.tsx create mode 100644 src/modules/Dashboard/modules/LearningCircle/pages/LcDashboard/components/LcAttendeeReport.tsx create mode 100644 src/modules/Dashboard/modules/LearningCircle/pages/LcDashboard/components/YourMeetups.tsx diff --git a/package-lock.json b/package-lock.json index 0d96f7edc..74c81fa67 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,6 +11,7 @@ "@chakra-ui/react": "^2.6.1", "@emotion/react": "^11.10.6", "@emotion/styled": "^11.10.6", + "@types/react-star-ratings": "^2.3.3", "@types/react-tabs": "^5.0.5", "axios": "^1.3.4", "file-saver": "^2.0.5", @@ -32,6 +33,7 @@ "react-router-dom": "^6.9.0", "react-select": "^5.7.7", "react-spinners": "^0.13.8", + "react-star-ratings": "^2.3.0", "react-tabs": "^6.0.1", "react-tag-input-component": "^2.0.2", "react-tooltip": "^5.18.1", @@ -2102,16 +2104,21 @@ "dev": true }, "node_modules/@babel/runtime": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", - "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz", + "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==", "dependencies": { - "regenerator-runtime": "^0.13.11" + "regenerator-runtime": "^0.14.0" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@babel/runtime/node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + }, "node_modules/@babel/template": { "version": "7.22.15", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", @@ -3332,21 +3339,21 @@ } }, "node_modules/@emotion/babel-plugin": { - "version": "11.10.6", - "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.10.6.tgz", - "integrity": "sha512-p2dAqtVrkhSa7xz1u/m9eHYdLi+en8NowrmXeF/dKtJpU8lCWli8RUAati7NcSl0afsBott48pdnANuD0wh9QQ==", + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.12.0.tgz", + "integrity": "sha512-y2WQb+oP8Jqvvclh8Q55gLUyb7UFvgv7eJfsj7td5TToBrIUtPay2kMrZi4xjq9qw2vD0ZR5fSho0yqoFgX7Rw==", "dependencies": { "@babel/helper-module-imports": "^7.16.7", "@babel/runtime": "^7.18.3", - "@emotion/hash": "^0.9.0", - "@emotion/memoize": "^0.8.0", - "@emotion/serialize": "^1.1.1", + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/serialize": "^1.2.0", "babel-plugin-macros": "^3.1.0", "convert-source-map": "^1.5.0", "escape-string-regexp": "^4.0.0", "find-root": "^1.1.0", "source-map": "^0.5.7", - "stylis": "4.1.3" + "stylis": "4.2.0" } }, "node_modules/@emotion/babel-plugin/node_modules/escape-string-regexp": { @@ -3361,47 +3368,47 @@ } }, "node_modules/@emotion/cache": { - "version": "11.10.5", - "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.10.5.tgz", - "integrity": "sha512-dGYHWyzTdmK+f2+EnIGBpkz1lKc4Zbj2KHd4cX3Wi8/OWr5pKslNjc3yABKH4adRGCvSX4VDC0i04mrrq0aiRA==", + "version": "11.13.1", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.13.1.tgz", + "integrity": "sha512-iqouYkuEblRcXmylXIwwOodiEK5Ifl7JcX7o6V4jI3iW4mLXX3dmt5xwBtIkJiQEXFAI+pC8X0i67yiPkH9Ucw==", "dependencies": { - "@emotion/memoize": "^0.8.0", - "@emotion/sheet": "^1.2.1", - "@emotion/utils": "^1.2.0", - "@emotion/weak-memoize": "^0.3.0", - "stylis": "4.1.3" + "@emotion/memoize": "^0.9.0", + "@emotion/sheet": "^1.4.0", + "@emotion/utils": "^1.4.0", + "@emotion/weak-memoize": "^0.4.0", + "stylis": "4.2.0" } }, "node_modules/@emotion/hash": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.0.tgz", - "integrity": "sha512-14FtKiHhy2QoPIzdTcvh//8OyBlknNs2nXRwIhG904opCby3l+9Xaf/wuPvICBF0rc1ZCNBd3nKe9cd2mecVkQ==" + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz", + "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==" }, "node_modules/@emotion/is-prop-valid": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.0.tgz", - "integrity": "sha512-3aDpDprjM0AwaxGE09bOPkNxHpBd+kA6jty3RnaEXdweX1DF1U3VQpPYb0g1IStAuK7SVQ1cy+bNBBKp4W3Fjg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.3.1.tgz", + "integrity": "sha512-/ACwoqx7XQi9knQs/G0qKvv5teDMhD7bXYns9N/wM8ah8iNb8jZ2uNO0YOgiq2o2poIvVtJS2YALasQuMSQ7Kw==", "dependencies": { - "@emotion/memoize": "^0.8.0" + "@emotion/memoize": "^0.9.0" } }, "node_modules/@emotion/memoize": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.0.tgz", - "integrity": "sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA==" + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", + "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==" }, "node_modules/@emotion/react": { - "version": "11.10.6", - "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.10.6.tgz", - "integrity": "sha512-6HT8jBmcSkfzO7mc+N1L9uwvOnlcGoix8Zn7srt+9ga0MjREo6lRpuVX0kzo6Jp6oTqDhREOFsygN6Ew4fEQbw==", + "version": "11.13.3", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.13.3.tgz", + "integrity": "sha512-lIsdU6JNrmYfJ5EbUCf4xW1ovy5wKQ2CkPRM4xogziOxH1nXxBSjpC9YqbFAP7circxMfYp+6x676BqWcEiixg==", "dependencies": { "@babel/runtime": "^7.18.3", - "@emotion/babel-plugin": "^11.10.6", - "@emotion/cache": "^11.10.5", - "@emotion/serialize": "^1.1.1", - "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0", - "@emotion/utils": "^1.2.0", - "@emotion/weak-memoize": "^0.3.0", + "@emotion/babel-plugin": "^11.12.0", + "@emotion/cache": "^11.13.0", + "@emotion/serialize": "^1.3.1", + "@emotion/use-insertion-effect-with-fallbacks": "^1.1.0", + "@emotion/utils": "^1.4.0", + "@emotion/weak-memoize": "^0.4.0", "hoist-non-react-statics": "^3.3.1" }, "peerDependencies": { @@ -3414,33 +3421,33 @@ } }, "node_modules/@emotion/serialize": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.1.tgz", - "integrity": "sha512-Zl/0LFggN7+L1liljxXdsVSVlg6E/Z/olVWpfxUTxOAmi8NU7YoeWeLfi1RmnB2TATHoaWwIBRoL+FvAJiTUQA==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.2.tgz", + "integrity": "sha512-grVnMvVPK9yUVE6rkKfAJlYZgo0cu3l9iMC77V7DW6E1DUIrU68pSEXRmFZFOFB1QFo57TncmOcvcbMDWsL4yA==", "dependencies": { - "@emotion/hash": "^0.9.0", - "@emotion/memoize": "^0.8.0", - "@emotion/unitless": "^0.8.0", - "@emotion/utils": "^1.2.0", + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/unitless": "^0.10.0", + "@emotion/utils": "^1.4.1", "csstype": "^3.0.2" } }, "node_modules/@emotion/sheet": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.1.tgz", - "integrity": "sha512-zxRBwl93sHMsOj4zs+OslQKg/uhF38MB+OMKoCrVuS0nyTkqnau+BM3WGEoOptg9Oz45T/aIGs1qbVAsEFo3nA==" + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz", + "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==" }, "node_modules/@emotion/styled": { - "version": "11.10.6", - "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.10.6.tgz", - "integrity": "sha512-OXtBzOmDSJo5Q0AFemHCfl+bUueT8BIcPSxu0EGTpGk6DmI5dnhSzQANm1e1ze0YZL7TDyAyy6s/b/zmGOS3Og==", + "version": "11.13.0", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.13.0.tgz", + "integrity": "sha512-tkzkY7nQhW/zC4hztlwucpT8QEZ6eUzpXDRhww/Eej4tFfO0FxQYWRyg/c5CCXa4d/f174kqeXYjuQRnhzf6dA==", "dependencies": { "@babel/runtime": "^7.18.3", - "@emotion/babel-plugin": "^11.10.6", - "@emotion/is-prop-valid": "^1.2.0", - "@emotion/serialize": "^1.1.1", - "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0", - "@emotion/utils": "^1.2.0" + "@emotion/babel-plugin": "^11.12.0", + "@emotion/is-prop-valid": "^1.3.0", + "@emotion/serialize": "^1.3.0", + "@emotion/use-insertion-effect-with-fallbacks": "^1.1.0", + "@emotion/utils": "^1.4.0" }, "peerDependencies": { "@emotion/react": "^11.0.0-rc.0", @@ -3453,27 +3460,27 @@ } }, "node_modules/@emotion/unitless": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.0.tgz", - "integrity": "sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw==" + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz", + "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==" }, "node_modules/@emotion/use-insertion-effect-with-fallbacks": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.0.tgz", - "integrity": "sha512-1eEgUGmkaljiBnRMTdksDV1W4kUnmwgp7X9G8B++9GYwl1lUdqSndSriIrTJ0N7LQaoauY9JJ2yhiOYK5+NI4A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.1.0.tgz", + "integrity": "sha512-+wBOcIV5snwGgI2ya3u99D7/FJquOIniQT1IKyDsBmEgwvpxMNeS65Oib7OnE2d2aY+3BU4OiH+0Wchf8yk3Hw==", "peerDependencies": { "react": ">=16.8.0" } }, "node_modules/@emotion/utils": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.0.tgz", - "integrity": "sha512-sn3WH53Kzpw8oQ5mgMmIzzyAaH2ZqFEbozVVBSYp538E06OSE6ytOp7pRAjNQR+Q/orwqdQYJSe2m3hCOeznkw==" + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.1.tgz", + "integrity": "sha512-BymCXzCG3r72VKJxaYVwOXATqXIZ85cuvg0YOUDxMGNrKc1DJRZk8MgV5wyXRyEayIMd4FuXJIUgTBXvDNW5cA==" }, "node_modules/@emotion/weak-memoize": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.0.tgz", - "integrity": "sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg==" + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz", + "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==" }, "node_modules/@esbuild/android-arm": { "version": "0.18.20", @@ -4057,9 +4064,9 @@ } }, "node_modules/@popperjs/core": { - "version": "2.11.7", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.7.tgz", - "integrity": "sha512-Cr4OjIkipTtcXKjAsm8agyleBuDHvxzeBoa1v543lbv1YaIwQjESsVcmjiWiPEbC1FIeHOG/Op9kdCmAmiS3Kw==", + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", "funding": { "type": "opencollective", "url": "https://opencollective.com/popperjs" @@ -4410,9 +4417,9 @@ "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" }, "node_modules/@types/prop-types": { - "version": "15.7.5", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", - "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" + "version": "15.7.13", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.13.tgz", + "integrity": "sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==" }, "node_modules/@types/raf": { "version": "3.4.3", @@ -4448,6 +4455,14 @@ "@types/react": "*" } }, + "node_modules/@types/react-star-ratings": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@types/react-star-ratings/-/react-star-ratings-2.3.3.tgz", + "integrity": "sha512-8vLqJG1uRA2SmYBBMPWpv6QWHLvZ/a3XmELCIf4xh4VFXT7QkkrcthiLSMjQ4ibDiUtYYpyLB0JoR1lBHSHA2A==", + "dependencies": { + "@types/react": "*" + } + }, "node_modules/@types/react-tabs": { "version": "5.0.5", "resolved": "https://registry.npmjs.org/@types/react-tabs/-/react-tabs-5.0.5.tgz", @@ -4458,9 +4473,9 @@ } }, "node_modules/@types/react-transition-group": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.5.tgz", - "integrity": "sha512-juKD/eiSM3/xZYzjuzH6ZwpP+/lejltmiS3QEzV/vmb/Q8+HfDmxu+Baga8UEMGBqV88Nbg4l2hY/K2DkyaLLA==", + "version": "4.4.11", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.11.tgz", + "integrity": "sha512-RM05tAniPZ5DZPzzNFP+DmrcOdD0efDUxMy3145oljWSl3x9ZV5vhme98gTxFrj2lhXvmGNnUiuDyJgY9IKkNA==", "dependencies": { "@types/react": "*" } @@ -5578,9 +5593,9 @@ } }, "node_modules/csstype": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", - "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==" + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" }, "node_modules/d3-array": { "version": "3.2.4", @@ -8930,6 +8945,29 @@ "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0" } }, + "node_modules/react-star-ratings": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/react-star-ratings/-/react-star-ratings-2.3.0.tgz", + "integrity": "sha512-34Z/oFNDRRn4ZcX7F3t9ccnpo7SQ32gD/vsusQOBc6B6vlqaGR6tke1/Yx3jTDjemKRSmXqhKgpPTR7/JAXq6A==", + "dependencies": { + "classnames": "^2.2.1", + "prop-types": "^15.6.0", + "react": "^16.1.0" + } + }, + "node_modules/react-star-ratings/node_modules/react": { + "version": "16.14.0", + "resolved": "https://registry.npmjs.org/react/-/react-16.14.0.tgz", + "integrity": "sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/react-style-singleton": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz", @@ -9092,7 +9130,8 @@ "node_modules/regenerator-runtime": { "version": "0.13.11", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "optional": true }, "node_modules/regenerator-transform": { "version": "0.15.2", @@ -9721,9 +9760,9 @@ } }, "node_modules/stylis": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.1.3.tgz", - "integrity": "sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA==" + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" }, "node_modules/supports-color": { "version": "5.5.0", @@ -12011,11 +12050,18 @@ "dev": true }, "@babel/runtime": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", - "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz", + "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==", "requires": { - "regenerator-runtime": "^0.13.11" + "regenerator-runtime": "^0.14.0" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + } } }, "@babel/template": { @@ -12943,21 +12989,21 @@ "requires": {} }, "@emotion/babel-plugin": { - "version": "11.10.6", - "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.10.6.tgz", - "integrity": "sha512-p2dAqtVrkhSa7xz1u/m9eHYdLi+en8NowrmXeF/dKtJpU8lCWli8RUAati7NcSl0afsBott48pdnANuD0wh9QQ==", + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.12.0.tgz", + "integrity": "sha512-y2WQb+oP8Jqvvclh8Q55gLUyb7UFvgv7eJfsj7td5TToBrIUtPay2kMrZi4xjq9qw2vD0ZR5fSho0yqoFgX7Rw==", "requires": { "@babel/helper-module-imports": "^7.16.7", "@babel/runtime": "^7.18.3", - "@emotion/hash": "^0.9.0", - "@emotion/memoize": "^0.8.0", - "@emotion/serialize": "^1.1.1", + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/serialize": "^1.2.0", "babel-plugin-macros": "^3.1.0", "convert-source-map": "^1.5.0", "escape-string-regexp": "^4.0.0", "find-root": "^1.1.0", "source-map": "^0.5.7", - "stylis": "4.1.3" + "stylis": "4.2.0" }, "dependencies": { "escape-string-regexp": { @@ -12968,100 +13014,100 @@ } }, "@emotion/cache": { - "version": "11.10.5", - "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.10.5.tgz", - "integrity": "sha512-dGYHWyzTdmK+f2+EnIGBpkz1lKc4Zbj2KHd4cX3Wi8/OWr5pKslNjc3yABKH4adRGCvSX4VDC0i04mrrq0aiRA==", + "version": "11.13.1", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.13.1.tgz", + "integrity": "sha512-iqouYkuEblRcXmylXIwwOodiEK5Ifl7JcX7o6V4jI3iW4mLXX3dmt5xwBtIkJiQEXFAI+pC8X0i67yiPkH9Ucw==", "requires": { - "@emotion/memoize": "^0.8.0", - "@emotion/sheet": "^1.2.1", - "@emotion/utils": "^1.2.0", - "@emotion/weak-memoize": "^0.3.0", - "stylis": "4.1.3" + "@emotion/memoize": "^0.9.0", + "@emotion/sheet": "^1.4.0", + "@emotion/utils": "^1.4.0", + "@emotion/weak-memoize": "^0.4.0", + "stylis": "4.2.0" } }, "@emotion/hash": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.0.tgz", - "integrity": "sha512-14FtKiHhy2QoPIzdTcvh//8OyBlknNs2nXRwIhG904opCby3l+9Xaf/wuPvICBF0rc1ZCNBd3nKe9cd2mecVkQ==" + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz", + "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==" }, "@emotion/is-prop-valid": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.0.tgz", - "integrity": "sha512-3aDpDprjM0AwaxGE09bOPkNxHpBd+kA6jty3RnaEXdweX1DF1U3VQpPYb0g1IStAuK7SVQ1cy+bNBBKp4W3Fjg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.3.1.tgz", + "integrity": "sha512-/ACwoqx7XQi9knQs/G0qKvv5teDMhD7bXYns9N/wM8ah8iNb8jZ2uNO0YOgiq2o2poIvVtJS2YALasQuMSQ7Kw==", "requires": { - "@emotion/memoize": "^0.8.0" + "@emotion/memoize": "^0.9.0" } }, "@emotion/memoize": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.0.tgz", - "integrity": "sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA==" + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", + "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==" }, "@emotion/react": { - "version": "11.10.6", - "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.10.6.tgz", - "integrity": "sha512-6HT8jBmcSkfzO7mc+N1L9uwvOnlcGoix8Zn7srt+9ga0MjREo6lRpuVX0kzo6Jp6oTqDhREOFsygN6Ew4fEQbw==", + "version": "11.13.3", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.13.3.tgz", + "integrity": "sha512-lIsdU6JNrmYfJ5EbUCf4xW1ovy5wKQ2CkPRM4xogziOxH1nXxBSjpC9YqbFAP7circxMfYp+6x676BqWcEiixg==", "requires": { "@babel/runtime": "^7.18.3", - "@emotion/babel-plugin": "^11.10.6", - "@emotion/cache": "^11.10.5", - "@emotion/serialize": "^1.1.1", - "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0", - "@emotion/utils": "^1.2.0", - "@emotion/weak-memoize": "^0.3.0", + "@emotion/babel-plugin": "^11.12.0", + "@emotion/cache": "^11.13.0", + "@emotion/serialize": "^1.3.1", + "@emotion/use-insertion-effect-with-fallbacks": "^1.1.0", + "@emotion/utils": "^1.4.0", + "@emotion/weak-memoize": "^0.4.0", "hoist-non-react-statics": "^3.3.1" } }, "@emotion/serialize": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.1.tgz", - "integrity": "sha512-Zl/0LFggN7+L1liljxXdsVSVlg6E/Z/olVWpfxUTxOAmi8NU7YoeWeLfi1RmnB2TATHoaWwIBRoL+FvAJiTUQA==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.2.tgz", + "integrity": "sha512-grVnMvVPK9yUVE6rkKfAJlYZgo0cu3l9iMC77V7DW6E1DUIrU68pSEXRmFZFOFB1QFo57TncmOcvcbMDWsL4yA==", "requires": { - "@emotion/hash": "^0.9.0", - "@emotion/memoize": "^0.8.0", - "@emotion/unitless": "^0.8.0", - "@emotion/utils": "^1.2.0", + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/unitless": "^0.10.0", + "@emotion/utils": "^1.4.1", "csstype": "^3.0.2" } }, "@emotion/sheet": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.1.tgz", - "integrity": "sha512-zxRBwl93sHMsOj4zs+OslQKg/uhF38MB+OMKoCrVuS0nyTkqnau+BM3WGEoOptg9Oz45T/aIGs1qbVAsEFo3nA==" + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz", + "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==" }, "@emotion/styled": { - "version": "11.10.6", - "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.10.6.tgz", - "integrity": "sha512-OXtBzOmDSJo5Q0AFemHCfl+bUueT8BIcPSxu0EGTpGk6DmI5dnhSzQANm1e1ze0YZL7TDyAyy6s/b/zmGOS3Og==", + "version": "11.13.0", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.13.0.tgz", + "integrity": "sha512-tkzkY7nQhW/zC4hztlwucpT8QEZ6eUzpXDRhww/Eej4tFfO0FxQYWRyg/c5CCXa4d/f174kqeXYjuQRnhzf6dA==", "requires": { "@babel/runtime": "^7.18.3", - "@emotion/babel-plugin": "^11.10.6", - "@emotion/is-prop-valid": "^1.2.0", - "@emotion/serialize": "^1.1.1", - "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0", - "@emotion/utils": "^1.2.0" + "@emotion/babel-plugin": "^11.12.0", + "@emotion/is-prop-valid": "^1.3.0", + "@emotion/serialize": "^1.3.0", + "@emotion/use-insertion-effect-with-fallbacks": "^1.1.0", + "@emotion/utils": "^1.4.0" } }, "@emotion/unitless": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.0.tgz", - "integrity": "sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw==" + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz", + "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==" }, "@emotion/use-insertion-effect-with-fallbacks": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.0.tgz", - "integrity": "sha512-1eEgUGmkaljiBnRMTdksDV1W4kUnmwgp7X9G8B++9GYwl1lUdqSndSriIrTJ0N7LQaoauY9JJ2yhiOYK5+NI4A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.1.0.tgz", + "integrity": "sha512-+wBOcIV5snwGgI2ya3u99D7/FJquOIniQT1IKyDsBmEgwvpxMNeS65Oib7OnE2d2aY+3BU4OiH+0Wchf8yk3Hw==", "requires": {} }, "@emotion/utils": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.0.tgz", - "integrity": "sha512-sn3WH53Kzpw8oQ5mgMmIzzyAaH2ZqFEbozVVBSYp538E06OSE6ytOp7pRAjNQR+Q/orwqdQYJSe2m3hCOeznkw==" + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.1.tgz", + "integrity": "sha512-BymCXzCG3r72VKJxaYVwOXATqXIZ85cuvg0YOUDxMGNrKc1DJRZk8MgV5wyXRyEayIMd4FuXJIUgTBXvDNW5cA==" }, "@emotion/weak-memoize": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.0.tgz", - "integrity": "sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg==" + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz", + "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==" }, "@esbuild/android-arm": { "version": "0.18.20", @@ -13384,9 +13430,9 @@ } }, "@popperjs/core": { - "version": "2.11.7", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.7.tgz", - "integrity": "sha512-Cr4OjIkipTtcXKjAsm8agyleBuDHvxzeBoa1v543lbv1YaIwQjESsVcmjiWiPEbC1FIeHOG/Op9kdCmAmiS3Kw==" + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==" }, "@remix-run/router": { "version": "1.10.0", @@ -13727,9 +13773,9 @@ "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" }, "@types/prop-types": { - "version": "15.7.5", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", - "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" + "version": "15.7.13", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.13.tgz", + "integrity": "sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==" }, "@types/raf": { "version": "3.4.3", @@ -13765,6 +13811,14 @@ "@types/react": "*" } }, + "@types/react-star-ratings": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@types/react-star-ratings/-/react-star-ratings-2.3.3.tgz", + "integrity": "sha512-8vLqJG1uRA2SmYBBMPWpv6QWHLvZ/a3XmELCIf4xh4VFXT7QkkrcthiLSMjQ4ibDiUtYYpyLB0JoR1lBHSHA2A==", + "requires": { + "@types/react": "*" + } + }, "@types/react-tabs": { "version": "5.0.5", "resolved": "https://registry.npmjs.org/@types/react-tabs/-/react-tabs-5.0.5.tgz", @@ -13774,9 +13828,9 @@ } }, "@types/react-transition-group": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.5.tgz", - "integrity": "sha512-juKD/eiSM3/xZYzjuzH6ZwpP+/lejltmiS3QEzV/vmb/Q8+HfDmxu+Baga8UEMGBqV88Nbg4l2hY/K2DkyaLLA==", + "version": "4.4.11", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.11.tgz", + "integrity": "sha512-RM05tAniPZ5DZPzzNFP+DmrcOdD0efDUxMy3145oljWSl3x9ZV5vhme98gTxFrj2lhXvmGNnUiuDyJgY9IKkNA==", "requires": { "@types/react": "*" } @@ -14584,9 +14638,9 @@ "dev": true }, "csstype": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", - "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==" + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" }, "d3-array": { "version": "3.2.4", @@ -17034,6 +17088,28 @@ "integrity": "sha512-3e+k56lUkPj0vb5NDXPVFAOkPC//XyhKPJjvcGjyMNPWsBKpplfeyialP74G7H7+It7KzhtET+MvGqbKgAqpZA==", "requires": {} }, + "react-star-ratings": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/react-star-ratings/-/react-star-ratings-2.3.0.tgz", + "integrity": "sha512-34Z/oFNDRRn4ZcX7F3t9ccnpo7SQ32gD/vsusQOBc6B6vlqaGR6tke1/Yx3jTDjemKRSmXqhKgpPTR7/JAXq6A==", + "requires": { + "classnames": "^2.2.1", + "prop-types": "^15.6.0", + "react": "^16.1.0" + }, + "dependencies": { + "react": { + "version": "16.14.0", + "resolved": "https://registry.npmjs.org/react/-/react-16.14.0.tgz", + "integrity": "sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2" + } + } + } + }, "react-style-singleton": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz", @@ -17149,7 +17225,8 @@ "regenerator-runtime": { "version": "0.13.11", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "optional": true }, "regenerator-transform": { "version": "0.15.2", @@ -17585,9 +17662,9 @@ "dev": true }, "stylis": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.1.3.tgz", - "integrity": "sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA==" + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" }, "supports-color": { "version": "5.5.0", diff --git a/package.json b/package.json index 44c0dde72..f7a66458e 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ "@chakra-ui/react": "^2.6.1", "@emotion/react": "^11.10.6", "@emotion/styled": "^11.10.6", + "@types/react-star-ratings": "^2.3.3", "@types/react-tabs": "^5.0.5", "axios": "^1.3.4", "file-saver": "^2.0.5", @@ -35,6 +36,7 @@ "react-router-dom": "^6.9.0", "react-select": "^5.7.7", "react-spinners": "^0.13.8", + "react-star-ratings": "^2.3.0", "react-tabs": "^6.0.1", "react-tag-input-component": "^2.0.2", "react-tooltip": "^5.18.1", diff --git a/src/App.tsx b/src/App.tsx index 8b9c6c752..bd297dce5 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -47,6 +47,8 @@ import UserInterest from "./modules/Common/Authentication/pages/Onboarding/UserI import LcMeetupIfo from "./modules/Dashboard/modules/LearningCircle/pages/Meetup/LcMeetup"; import OrganizationSetting from "./modules/Dashboard/modules/Settings/pages/Organization/Organization"; import SettingsHome from "./modules/Dashboard/modules/Settings/pages/Settings/SettingsHome"; +import LcReportAttendee from "./modules/Dashboard/modules/LearningCircle/pages/LcDashboard/components/LcAttendeeReport"; +import LcAdmin from "./modules/Dashboard/modules/LearningCircle/pages/LcAdmin/LcAdmin"; const Profile = lazy( () => import("./modules/Dashboard/modules/Profile/pages/Profile") @@ -365,6 +367,15 @@ function App() { /> ) }, + { + path: "lc-meetup-verification", + element: ( + } + /> + ) + }, { path: "campus-details", element: ( @@ -704,6 +715,10 @@ function App() { path: "learning-circle/meetup/:id", element: }, + { + path: "learning-circle/meetup/:id/attendee-report", + element: + }, { path: "learning-circle/details/:id", element: diff --git a/src/modules/Common/Authentication/pages/Onboarding.tsx b/src/modules/Common/Authentication/pages/Onboarding.tsx index ce6c5d71a..4c515e9d5 100644 --- a/src/modules/Common/Authentication/pages/Onboarding.tsx +++ b/src/modules/Common/Authentication/pages/Onboarding.tsx @@ -433,7 +433,6 @@ const Onboarding = (props: Props) => { setDefaultCommunity([ { value: foundCommunity.id, label: foundCommunity.title } ]); - console.log(defaultCommunity); } } }, [communityAPI]); @@ -1065,9 +1064,6 @@ const Onboarding = (props: Props) => { : null } onChange={OnChangeValue => { - console.log( - OnChangeValue - ); formik.setFieldValue( "community", OnChangeValue.map( diff --git a/src/modules/Common/Authentication/pages/Onboarding/CollegePage/CollegePage.tsx b/src/modules/Common/Authentication/pages/Onboarding/CollegePage/CollegePage.tsx index 54c7e4bf1..717600e19 100644 --- a/src/modules/Common/Authentication/pages/Onboarding/CollegePage/CollegePage.tsx +++ b/src/modules/Common/Authentication/pages/Onboarding/CollegePage/CollegePage.tsx @@ -113,7 +113,6 @@ export default function CollegePage() { } }); }; - // console.log(userData); return ( { - console.log(values); - if (!otpForm) { login( values.emailOrMuId, diff --git a/src/modules/Common/Authentication/pages/ResetPassword.tsx b/src/modules/Common/Authentication/pages/ResetPassword.tsx index f9a67cee7..c5e282cce 100644 --- a/src/modules/Common/Authentication/pages/ResetPassword.tsx +++ b/src/modules/Common/Authentication/pages/ResetPassword.tsx @@ -20,7 +20,6 @@ const ResetPassword = (props: Props) => { useEffect(() => { const paramToken = searchParams.get("token"); setToken(paramToken as string); - console.log(token); if (token.length > 0 && muid.length === 0) { getMuid(token, navigate, setMuID); } diff --git a/src/modules/Dashboard/layouts/DashboardRootLayout.tsx b/src/modules/Dashboard/layouts/DashboardRootLayout.tsx index a9f296452..628dea579 100644 --- a/src/modules/Dashboard/layouts/DashboardRootLayout.tsx +++ b/src/modules/Dashboard/layouts/DashboardRootLayout.tsx @@ -173,9 +173,15 @@ const DashboardRootLayout = (props: { component?: any }) => { url: "/dashboard/interest-groups", title: "Interest Groups", hasView: true, - roles: [roles.ADMIN] + roles: [roles.ADMIN, roles.FELLOW] // icon: }, + { + url: "/dashboard/lc-meetup-verification", + title: "LC Meetup Verification", + hasView: true, + roles: [roles.ADMIN] + }, { url: "/dashboard/college-levels", title: "College Levels", diff --git a/src/modules/Dashboard/modules/LearningCircle/pages/LcAdmin/LcAdmin.module.css b/src/modules/Dashboard/modules/LearningCircle/pages/LcAdmin/LcAdmin.module.css new file mode 100644 index 000000000..e69de29bb diff --git a/src/modules/Dashboard/modules/LearningCircle/pages/LcAdmin/LcAdmin.tsx b/src/modules/Dashboard/modules/LearningCircle/pages/LcAdmin/LcAdmin.tsx new file mode 100644 index 000000000..39b53d419 --- /dev/null +++ b/src/modules/Dashboard/modules/LearningCircle/pages/LcAdmin/LcAdmin.tsx @@ -0,0 +1,96 @@ +import Pagination from "@/MuLearnComponents/Pagination/Pagination"; +import Table, { Data } from "@/MuLearnComponents/Table/Table"; +import THead from "@/MuLearnComponents/Table/THead"; +import { dashboardRoutes } from "@/MuLearnServices/urls"; +import { ReactJSXElement } from "@emotion/react/types/jsx-namespace"; +import { ReactElement, useEffect, useState } from "react"; +import { getVerifiableMeetups } from "../../services/LearningCircleAPIs"; + +const LcAdmin = () => { + const [isLoading, setIsLoading] = useState(false); + const [data, setData] = useState([]); + const [currentPage, setCurrentPage] = useState(1); + const [totalPages, setTotalPages] = useState(1); + const [perPage, setPerPage] = useState(20); + const [sort, setSort] = useState(""); + + useEffect(() => { + setIsLoading(true); + getVerifiableMeetups().then(res => { + console.log(res); + setData(res); + setIsLoading(false); + }); + }, []); + + const columnOrder: { + column: string; + Label: string; + isSortable: boolean; + wrap?: ( + data: string | ReactElement, + id: string, + row: Data + ) => ReactJSXElement; + }[] = [ + { + column: "learning_circle", + Label: "Learning Circle", + isSortable: false + }, + { column: "title", Label: "Meetup Title", isSortable: false }, + { column: "join_count", Label: "Join Count", isSortable: false }, + { + column: "interested_count", + Label: "Interest Count", + isSortable: false + }, + { + column: "report_submitted_attendees", + Label: "Report Submitted Attendees", + isSortable: false + }, + { + column: "held_on", + Label: "Started At", + isSortable: false + } + ]; + return ( + <> + {}} + > + {}} + action={false} + /> +
+ {!isLoading && ( + {}} + handlePreviousClick={() => {}} + onSearchText={() => {}} + onPerPageNumber={() => {}} + perPage={perPage} + setPerPage={setPerPage} + /> + )} +
+ {/*use when u don't need or cause
needs atleast 2 children*/} +
+ + ); +}; + +export default LcAdmin; diff --git a/src/modules/Dashboard/modules/LearningCircle/pages/LcDashboard/LcDashboard.module.css b/src/modules/Dashboard/modules/LearningCircle/pages/LcDashboard/LcDashboard.module.css index d55708f69..ec3342014 100644 --- a/src/modules/Dashboard/modules/LearningCircle/pages/LcDashboard/LcDashboard.module.css +++ b/src/modules/Dashboard/modules/LearningCircle/pages/LcDashboard/LcDashboard.module.css @@ -133,10 +133,11 @@ display: flex; align-items: flex-start; justify-content: space-between; + flex-direction: column; width: 100%; background-color: white; padding: 5%; - gap: 10px; + gap: 20px; height: 100%; } .ReportWrapper .DetailSection { @@ -146,6 +147,86 @@ justify-content: space-between; gap: 20px; width: 65%; + + .tasks { + width: 100%; + display: flex; + flex-direction: column; + gap: 10px; + width: 100%; + h4 { + text-align: start; + font-size: 18px; + font-weight: 500; + } + p { + font-size: 15px; + text-align: start; + font-weight: 400; + color: #3d5c9b; + margin-bottom: 10px; + } + .task { + width: 100%; + background: #fff; + box-shadow: 0px 0px 10px 0px rgba(0, 0, 0, 0.15); + border-radius: 10px; + padding: 10px 20px; + display: flex; + flex-direction: column; + align-items: start; + justify-content: center; + .taskTitle { + font-size: 18px; + font-weight: 600; + gap: 10px; + display: flex; + align-items: center; + } + .taskPow { + display: none; + width: 100%; + flex-direction: row; + align-items: center; + justify-content: center; + gap: 10px; + .choosenFile { + display: none; + align-items: center; + gap: 10px; + &.active { + display: flex; + } + .file { + font-size: 15px; + font-weight: 600; + color: #456ff6; + display: flex; + align-items: center; + gap: 5px; + .icon { + font-size: 20px; + } + } + .delete { + color: red; + font-size: 15px; + font-weight: 600; + cursor: pointer; + } + } + &.active { + display: flex; + } + .input { + width: 100%; + clip-path: none; + padding: 20px 10px; + border-radius: 5px; + } + } + } + } } .ReportWrapper .DetailSection .Sectionone { display: flex; @@ -242,6 +323,77 @@ width: 100%; gap: 10px; align-items: flex-start; + + .attendees { + width: 100%; + width: 100%; + display: flex; + flex-direction: column; + gap: 10px; + .attendee { + width: 100%; + display: flex; + gap: 10px; + padding: 15px; + background-color: rgba(238, 242, 255, 1); + align-items: center; + justify-content: space-between; + border-radius: 10px; + font-size: 17px; + font-weight: 600; + cursor: pointer; + h4 { + font-size: 13px; + font-weight: 700; + } + .ratingHeading { + width: 100%; + display: flex; + justify-content: space-between; + align-items: center; + .fullname { + display: flex; + align-items: center; + gap: 10px; + } + .rating { + display: flex; + align-items: center; + justify-content: center; + color: #456ff6; + } + } + .proof { + display: none; + flex-direction: column; + align-items: start; + width: 100%; + background: #fff; + padding: 10px; + border-radius: 10px; + &.active { + display: flex; + } + .reportText { + font-size: 13px; + color: #22222290; + } + .task { + width: 100%; + display: flex; + flex-direction: row; + justify-content: space-between; + gap: 10px; + align-items: center; + padding: 10px; + background: #fff; + box-shadow: 0px 0px 4px 0px rgba(0, 0, 0, 0.15); + border-radius: 5px; + font-weight: 500; + } + } + } + } } .ReportWrapper .DetailSection .SectionThree > p { color: black; @@ -416,6 +568,21 @@ .HistoryDataWrapper .Headings { width: 43%; text-align: left; + .qrcode { + width: 100%; + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; + margin: 10px; + gap: 10px; + img { + padding: 20px; + background: white; + border-radius: 10px; + box-shadow: 0px 0px 10px 0px rgba(0, 0, 0, 0.15); + } + } } .HistoryDataWrapper .detailedSection { width: 55%; @@ -434,11 +601,12 @@ } .meetupTags { display: flex; - flex-direction: row; + flex-direction: row !important; flex-wrap: wrap; width: 100%; .meetupInfoTag { + font-size: 13px; display: flex; gap: 10px; align-items: center; diff --git a/src/modules/Dashboard/modules/LearningCircle/pages/LcDashboard/components/LcAttendeeReport.tsx b/src/modules/Dashboard/modules/LearningCircle/pages/LcDashboard/components/LcAttendeeReport.tsx new file mode 100644 index 000000000..ff8f0d44d --- /dev/null +++ b/src/modules/Dashboard/modules/LearningCircle/pages/LcDashboard/components/LcAttendeeReport.tsx @@ -0,0 +1,276 @@ +import { createRef, useEffect, useRef, useState } from "react"; +import styles from "../LcDashboard.module.css"; +import { + getMeetupInfo, + submitAttendeeReport, + submitAttendeeTaskImage +} from "../../../services/LearningCircleAPIs"; +import toast from "react-hot-toast"; +import { useNavigate, useParams } from "react-router-dom"; +import { Checkbox, Input } from "@chakra-ui/react"; +import { PowerfulButton } from "@/MuLearnComponents/MuButtons/MuButton"; + +const LcReportAttendee = () => { + const [reportText, setReportText] = useState(""); + const [meetup, setMeetup] = useState(); + const props = useParams<{ id: string }>(); + const filePickerRefs = useRef>({}); // Object to store refs by task.id + const [completedTasks, setCompletedTasks] = useState([]); + const [taskImages, setTaskImages] = useState<{ + [key: string]: File | null; + }>({}); + const [taskUrls, setTaskUrls] = useState<{ [key: string]: string }>({}); + const [submitedTasks, setSubmittedtasks] = useState([]); + const [isTaskPOWSubmitting, setIsTaskPOWSubmitting] = + useState(false); + const navigate = useNavigate(); + useEffect(() => { + getMeetupInfo(setMeetup, props.id ?? ""); + }, [props.id]); + useEffect(() => { + if (meetup?.is_attendee_report_submitted) { + toast.success("Report already submitted"); + navigate("/dashboard/learning-circle"); + return; + } + meetup?.tasks.forEach(task => { + if (task.is_completed) { + setSubmittedtasks([...submitedTasks, task.id ?? ""]); + } + }); + }, [meetup]); + const handleTaskSubmit = (taskId: string) => { + const formData = new FormData(); + formData.append("meet_task", taskId); + if (taskImages[taskId]) { + console.log(taskImages[taskId]); + formData.append("is_image", "1"); + formData.append( + "image_url", + taskImages[taskId] as any, + (taskImages[taskId] as any).name + ); + setIsTaskPOWSubmitting(true); + submitAttendeeTaskImage(props.id ?? "", taskId, formData).then( + res => { + if (res) { + setSubmittedtasks([...submitedTasks, taskId]); + setIsTaskPOWSubmitting(false); + } + } + ); + } else if (taskUrls[taskId]) { + formData.append("proof_url", taskUrls[taskId]); + setIsTaskPOWSubmitting(true); + submitAttendeeTaskImage(props.id ?? "", taskId, formData).then( + res => { + if (res) { + setSubmittedtasks([...submitedTasks, taskId]); + } + setIsTaskPOWSubmitting(false); + } + ); + } else { + toast.error("Please upload an image or provide a url"); + } + }; + const handleSubmit = (event: any) => { + event.preventDefault(); + const formData = new FormData(); + if (reportText.length > 0) { + formData.append("report", reportText); + if (submitedTasks.length === 0) { + toast.error( + "Hmmm, please submit proof of work for atleast one task you have done." + ); + return; + } + submitAttendeeReport(props.id ?? "", formData).then(() => { + navigate("/dashboard/learning-circle"); + }); + } else { + toast.error("Please provide a brief description"); + } + }; + return ( +
+
+
+

Brief description *

+ +
+
+

Meeting Tasks

+

+ Please check which tasks you've done, and upload an + image or a link that shows the work you have done. +

+ {meetup?.tasks.map((task, index) => ( +
+
+ { + e.target.checked + ? setCompletedTasks([ + ...(completedTasks as any), + task.id + ]) + : setCompletedTasks( + completedTasks.filter( + id => id !== task.id + ) + ); + }} + /> + + {task.title} + +
+
+
+ { + e.preventDefault(); + filePickerRefs.current[ + task.id ?? "" + ]?.click(); + }} + disabled={isTaskPOWSubmitting} + > + Upload Image + + + + {taskImages[task.id ?? ""]?.name ?? ""} + +
+ OR + { + setTaskUrls({ + ...taskUrls, + [task.id ?? ""]: e.target.value + }); + }} + className={styles.input} + disabled={isTaskPOWSubmitting} + placeholder="Enter URL" + /> + + (filePickerRefs.current[task.id ?? ""] = + el) + } + type="file" + onChange={e => { + if (e.target.files) { + if ( + e.target.files[0].size > 5000000 + ) { + toast.error( + "File size should not exceed 5MB" + ); + return; + } + if ( + e.target.files[0].type != + "image/jpeg" && + e.target.files[0].type != + "image/png" + ) { + toast.error( + "Please upload png or jpeg image" + ); + return; + } + setTaskImages({ + ...taskImages, + [task.id ?? ""]: + e.target.files[0] + }); + } + }} + style={{ display: "none" }} + className={styles.input} + placeholder="Upload File" + disabled={isTaskPOWSubmitting} + /> + + handleTaskSubmit(task.id ?? "") + } + > + Submit + +
+
+ ))} +
+
+ +
+ ); +}; + +export default LcReportAttendee; diff --git a/src/modules/Dashboard/modules/LearningCircle/pages/LcDashboard/components/LcHistory.tsx b/src/modules/Dashboard/modules/LearningCircle/pages/LcDashboard/components/LcHistory.tsx index 9a0b8292a..b41071d0e 100644 --- a/src/modules/Dashboard/modules/LearningCircle/pages/LcDashboard/components/LcHistory.tsx +++ b/src/modules/Dashboard/modules/LearningCircle/pages/LcDashboard/components/LcHistory.tsx @@ -1,5 +1,6 @@ import styles from "../LcDashboard.module.css"; import { + fetchURLQRCode, interestedMeetup, joinMeetup } from "../../../services/LearningCircleAPIs"; @@ -12,6 +13,8 @@ import { import MuLoader from "@/MuLearnComponents/MuLoader/MuLoader"; import { PowerfulButton } from "@/MuLearnComponents/MuButtons/MuButton"; import toast from "react-hot-toast"; +import { useNavigate, useSearchParams } from "react-router-dom"; +import { useEffect, useState } from "react"; type Props = { id: string | undefined; @@ -20,10 +23,33 @@ type Props = { }; const LcHistory = (props: Props) => { - console.log(props.lc); + const navigate = useNavigate(); + const [blob, setBlob] = useState(null); + const [meetupCode, setMeetupCode] = useState(""); + const [query, setQuery] = useSearchParams(); + useEffect(() => { + fetchURLQRCode( + setBlob, + (window.location.href ?? "unknown") + + "/?code=" + + props.lc?.meet_code + ); + }, [props.id]); + + useEffect(() => { + if (query.get("code")) { + const code = query.get("code"); + if (code) { + setMeetupCode(code); + } + } + }, [query]); const handleInterested = (e: any) => { e.preventDefault(); - if (props.lc?.is_lc_member) { + if ( + (props.lc?.is_lc_member || (props.lc?.is_started && meetupCode)) && + !props.lc?.joined_at + ) { joinMeetup(props.lc?.id ?? "").then(res => { props.setLc({ ...props.lc, @@ -82,8 +108,10 @@ const LcHistory = (props: Props) => { className={styles.meetupInfoTag} onClick={() => { navigator.clipboard.writeText( - window.location.href ?? - "NOTCOPIED" + (window.location.href ?? + "NOTCOPIED") + + "/?code=" + + props.lc?.meet_code ); toast.success("Link Copied"); }} @@ -110,6 +138,18 @@ const LcHistory = (props: Props) => {

)} + {props.lc.is_started && + props.lc.is_lc_member ? ( +
+ +

+ Share this QR Code for joining the + meet. +

+
+ ) : ( + <> + )} {

Venue:{" "} @@ -132,12 +172,20 @@ const LcHistory = (props: Props) => {

Agenda

{props.lc.agenda}

+ {props.lc.pre_requirements ? ( + <> +

Prerequisites

+

{props.lc.pre_requirements}

+ + ) : ( + <> + )}

Tasks

{props.lc.tasks.map((task, index) => (
{index + 1} - {task} + {task.title}
))}
@@ -150,6 +198,23 @@ const LcHistory = (props: Props) => {
) : null}
+ {props.lc.joined_at ? ( + { + e.preventDefault(); + navigate( + "/dashboard/learning-circle/meetup/" + + props.lc?.id + + "/attendee-report" + ); + }} + > + {props.lc.is_attendee_report_submitted + ? "Report Submitted" + : "Submit Report"} + + ) : null} { } disabled={props.lc.joined_at != null} > - {props.lc.is_lc_member - ? props.lc.is_started - ? "Join" - : "Join & Start meetup" - : props.lc.joined_at + {props.lc.joined_at ? "Joined" + : props.lc.is_started + ? props.lc.is_lc_member || meetupCode + ? "Join" + : "I'm Interested to Join" + : props.lc.is_lc_member + ? "Join & Start Meetup" : props.lc.is_interested - ? "Undo Interest" + ? "Undo Interested" : "I'm Interested Join"} diff --git a/src/modules/Dashboard/modules/LearningCircle/pages/LcDashboard/components/LcHome.tsx b/src/modules/Dashboard/modules/LearningCircle/pages/LcDashboard/components/LcHome.tsx index b2af21824..a8b0af1dd 100644 --- a/src/modules/Dashboard/modules/LearningCircle/pages/LcDashboard/components/LcHome.tsx +++ b/src/modules/Dashboard/modules/LearningCircle/pages/LcDashboard/components/LcHome.tsx @@ -23,6 +23,7 @@ type Props = { const LcHome = (props: Props) => { const [meetups, setMeetups] = useState([]); const [pastMeetups, setPastMeetups] = useState([]); + const [reportPending, setReportPending] = useState([]); const [selectedMeeting, setSelectedMeeting] = useState(""); useEffect(() => { getLcMeetups(props.id ?? "").then(res => { @@ -32,6 +33,7 @@ const LcHome = (props: Props) => { } else { setMeetups(res.meetups); setPastMeetups(res.past); + setReportPending(res.report_pending); } } }); @@ -257,55 +259,124 @@ const LcHome = (props: Props) => { {!props.temp.isSchedule && !props.temp.isTeam && !props.temp.isReport ? ( -
- {props.lc?.previous_meetings && - props.lc?.previous_meetings.length > 0 && ( -

Your past meetings

- )} -
- {pastMeetups.map((report, index) => ( -
{ - navigate( - "/dashboard/learning-circle/meetup/" + - report.id - ); - }} - > -
-

{index + 1}.

-

- {convertToFormatedDate( - report.meet_time - )} -

-
-
-

+ {(reportPending ?? []).length > 0 ? ( +

+

Pending Report Submissions

+
+ {reportPending.map((report, index) => ( +
- {convertToFormatedDate( - report.meet_time - )}{" "} - {convert24to12( - extract24hTimeFromDateTime( +
+

{index + 1}.

+

+ {convertToFormatedDate( + report.meet_time + )} +

+
+
+

+ {convertToFormatedDate( + report.meet_time + )}{" "} + {convert24to12( + extract24hTimeFromDateTime( + report.meet_time + ) + )} +

+ +
+
+ ))} +
+
+ ) : ( + <> + )} +
+ {props.lc?.previous_meetings && + props.lc?.previous_meetings.length > 0 && ( +

Your past meetings

+ )} +
+ {pastMeetups.map((report, index) => ( +
{ + navigate( + "/dashboard/learning-circle/meetup/" + + report.id + ); + }} + > +
+

{index + 1}.

+

+ {convertToFormatedDate( report.meet_time - ) - )} -

- + )} +

+
+
+

+ {convertToFormatedDate( + report.meet_time + )}{" "} + {convert24to12( + extract24hTimeFromDateTime( + report.meet_time + ) + )} +

+ +
-
- ))} + ))} +
-
+ ) : ( <> )} diff --git a/src/modules/Dashboard/modules/LearningCircle/pages/LcDashboard/components/LcMeetCreate.tsx b/src/modules/Dashboard/modules/LearningCircle/pages/LcDashboard/components/LcMeetCreate.tsx index 5bce1ad11..49888b147 100644 --- a/src/modules/Dashboard/modules/LearningCircle/pages/LcDashboard/components/LcMeetCreate.tsx +++ b/src/modules/Dashboard/modules/LearningCircle/pages/LcDashboard/components/LcMeetCreate.tsx @@ -16,7 +16,7 @@ type Props = { }; const LcMeetCreate = (props: Props) => { - const [tasks, setTasks] = useState([]); + const [tasks, setTasks] = useState([]); const taskInputRef = createRef(); const [isLoading, setIsLoading] = useState(false); const formik = useFormik({ @@ -147,7 +147,7 @@ const LcMeetCreate = (props: Props) => {
{index + 1}. -

{task}

+

{task.title}

{ {formik.values.need_pre_requirements && (