From bd4c0d272302ce1c8adb3f6d1aef00539a0ab928 Mon Sep 17 00:00:00 2001 From: Aswanth Vc Date: Sat, 16 Nov 2024 15:45:29 +0530 Subject: [PATCH 1/4] fix(onboarding): org type field to requried --- .../pages/Onboarding/CollegePage/CollegePage.tsx | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/modules/Common/Authentication/pages/Onboarding/CollegePage/CollegePage.tsx b/src/modules/Common/Authentication/pages/Onboarding/CollegePage/CollegePage.tsx index 2db7911b2..749b133e6 100644 --- a/src/modules/Common/Authentication/pages/Onboarding/CollegePage/CollegePage.tsx +++ b/src/modules/Common/Authentication/pages/Onboarding/CollegePage/CollegePage.tsx @@ -251,11 +251,7 @@ export default function CollegePage() { ...college_types.map(type => ({ value: type, label: type - })), - { - value: "Others", - label: "Others" - } + })) ] as any } name="org_type" @@ -266,6 +262,7 @@ export default function CollegePage() { onChange={(e: any) => { setSelectedOrgType(e.value); }} + required /> ) : null} {isCollege ? ( From d29443967401a53a9ba64ba23f41eee1469940c7 Mon Sep 17 00:00:00 2001 From: ansan johny Date: Sat, 16 Nov 2024 17:50:22 +0530 Subject: [PATCH 2/4] Feat:PathFinder --- package-lock.json | 4 +- src/App.tsx | 5 + .../PathFinder/PathFinder.module.css | 114 +++++++ .../Onboarding/PathFinder/PathFinder.tsx | 319 ++++++++++++++++++ 4 files changed, 440 insertions(+), 2 deletions(-) create mode 100644 src/modules/Common/Authentication/pages/Onboarding/PathFinder/PathFinder.module.css create mode 100644 src/modules/Common/Authentication/pages/Onboarding/PathFinder/PathFinder.tsx diff --git a/package-lock.json b/package-lock.json index 6bf4d846e..7b7be0a82 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "mulearnfrontend", - "version": "0.0.5", + "version": "0.0.6", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "mulearnfrontend", - "version": "0.0.5", + "version": "0.0.6", "dependencies": { "@chakra-ui/react": "^2.6.1", "@emotion/react": "^11.10.6", diff --git a/src/App.tsx b/src/App.tsx index 64f87a93e..5ed8e6153 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -58,6 +58,7 @@ import YourLC from "./modules/Dashboard/modules/LearningCircleV2/pages/YourLC/Yo import MoreInfoLC from "./modules/Dashboard/modules/LearningCircleV2/pages/moreInfoLC/MoreInfoLC"; import AttendeeReport from "./modules/Dashboard/modules/LearningCircleV2/pages/AttendeeReport/AttendeeReport"; import LCReport from "./modules/Dashboard/modules/LearningCircleV2/pages/LCReport/LCReport"; +import PathFinder from "./modules/Common/Authentication/pages/Onboarding/PathFinder/PathFinder"; const Profile = lazy( () => import("./modules/Dashboard/modules/Profile/pages/Profile") @@ -325,6 +326,10 @@ function App() { path: "/register/organization", element: }, + { + path: "/register/pathfinder", + element: + }, { path: "/signin", element: diff --git a/src/modules/Common/Authentication/pages/Onboarding/PathFinder/PathFinder.module.css b/src/modules/Common/Authentication/pages/Onboarding/PathFinder/PathFinder.module.css new file mode 100644 index 000000000..da3f4af1c --- /dev/null +++ b/src/modules/Common/Authentication/pages/Onboarding/PathFinder/PathFinder.module.css @@ -0,0 +1,114 @@ +.pathFinderContainer { + width: 80%; + margin: 0 auto; + padding: 20px; + background-color: #f9f9f9; + border-radius: 8px; + box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1); +} + +.pathFinderContainer h1 { + text-align: center; + font-size: 2rem; + margin-bottom: 20px; +} + +.pathFinderContainer p { + font-size: 1rem; + margin-bottom: 20px; +} + +.pathFinderContainer .question-box { + padding: 20px; + background-color: #fff; + border-radius: 8px; + box-shadow: 0 2px 10px rgba(0, 0, 0, 0.05); +} + +.pathFinderContainer .question-no { + font-weight: bold; + color: #333; +} + +.pathFinderContainer h4 { + font-size: 1.25rem; + margin-top: 20px; +} + +.pathFinderContainer .options-table { + width: 100%; + margin-top: 10px; +} + +.pathFinderContainer .options-table td { + padding: 10px 0; + font-size: 1rem; +} + +.pathFinderContainer input[type="checkbox"] { + margin-right: 10px; +} + +.pathFinderContainer .button-container { + display: flex; + justify-content: space-between; /* Aligns buttons to left and right */ + margin-top: 20px; +} + +.pathFinderContainer button.prev { + background-color: #ddd; + color: #333; + padding: 10px 20px; + border: none; + border-radius: 5px; +} + +.pathFinderContainer button.prev:hover { + background-color: #ccc; +} + +.pathFinderContainer button.next { + background-color: #007bff; + color: #fff; + padding: 10px 20px; + border: none; + border-radius: 5px; +} + +.pathFinderContainer button.next:hover { + background-color: #0056b3; +} + +.pathFinderContainer .result-box { + padding: 20px; + background-color: #fff; + border-radius: 8px; + box-shadow: 0 2px 10px rgba(0, 0, 0, 0.05); +} + +.pathFinderContainer .bold-text { + font-weight: bold; + font-size: 1.5rem; + color: #007bff; +} + +.pathFinderContainer .result-heading { + margin-top: 20px; + font-size: 1.25rem; + font-weight: bold; +} + +.pathFinderContainer hr { + margin: 20px 0; + border-top: 2px solid #007bff; +} + +.pathFinderContainer strong { + font-weight: bold; +} + +.pathFinderContainer span { + font-size: 1.25rem; + margin-left: 10px; + color: #333; +} diff --git a/src/modules/Common/Authentication/pages/Onboarding/PathFinder/PathFinder.tsx b/src/modules/Common/Authentication/pages/Onboarding/PathFinder/PathFinder.tsx new file mode 100644 index 000000000..457e541b9 --- /dev/null +++ b/src/modules/Common/Authentication/pages/Onboarding/PathFinder/PathFinder.tsx @@ -0,0 +1,319 @@ +import React, { useState, useEffect } from "react"; +import OnboardingTemplate from "../../../components/OnboardingTeamplate/OnboardingTemplate"; +import styles from "./PathFinder.module.css"; +import { PowerfulButton } from "@/MuLearnComponents/MuButtons/MuButton"; +import { Button } from "@chakra-ui/react"; + +interface Question { + question: string; + options: { text: string; category: string }[]; +} + +const originalQuestions: Question[] = [ + { + question: "What kind of activities do you enjoy the most?", + options: [ + { + text: "Building or crafting physical projects and experimenting with new materials.", + category: "A" + }, + { + text: "Coding and creating software solutions or working with technology.", + category: "B" + }, + { + text: "Designing visual elements, user interfaces, or developing creative content.", + category: "C" + }, + { + text: "Managing projects, understanding market needs, or exploring new knowledge areas.", + category: "D" + } + ] + }, + { + question: "Which of the following skills do you want to improve or develop?", + options: [ + { + text: "Robotics, 3D printing, or IoT-based projects.", + category: "A" + }, + { + text: "Programming, debugging, or developing new applications and algorithms.", + category: "B" + }, + { + text: "Visual communication, UX/UI design, or multimedia creation.", + category: "C" + }, + { + text: "Leadership, marketing, research, or analysis skills.", + category: "D" + } + ] + }, + { + question: "How do you approach problem-solving?", + options: [ + { + text: "By physically experimenting, creating prototypes, and iterating based on testing.", + category: "A" + }, + { + text: "By writing code, creating logical solutions, and troubleshooting issues.", + category: "B" + }, + { + text: "By brainstorming creative approaches, sketching, or creating visual solutions.", + category: "C" + }, + { + text: "By analyzing the problem holistically, researching, and planning solutions with strategic thinking.", + category: "D" + } + ] + }, + { + question: "Which tools or resources are you most interested in using or learning?", + options: [ + { + text: "Electronic components, fabrication tools, robotics kits.", + category: "A" + }, + { + text: "Programming languages, development frameworks, software tools.", + category: "B" + }, + { + text: "Graphic design tools, wireframing software, creative suites.", + category: "C" + }, + { + text: "Business models, research papers, management tools, or policy frameworks.", + category: "D" + } + ] + }, + { + question: "What kind of project excites you the most?", + options: [ + { + text: "Creating a new physical device, electronic gadget, or automated system.", + category: "A" + }, + { + text: "Developing an app, creating a software tool, or building a machine learning model.", + category: "B" + }, + { + text: "Designing a logo, improving a website’s user experience, or making digital illustrations.", + category: "C" + }, + { + text: "Organizing an event, analyzing data trends, developing a new business idea.", + category: "D" + } + ] + }, + { + question: "Which statement resonates most with your aspirations?", + options: [ + { + text: "I want to bring my ideas to life by building things with my hands.", + category: "A" + }, + { + text: "I want to create impactful digital solutions and applications.", + category: "B" + }, + { + text: "I want to communicate stories and ideas through design and visuals.", + category: "C" + }, + { + text: "I want to lead, strategize, and innovate to solve broader problems.", + category: "D" + } + ] + }, + { + question: "In a team project, you usually prefer to:", + options: [ + { + text: "Take the lead in building and assembling the project.", + category: "A" + }, + { + text: "Handle the technical aspects and coding of the project.", + category: "B" + }, + { + text: "Focus on the design and presentation of the project.", + category: "C" + }, + { + text: "Organize the project, plan timelines, and ensure communication.", + category: "D" + } + ] + }, + { + question: "What motivates you the most?", + options: [ + { + text: "The thrill of creating something tangible and functional.", + category: "A" + }, + { + text: "Solving complex problems and coding challenges.", + category: "B" + }, + { + text: "Creating visually appealing designs that communicate effectively.", + category: "C" + }, + { + text: "Leading a team to success and achieving strategic goals.", + category: "D" + } + ] + } +]; + +// Function to shuffle questions randomly +const shuffleQuestions = (questions: Question[]): Question[] => { + const shuffled = [...questions]; + for (let i = shuffled.length - 1; i > 0; i--) { + const j = Math.floor(Math.random() * (i + 1)); + [shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]]; + } + return shuffled; +}; + +const PathFinder: React.FC = () => { + const [currentQuestionIndex, setCurrentQuestionIndex] = useState(0); + const [scores, setScores] = useState>( + { + A: 0, + B: 0, + C: 0, + D: 0 + } + ); + const [selectedOptions, setSelectedOptions] = useState>({}); + const [showResults, setShowResults] = useState(false); + const [questions, setQuestions] = useState([]); + + useEffect(() => { + // Shuffle questions whenever the component is loaded + setQuestions(shuffleQuestions(originalQuestions)); + }, []); + + const handleNextQuestion = () => { + if (!selectedOptions[currentQuestionIndex] || selectedOptions[currentQuestionIndex].length === 0) { + alert("Please select at least one option to proceed."); + return; + } + + const updatedScores = { ...scores }; + selectedOptions[currentQuestionIndex].forEach(category => { + updatedScores[category as "A" | "B" | "C" | "D"] += 1; + }); + setScores(updatedScores); + + if (currentQuestionIndex + 1 < questions.length) { + setCurrentQuestionIndex(currentQuestionIndex + 1); + } else { + setShowResults(true); + } + }; + + const handlePrevQuestion = () => { + if (currentQuestionIndex > 0) { + setCurrentQuestionIndex(currentQuestionIndex - 1); + } + }; + + const handleOptionChange = (category: string) => { + setSelectedOptions(prevSelectedOptions => { + const updatedOptions = [...(prevSelectedOptions[currentQuestionIndex] || [])]; + if (updatedOptions.includes(category)) { + const index = updatedOptions.indexOf(category); + updatedOptions.splice(index, 1); // Remove category + } else { + updatedOptions.push(category); // Add category + } + return { + ...prevSelectedOptions, + [currentQuestionIndex]: updatedOptions + }; + }); + }; + + const getRecommendedPathway = () => { + const maxScore = Math.max(scores.A, scores.B, scores.C, scores.D); + if (scores.A === maxScore) return "Maker"; + if (scores.B === maxScore) return "Coder"; + if (scores.C === maxScore) return "Designer"; + return "Others"; + }; + + return ( + +
+

Pathway Identification Questionnaire

+

+ Instructions: For each question, select the options that + best describe you. +

+ + {!showResults ? ( +
+

+ Question No: {currentQuestionIndex + 1} /{" "} + {questions.length} +

+ {questions[currentQuestionIndex] && ( + <> +

+ {questions[currentQuestionIndex].question} +

+ + + {questions[currentQuestionIndex].options.map((option, index) => ( + + + + ))} + +
+ +
+ +
+ + +
+ + )} +
+ ) : ( +
+

Your Recommended Pathway: {getRecommendedPathway()}

+
+ )} +
+
+ ); +}; + +export default PathFinder; From 9e5c2b881f47b0fa8263a2e7404bbb112dd1d4bb Mon Sep 17 00:00:00 2001 From: Aswanth Vc Date: Sun, 17 Nov 2024 13:15:52 +0530 Subject: [PATCH 3/4] feat: org --- src/App.tsx | 10 +- .../Common/Authentication/assets/explore.png | Bin 0 -> 34387 bytes .../Common/Authentication/assets/quiz.png | Bin 0 -> 30415 bytes .../AccountCreationComponent.module.css} | 0 .../AccountCreationComponent.tsx} | 186 +++------ .../PathFinder/PathFinderComponent.module.css | 264 +++++++++++++ .../PathFinder/PathFinderComponent.tsx | 248 ++++++++++++ .../components/PathFinder/questions.ts | 172 ++++++++ .../UserInterestComponent.module.css} | 0 .../UserInterest/UserInterestComponent.tsx | 312 +++++++++++++++ .../PathFinder/PathFinder.module.css | 114 ------ .../Onboarding/PathFinder/PathFinder.tsx | 323 +-------------- .../pages/Onboarding/Register/Register.tsx | 111 ++++++ .../Onboarding/UserInterest/UserInterest.tsx | 368 +++--------------- .../pages/Onboarding/constants.ts | 21 + .../pages/Onboarding/onboarding.d.ts | 38 ++ 16 files changed, 1300 insertions(+), 867 deletions(-) create mode 100644 src/modules/Common/Authentication/assets/explore.png create mode 100644 src/modules/Common/Authentication/assets/quiz.png rename src/modules/Common/Authentication/{pages/Onboarding/AccountCreation/AccountCreation.module.css => components/AccountCreation/AccountCreationComponent.module.css} (100%) rename src/modules/Common/Authentication/{pages/Onboarding/AccountCreation/AccountCreation.tsx => components/AccountCreation/AccountCreationComponent.tsx} (76%) create mode 100644 src/modules/Common/Authentication/components/PathFinder/PathFinderComponent.module.css create mode 100644 src/modules/Common/Authentication/components/PathFinder/PathFinderComponent.tsx create mode 100644 src/modules/Common/Authentication/components/PathFinder/questions.ts rename src/modules/Common/Authentication/{pages/Onboarding/UserInterest/UserInterest.module.css => components/UserInterest/UserInterestComponent.module.css} (100%) create mode 100644 src/modules/Common/Authentication/components/UserInterest/UserInterestComponent.tsx delete mode 100644 src/modules/Common/Authentication/pages/Onboarding/PathFinder/PathFinder.module.css create mode 100644 src/modules/Common/Authentication/pages/Onboarding/Register/Register.tsx create mode 100644 src/modules/Common/Authentication/pages/Onboarding/constants.ts create mode 100644 src/modules/Common/Authentication/pages/Onboarding/onboarding.d.ts diff --git a/src/App.tsx b/src/App.tsx index 5ed8e6153..7e0485555 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -17,10 +17,8 @@ import { CampusStudentList, ConnectDiscord } from "./modules/Dashboard/modules"; import LandingPage from "./modules/Public/LearningCircles/pages/LandingPage"; import ProfileV2 from "./modules/Dashboard/modules/ProfileV2/pages/Profile"; -import AccountCreation from "./modules/Common/Authentication/pages/Onboarding/AccountCreation/AccountCreation"; import Rolepage from "./modules/Common/Authentication/pages/Onboarding/RolePage/RolePage"; import CollegePage from "./modules/Common/Authentication/pages/Onboarding/CollegePage/CollegePage"; -import CompanyPage from "./modules/Common/Authentication/pages/Onboarding/CompanyPage/CompanyPage"; import SignIn from "./modules/Common/Authentication/pages/Onboarding/SignIn/SignIn"; import ErrorLog from "./modules/Dashboard/modules/ErrorLog/ErrorLog"; @@ -43,7 +41,6 @@ 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"; 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"; @@ -58,7 +55,9 @@ import YourLC from "./modules/Dashboard/modules/LearningCircleV2/pages/YourLC/Yo import MoreInfoLC from "./modules/Dashboard/modules/LearningCircleV2/pages/moreInfoLC/MoreInfoLC"; import AttendeeReport from "./modules/Dashboard/modules/LearningCircleV2/pages/AttendeeReport/AttendeeReport"; import LCReport from "./modules/Dashboard/modules/LearningCircleV2/pages/LCReport/LCReport"; +import UserInterest from "./modules/Common/Authentication/pages/Onboarding/UserInterest/UserInterest"; import PathFinder from "./modules/Common/Authentication/pages/Onboarding/PathFinder/PathFinder"; +import RegisterPage from "./modules/Common/Authentication/pages/Onboarding/Register/Register"; const Profile = lazy( () => import("./modules/Dashboard/modules/Profile/pages/Profile") @@ -302,17 +301,16 @@ function App() { path: "/", element: , children: [ - { path: "register/:role", element: }, + { path: "register/:role", element: }, { path: "register/", children: [ { path: "", - element: + element: } ] }, - { path: "login", element: }, { path: "forgot-password", element: }, { path: "reset-password", element: } diff --git a/src/modules/Common/Authentication/assets/explore.png b/src/modules/Common/Authentication/assets/explore.png new file mode 100644 index 0000000000000000000000000000000000000000..e4fdb6b941a5cbc883ede6cb8d023c4e3fb04da8 GIT binary patch literal 34387 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 QEWHED3L5eivZjIm4-iTiga7~l literal 0 HcmV?d00001 diff --git a/src/modules/Common/Authentication/pages/Onboarding/AccountCreation/AccountCreation.module.css b/src/modules/Common/Authentication/components/AccountCreation/AccountCreationComponent.module.css similarity index 100% rename from src/modules/Common/Authentication/pages/Onboarding/AccountCreation/AccountCreation.module.css rename to src/modules/Common/Authentication/components/AccountCreation/AccountCreationComponent.module.css diff --git a/src/modules/Common/Authentication/pages/Onboarding/AccountCreation/AccountCreation.tsx b/src/modules/Common/Authentication/components/AccountCreation/AccountCreationComponent.tsx similarity index 76% rename from src/modules/Common/Authentication/pages/Onboarding/AccountCreation/AccountCreation.tsx rename to src/modules/Common/Authentication/components/AccountCreation/AccountCreationComponent.tsx index 4e07133c0..e1e88294f 100644 --- a/src/modules/Common/Authentication/pages/Onboarding/AccountCreation/AccountCreation.tsx +++ b/src/modules/Common/Authentication/components/AccountCreation/AccountCreationComponent.tsx @@ -1,46 +1,29 @@ -import styles from "./AccountCreation.module.css"; -import { HiEye, HiEyeSlash } from "react-icons/hi2"; - -import OnboardingTemplate from "../../../components/OnboardingTeamplate/OnboardingTemplate"; -import OnboardingHeader from "../../../components/OnboardingHeader/OnboardingHeader"; -import { getDWMSDetails } from "../../../services/newOnboardingApis"; +import OnboardingHeader from "../OnboardingHeader/OnboardingHeader"; +import OnboardingTemplate from "../OnboardingTeamplate/OnboardingTemplate"; +import { Dispatch, SetStateAction, useEffect, useState } from "react"; import { Form, Formik } from "formik"; +import { isDev } from "@/MuLearnServices/common_functions"; import * as z from "yup"; +import styles from "./AccountCreationComponent.module.css"; import { FormikTextInputWithoutLabel as SimpleInput } from "@/MuLearnComponents/FormikComponents/FormikComponents"; -import { PowerfulButton } from "@/MuLearnComponents/MuButtons/MuButton"; -import { useEffect, useState } from "react"; - -import { useNavigate, useParams } from "react-router-dom"; -import makeAnimated from "react-select/animated"; +import { HiEye } from "react-icons/hi"; +import { HiEyeSlash } from "react-icons/hi2"; import { BiSupport } from "react-icons/bi"; -import { isDev } from "@/MuLearnServices/common_functions"; -import { submitUserData } from "../../../services/newOnboardingApis"; +import { PowerfulButton } from "@/MuLearnComponents/MuButtons/MuButton"; +import { getDWMSDetails } from "../../services/newOnboardingApis"; import toast from "react-hot-toast"; -type DWMSData = { - email: string; - fullName: string; - phoneNumber: string; - gender?: string; - dob?: string; -}; - const scheme = z.object({ email: z .string() .required(`Email is Required`) .min(5, `Email must be at least 3 characters`) .max(100, `Email must be at most 100 characters`), - fullName: z + full_name: z .string() .required(`Full Name is Required`) .min(3, `Full Name must be at least 3 characters`) .max(100, `Full Name must be at most 100 characters`), - // phoneNumber: z - // .string() - // .required(`Phone number is Required`) - // .min(10, `Phone number must be at least 10 characters`) - // .max(10, `Phone number must be at most 10 characters`), ...(isDev() ? { password: z.string().required(`Password is Required`) @@ -52,51 +35,62 @@ const scheme = z.object({ .min(8, `Password must be at least 8 characters`) .max(100, `Password must be at most 100 characters`) }) - // confirmPassword: z - // .string() - // .required(`Password is Required`) - // .test( - // "passwords-match", - // "Passwords are not matching", - // function (value) { - // return this.parent.password === value; - // } - // ) }); -export default function AccountCreation() { - let { role } = useParams(); - const navigate = useNavigate(); - const urlParams = new URLSearchParams(window.location.search); - const param = urlParams.get("param"); - const referralId = urlParams.get("referral_id"); - - const [isLoading, setIsLoading] = useState(false); - const [isVisible, setVisible] = useState(false); - const [dwmsData, setDWMSData] = useState(); - - const [isTncChecked, setTncChecked] = useState(false); - - const [initialValues, setInitialValues] = useState({ +export default function AccountCreationComponent({ + ruri, + isLoading, + setIsLoading, + dwmsParam, + refferalId, + onContinue +}: { + ruri?: string; + isLoading: boolean; + setIsLoading: Dispatch>; + dwmsParam?: string; + refferalId?: string; + onContinue: (data: RegisterRequestDataType) => void; +}) { + const [initialValues, setInitialValues] = useState({ + full_name: "", email: "", - fullName: "", - password: "", - role: "", - muid: "", - communities: [] + password: "" }); - const ruri = window.location.href.split("=")[1]; + const [dwmsData, setDWMSData] = useState(); + const [isVisible, setVisible] = useState(false); + const [isTncChecked, setTncChecked] = useState(false); - role = - role === "student" || role === "mentor" || role === "enabler" - ? role - : "other"; + const onSubmit = (values: any) => { + if (!isTncChecked) { + toast.error("Please accept the terms and conditions"); + return; + } + const userData: RegisterRequestDataType = { + user: { + full_name: values.full_name, + email: values.email, + password: values.password + }, + interests: { + choosen_interests: [], + choosen_endgoals: [], + other_interests: [], + other_endgoals: [] + }, + integration: dwmsParam + ? { param: dwmsParam, title: "DWMS" } + : undefined, + referral: refferalId ? { muid: refferalId } : undefined + }; + onContinue(userData); + }; useEffect(() => { if (isLoading) return; setIsLoading(true); - if (param) { - getDWMSDetails(param, (data: any) => { + if (dwmsParam) { + getDWMSDetails(dwmsParam, (data: any) => { setDWMSData({ email: data?.email_id || "", fullName: @@ -110,10 +104,9 @@ export default function AccountCreation() { setInitialValues({ ...initialValues, email: data?.email_id || "", - fullName: + full_name: data?.job_seeker_fname + " " + data?.job_seeker_lname || "" - // phoneNumber: data?.mobile_no || "" }); }); } @@ -121,63 +114,6 @@ export default function AccountCreation() { setIsLoading(false); }, []); - const onsubmit = async (values: any, actions: any) => { - if (!isTncChecked) { - toast.error("Please accept the terms and conditions"); - return; - } - const userData: { - user: { - full_name: any; - email: any; - password: any; - }; - role?: string; - referral?: { muid: string }; - gender?: string; - dob?: string; - communities?: string[]; - integration?: { - param: string; - title: string; - }; - } = { - user: { - full_name: values.fullName, - email: values.email, - password: values.password - } - }; - - if (dwmsData && dwmsData.gender) { - userData.gender = dwmsData.gender; - } - - if (param) { - userData.integration = { - param: param, - title: "DWMS" - }; - } - - if (dwmsData && dwmsData.dob) { - userData.dob = dwmsData.dob; - } - - submitUserData({ - setIsLoading: setIsLoading, - userData: userData - }).then(res => { - if (res) { - navigate( - ruri - ? `/register/interests/?ruri=${ruri}` - : "/register/interests" - ); - } - }); - }; - return ( {formik => (
@@ -221,12 +157,12 @@ export default function AccountCreation() {
{ + const shuffled = [...questions]; + for (let i = shuffled.length - 1; i > 0; i--) { + const j = Math.floor(Math.random() * (i + 1)); + [shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]]; + } + return shuffled; +}; + +export default function PathFinderComponent({ + onContinue +}: { + onContinue: (interests: string[]) => void; +}) { + const [currentQuestionIndex, setCurrentQuestionIndex] = useState(-1); + const [scores, setScores] = useState>( + { + A: 0, + B: 0, + C: 0, + D: 0 + } + ); + const [selectedOptions, setSelectedOptions] = useState< + Record + >({}); + const [questions, setQuestions] = useState([]); + const navigate = useNavigate(); + const [searchParams, setSearchParams] = useSearchParams(); + const ruri = searchParams.get("ruri"); + useEffect(() => { + setQuestions(shuffleQuestions(originalQuestions)); + }, []); + const location = useLocation(); + + const handleNextQuestion = () => { + const updatedScores = { ...scores }; + (selectedOptions[currentQuestionIndex] ?? []).forEach(category => { + updatedScores[category as "A" | "B" | "C" | "D"] += 1; + }); + setScores(updatedScores); + + if (currentQuestionIndex + 1 < questions.length) { + setCurrentQuestionIndex(currentQuestionIndex + 1); + } else { + console.log("getRecommendedPathways", getRecommendedPathways()); + onContinue(getRecommendedPathways()); + } + }; + + const handlePrevQuestion = () => { + if (currentQuestionIndex > 0) { + setCurrentQuestionIndex(currentQuestionIndex - 1); + } + }; + + const handleOptionChange = (category: string) => { + setSelectedOptions(prevSelectedOptions => { + const updatedOptions = [ + ...(prevSelectedOptions[currentQuestionIndex] || []) + ]; + if (updatedOptions.includes(category)) { + const index = updatedOptions.indexOf(category); + updatedOptions.splice(index, 1); // Remove category + } else { + updatedOptions.push(category); // Add category + } + return { + ...prevSelectedOptions, + [currentQuestionIndex]: updatedOptions + }; + }); + }; + + const getRecommendedPathways = () => { + const pathways = []; + if (scores.A > 2) pathways.push("hardware"); + if (scores.B > 2) pathways.push("coder"); + if (scores.C > 2) pathways.push("creative"); + if (scores.D > 2) pathways.push("others"); + return pathways; + }; + + return ( + +
+ {currentQuestionIndex < 0 ? ( +
+
+ navigate( + ruri + ? "/register/interests?ruri=" + ruri + : "/register/interests?ruri=noredirect" + ) + } + > + Explore +

Know what your interest is?

+ Get started by selecting your interests + + Select Interests + +
+
setCurrentQuestionIndex(0)} + > + Quiz +

Not sure what to choose?

+ + Take a quick quiz to find out what interests you + + + Start Quiz + +
+
+ ) : ( +
+ {questions[currentQuestionIndex] && ( + <> + + Question {currentQuestionIndex + 1} of{" "} + {questions.length} + + +

+ {questions[currentQuestionIndex].question} +

+ + + {questions[ + currentQuestionIndex + ].options.map((option, index) => ( + + handleOptionChange( + option.category + ) + } + > + + + ))} + +
+ + handleOptionChange( + option.category + ) + } + /> + {option.text} +
+ +
+ {/* + Skip + */} + + {!selectedOptions[ + currentQuestionIndex + ] || + selectedOptions[currentQuestionIndex] + .length === 0 + ? "Skip" + : currentQuestionIndex + 1 < + questions.length + ? "Continue" + : "Find your interest"}{" "} + {currentQuestionIndex + 1 < + questions.length ? ( + + ) : ( + + )} + +
+ + )} +
+ )} +
+
+ ); +} diff --git a/src/modules/Common/Authentication/components/PathFinder/questions.ts b/src/modules/Common/Authentication/components/PathFinder/questions.ts new file mode 100644 index 000000000..9088f62d4 --- /dev/null +++ b/src/modules/Common/Authentication/components/PathFinder/questions.ts @@ -0,0 +1,172 @@ +export const originalQuestions: Question[] = [ + { + question: "What kind of activities do you enjoy the most?", + options: [ + { + text: "Building or crafting physical projects and experimenting with new materials.", + category: "A" + }, + { + text: "Coding and creating software solutions or working with technology.", + category: "B" + }, + { + text: "Designing visual elements, user interfaces, or developing creative content.", + category: "C" + }, + { + text: "Managing projects, understanding market needs, or exploring new knowledge areas.", + category: "D" + } + ] + }, + { + question: + "Which of the following skills do you want to improve or develop?", + options: [ + { + text: "Robotics, 3D printing, or IoT-based projects.", + category: "A" + }, + { + text: "Programming, debugging, or developing new applications and algorithms.", + category: "B" + }, + { + text: "Visual communication, UX/UI design, or multimedia creation.", + category: "C" + }, + { + text: "Leadership, marketing, research, or analysis skills.", + category: "D" + } + ] + }, + { + question: "How do you approach problem-solving?", + options: [ + { + text: "By physically experimenting, creating prototypes, and iterating based on testing.", + category: "A" + }, + { + text: "By writing code, creating logical solutions, and troubleshooting issues.", + category: "B" + }, + { + text: "By brainstorming creative approaches, sketching, or creating visual solutions.", + category: "C" + }, + { + text: "By analyzing the problem holistically, researching, and planning solutions with strategic thinking.", + category: "D" + } + ] + }, + { + question: + "Which tools or resources are you most interested in using or learning?", + options: [ + { + text: "Electronic components, fabrication tools, robotics kits.", + category: "A" + }, + { + text: "Programming languages, development frameworks, software tools.", + category: "B" + }, + { + text: "Graphic design tools, wireframing software, creative suites.", + category: "C" + }, + { + text: "Business models, research papers, management tools, or policy frameworks.", + category: "D" + } + ] + }, + { + question: "What kind of project excites you the most?", + options: [ + { + text: "Creating a new physical device, electronic gadget, or automated system.", + category: "A" + }, + { + text: "Developing an app, creating a software tool, or building a machine learning model.", + category: "B" + }, + { + text: "Designing a logo, improving a website’s user experience, or making digital illustrations.", + category: "C" + }, + { + text: "Organizing an event, analyzing data trends, developing a new business idea.", + category: "D" + } + ] + }, + { + question: "Which statement resonates most with your aspirations?", + options: [ + { + text: "I want to bring my ideas to life by building things with my hands.", + category: "A" + }, + { + text: "I want to create impactful digital solutions and applications.", + category: "B" + }, + { + text: "I want to communicate stories and ideas through design and visuals.", + category: "C" + }, + { + text: "I want to lead, strategize, and innovate to solve broader problems.", + category: "D" + } + ] + }, + { + question: "In a team project, you usually prefer to:", + options: [ + { + text: "Take the lead in building and assembling the project.", + category: "A" + }, + { + text: "Handle the technical aspects and coding of the project.", + category: "B" + }, + { + text: "Focus on the design and presentation of the project.", + category: "C" + }, + { + text: "Organize the project, plan timelines, and ensure communication.", + category: "D" + } + ] + }, + { + question: "What motivates you the most?", + options: [ + { + text: "The thrill of creating something tangible and functional.", + category: "A" + }, + { + text: "Solving complex problems and coding challenges.", + category: "B" + }, + { + text: "Creating visually appealing designs that communicate effectively.", + category: "C" + }, + { + text: "Leading a team to success and achieving strategic goals.", + category: "D" + } + ] + } +]; diff --git a/src/modules/Common/Authentication/pages/Onboarding/UserInterest/UserInterest.module.css b/src/modules/Common/Authentication/components/UserInterest/UserInterestComponent.module.css similarity index 100% rename from src/modules/Common/Authentication/pages/Onboarding/UserInterest/UserInterest.module.css rename to src/modules/Common/Authentication/components/UserInterest/UserInterestComponent.module.css diff --git a/src/modules/Common/Authentication/components/UserInterest/UserInterestComponent.tsx b/src/modules/Common/Authentication/components/UserInterest/UserInterestComponent.tsx new file mode 100644 index 000000000..a7d6934a8 --- /dev/null +++ b/src/modules/Common/Authentication/components/UserInterest/UserInterestComponent.tsx @@ -0,0 +1,312 @@ +import { useEffect, useState, useCallback } from "react"; +import { + Link, + useLocation, + useNavigate, + useSearchParams +} from "react-router-dom"; +import { TagsInput } from "react-tag-input-component"; +import { PowerfulButton } from "@/MuLearnComponents/MuButtons/MuButton"; +import { privateGateway, publicGateway } from "@/MuLearnServices/apiGateways"; +import { onboardingRoutes } from "@/MuLearnServices/urls"; + +import styles from "./UserInterestComponent.module.css"; +import muBrand from "/src/modules/Common/Authentication/assets/µLearn.png"; +import OnboardingTemplate from "../OnboardingTeamplate/OnboardingTemplate"; +import creative from "/src/modules/Common/Authentication/assets/interests/creative.svg"; +import maker from "/src/modules/Common/Authentication/assets/interests/makers.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 = () => ( + + + +); + +type InterestGroup = { + id: string; + name: string; + category: string; +}; + +type InterestGroups = { + [key: string]: InterestGroup[]; +}; + +const INITIAL_INTERESTS = [ + { 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: "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 } +]; + +export default function UserInterestSelectionComponent({ + onContinue +}: { + onContinue: (data: RegisterInterestData) => void; +}) { + const [stepTwo, setStepTwo] = useState(false); + const [interestGroups, setInterestGroups] = useState({}); + const navigate = useNavigate(); + const [otherInterest, setOtherInterest] = useState([]); + const [otherEndgoal, setOtherEndgoal] = useState([]); + const [interests, setInterests] = useState(INITIAL_INTERESTS); + const [endgoals, setEndgoals] = useState(INITIAL_ENDGOALS); + const [searchParams, setSearchParams] = useSearchParams(); + const defaultInterests = searchParams.get("interests")?.split(",") ?? []; + const defaultEndgoals = searchParams.get("endgoals")?.split(",") ?? []; + + 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 + ) + }), + {} + ); + + setInterestGroups(interestGroupsData); + } catch (err) { + console.error("Failed to fetch interest groups:", err); + } + }; + + fetchInterestGroups(); + }, []); + + useEffect(() => { + setInterests( + interests.map(i => ({ + ...i, + checked: defaultInterests.includes(i.value) + })) + ); + + setEndgoals( + endgoals.map(e => ({ + ...e, + checked: defaultEndgoals.includes(e.value) + })) + ); + }, []); + + 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 = () => { + onContinue({ + choosen_interests: interests + .filter(i => i.checked) + .map(i => i.value), + choosen_endgoals: endgoals.filter(e => e.checked).map(e => e.value), + other_interests: otherInterest, + other_endgoals: otherEndgoal + }); + }; + + 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} +
  • + ) + )} +
+
+ + )} + {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={[","]} + /> +
+ )} +
+ ); + })} +
+ ), + [handleChange, interestGroups, otherInterest, otherEndgoal] + ); + + return ( + + {/* */} +
+
+ mulearn +

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

+

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

+ + {stepTwo + ? renderItems(endgoals, false) + : renderItems(interests, true)} + + {(stepTwo ? isEndgoalSelected : isInterestSelected) && ( + + Continue + + )} +
+
+
+ ); +} diff --git a/src/modules/Common/Authentication/pages/Onboarding/PathFinder/PathFinder.module.css b/src/modules/Common/Authentication/pages/Onboarding/PathFinder/PathFinder.module.css deleted file mode 100644 index da3f4af1c..000000000 --- a/src/modules/Common/Authentication/pages/Onboarding/PathFinder/PathFinder.module.css +++ /dev/null @@ -1,114 +0,0 @@ -.pathFinderContainer { - width: 80%; - margin: 0 auto; - padding: 20px; - background-color: #f9f9f9; - border-radius: 8px; - box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1); -} - -.pathFinderContainer h1 { - text-align: center; - font-size: 2rem; - margin-bottom: 20px; -} - -.pathFinderContainer p { - font-size: 1rem; - margin-bottom: 20px; -} - -.pathFinderContainer .question-box { - padding: 20px; - background-color: #fff; - border-radius: 8px; - box-shadow: 0 2px 10px rgba(0, 0, 0, 0.05); -} - -.pathFinderContainer .question-no { - font-weight: bold; - color: #333; -} - -.pathFinderContainer h4 { - font-size: 1.25rem; - margin-top: 20px; -} - -.pathFinderContainer .options-table { - width: 100%; - margin-top: 10px; -} - -.pathFinderContainer .options-table td { - padding: 10px 0; - font-size: 1rem; -} - -.pathFinderContainer input[type="checkbox"] { - margin-right: 10px; -} - -.pathFinderContainer .button-container { - display: flex; - justify-content: space-between; /* Aligns buttons to left and right */ - margin-top: 20px; -} - -.pathFinderContainer button.prev { - background-color: #ddd; - color: #333; - padding: 10px 20px; - border: none; - border-radius: 5px; -} - -.pathFinderContainer button.prev:hover { - background-color: #ccc; -} - -.pathFinderContainer button.next { - background-color: #007bff; - color: #fff; - padding: 10px 20px; - border: none; - border-radius: 5px; -} - -.pathFinderContainer button.next:hover { - background-color: #0056b3; -} - -.pathFinderContainer .result-box { - padding: 20px; - background-color: #fff; - border-radius: 8px; - box-shadow: 0 2px 10px rgba(0, 0, 0, 0.05); -} - -.pathFinderContainer .bold-text { - font-weight: bold; - font-size: 1.5rem; - color: #007bff; -} - -.pathFinderContainer .result-heading { - margin-top: 20px; - font-size: 1.25rem; - font-weight: bold; -} - -.pathFinderContainer hr { - margin: 20px 0; - border-top: 2px solid #007bff; -} - -.pathFinderContainer strong { - font-weight: bold; -} - -.pathFinderContainer span { - font-size: 1.25rem; - margin-left: 10px; - color: #333; -} diff --git a/src/modules/Common/Authentication/pages/Onboarding/PathFinder/PathFinder.tsx b/src/modules/Common/Authentication/pages/Onboarding/PathFinder/PathFinder.tsx index 457e541b9..06fbbc891 100644 --- a/src/modules/Common/Authentication/pages/Onboarding/PathFinder/PathFinder.tsx +++ b/src/modules/Common/Authentication/pages/Onboarding/PathFinder/PathFinder.tsx @@ -1,319 +1,8 @@ -import React, { useState, useEffect } from "react"; -import OnboardingTemplate from "../../../components/OnboardingTeamplate/OnboardingTemplate"; -import styles from "./PathFinder.module.css"; -import { PowerfulButton } from "@/MuLearnComponents/MuButtons/MuButton"; -import { Button } from "@chakra-ui/react"; +import PathFinderComponent from "../../../components/PathFinder/PathFinderComponent"; -interface Question { - question: string; - options: { text: string; category: string }[]; -} - -const originalQuestions: Question[] = [ - { - question: "What kind of activities do you enjoy the most?", - options: [ - { - text: "Building or crafting physical projects and experimenting with new materials.", - category: "A" - }, - { - text: "Coding and creating software solutions or working with technology.", - category: "B" - }, - { - text: "Designing visual elements, user interfaces, or developing creative content.", - category: "C" - }, - { - text: "Managing projects, understanding market needs, or exploring new knowledge areas.", - category: "D" - } - ] - }, - { - question: "Which of the following skills do you want to improve or develop?", - options: [ - { - text: "Robotics, 3D printing, or IoT-based projects.", - category: "A" - }, - { - text: "Programming, debugging, or developing new applications and algorithms.", - category: "B" - }, - { - text: "Visual communication, UX/UI design, or multimedia creation.", - category: "C" - }, - { - text: "Leadership, marketing, research, or analysis skills.", - category: "D" - } - ] - }, - { - question: "How do you approach problem-solving?", - options: [ - { - text: "By physically experimenting, creating prototypes, and iterating based on testing.", - category: "A" - }, - { - text: "By writing code, creating logical solutions, and troubleshooting issues.", - category: "B" - }, - { - text: "By brainstorming creative approaches, sketching, or creating visual solutions.", - category: "C" - }, - { - text: "By analyzing the problem holistically, researching, and planning solutions with strategic thinking.", - category: "D" - } - ] - }, - { - question: "Which tools or resources are you most interested in using or learning?", - options: [ - { - text: "Electronic components, fabrication tools, robotics kits.", - category: "A" - }, - { - text: "Programming languages, development frameworks, software tools.", - category: "B" - }, - { - text: "Graphic design tools, wireframing software, creative suites.", - category: "C" - }, - { - text: "Business models, research papers, management tools, or policy frameworks.", - category: "D" - } - ] - }, - { - question: "What kind of project excites you the most?", - options: [ - { - text: "Creating a new physical device, electronic gadget, or automated system.", - category: "A" - }, - { - text: "Developing an app, creating a software tool, or building a machine learning model.", - category: "B" - }, - { - text: "Designing a logo, improving a website’s user experience, or making digital illustrations.", - category: "C" - }, - { - text: "Organizing an event, analyzing data trends, developing a new business idea.", - category: "D" - } - ] - }, - { - question: "Which statement resonates most with your aspirations?", - options: [ - { - text: "I want to bring my ideas to life by building things with my hands.", - category: "A" - }, - { - text: "I want to create impactful digital solutions and applications.", - category: "B" - }, - { - text: "I want to communicate stories and ideas through design and visuals.", - category: "C" - }, - { - text: "I want to lead, strategize, and innovate to solve broader problems.", - category: "D" - } - ] - }, - { - question: "In a team project, you usually prefer to:", - options: [ - { - text: "Take the lead in building and assembling the project.", - category: "A" - }, - { - text: "Handle the technical aspects and coding of the project.", - category: "B" - }, - { - text: "Focus on the design and presentation of the project.", - category: "C" - }, - { - text: "Organize the project, plan timelines, and ensure communication.", - category: "D" - } - ] - }, - { - question: "What motivates you the most?", - options: [ - { - text: "The thrill of creating something tangible and functional.", - category: "A" - }, - { - text: "Solving complex problems and coding challenges.", - category: "B" - }, - { - text: "Creating visually appealing designs that communicate effectively.", - category: "C" - }, - { - text: "Leading a team to success and achieving strategic goals.", - category: "D" - } - ] - } -]; - -// Function to shuffle questions randomly -const shuffleQuestions = (questions: Question[]): Question[] => { - const shuffled = [...questions]; - for (let i = shuffled.length - 1; i > 0; i--) { - const j = Math.floor(Math.random() * (i + 1)); - [shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]]; - } - return shuffled; -}; - -const PathFinder: React.FC = () => { - const [currentQuestionIndex, setCurrentQuestionIndex] = useState(0); - const [scores, setScores] = useState>( - { - A: 0, - B: 0, - C: 0, - D: 0 - } - ); - const [selectedOptions, setSelectedOptions] = useState>({}); - const [showResults, setShowResults] = useState(false); - const [questions, setQuestions] = useState([]); - - useEffect(() => { - // Shuffle questions whenever the component is loaded - setQuestions(shuffleQuestions(originalQuestions)); - }, []); - - const handleNextQuestion = () => { - if (!selectedOptions[currentQuestionIndex] || selectedOptions[currentQuestionIndex].length === 0) { - alert("Please select at least one option to proceed."); - return; - } - - const updatedScores = { ...scores }; - selectedOptions[currentQuestionIndex].forEach(category => { - updatedScores[category as "A" | "B" | "C" | "D"] += 1; - }); - setScores(updatedScores); - - if (currentQuestionIndex + 1 < questions.length) { - setCurrentQuestionIndex(currentQuestionIndex + 1); - } else { - setShowResults(true); - } - }; - - const handlePrevQuestion = () => { - if (currentQuestionIndex > 0) { - setCurrentQuestionIndex(currentQuestionIndex - 1); - } +export default function PathFinder() { + const onSubmit = (data: string[]) => { + console.log(data); }; - - const handleOptionChange = (category: string) => { - setSelectedOptions(prevSelectedOptions => { - const updatedOptions = [...(prevSelectedOptions[currentQuestionIndex] || [])]; - if (updatedOptions.includes(category)) { - const index = updatedOptions.indexOf(category); - updatedOptions.splice(index, 1); // Remove category - } else { - updatedOptions.push(category); // Add category - } - return { - ...prevSelectedOptions, - [currentQuestionIndex]: updatedOptions - }; - }); - }; - - const getRecommendedPathway = () => { - const maxScore = Math.max(scores.A, scores.B, scores.C, scores.D); - if (scores.A === maxScore) return "Maker"; - if (scores.B === maxScore) return "Coder"; - if (scores.C === maxScore) return "Designer"; - return "Others"; - }; - - return ( - -
-

Pathway Identification Questionnaire

-

- Instructions: For each question, select the options that - best describe you. -

- - {!showResults ? ( -
-

- Question No: {currentQuestionIndex + 1} /{" "} - {questions.length} -

- {questions[currentQuestionIndex] && ( - <> -

- {questions[currentQuestionIndex].question} -

- - - {questions[currentQuestionIndex].options.map((option, index) => ( - - - - ))} - -
- -
- -
- - -
- - )} -
- ) : ( -
-

Your Recommended Pathway: {getRecommendedPathway()}

-
- )} -
-
- ); -}; - -export default PathFinder; + return ; +} diff --git a/src/modules/Common/Authentication/pages/Onboarding/Register/Register.tsx b/src/modules/Common/Authentication/pages/Onboarding/Register/Register.tsx new file mode 100644 index 000000000..787aea919 --- /dev/null +++ b/src/modules/Common/Authentication/pages/Onboarding/Register/Register.tsx @@ -0,0 +1,111 @@ +import { useEffect, useState } from "react"; +import { useNavigate, useSearchParams } from "react-router-dom"; +import { submitUserData } from "../../../services/newOnboardingApis"; +import toast from "react-hot-toast"; +import UserInterestSelectionComponent from "../../../components/UserInterest/UserInterestComponent"; +import PathFinderComponent from "../../../components/PathFinder/PathFinderComponent"; +import AccountCreationComponent from "../../../components/AccountCreation/AccountCreationComponent"; +import OnboardingTemplate from "../../../components/OnboardingTeamplate/OnboardingTemplate"; +import { INITIAL_ENDGOALS, INITIAL_INTERESTS } from "../constants"; + +export default function RegisterPage() { + const navigate = useNavigate(); + const [searchParams, setSearchParams] = useSearchParams(); + const param = searchParams.get("param"); + const referralId = searchParams.get("referral_id"); + const ruri = searchParams.get("ruri"); + const interests = (searchParams.get("interests")?.split(",") ?? []).filter( + i => i.length > 1 + ); + const endgoals = (searchParams.get("endgoals")?.split(",") ?? []).filter( + i => i.length > 1 + ); + const [isLoading, setIsLoading] = useState(false); + const [userInterest, setUserInterests] = + useState(null); + + useEffect(() => { + console.log("interests", interests); + if (interests.length < 1) { + } else if (endgoals.length < 1) { + navigate( + "/register/interests?" + + (ruri ? `ruri=${ruri}&` : "") + + "interests=" + + interests.join(",") + ); + } else { + var choosen_interests = interests.filter(interest => + INITIAL_INTERESTS.map(i => i.value).includes(interest) + ); + var choosen_endgoals = endgoals.filter(endgoal => + INITIAL_ENDGOALS.map(i => i.value).includes(endgoal) + ); + var other_endgoals = endgoals.filter( + endgoal => !INITIAL_ENDGOALS.map(i => i.value).includes(endgoal) + ); + var other_interests = interests.filter( + interest => + !INITIAL_INTERESTS.map(i => i.value).includes(interest) + ); + setUserInterests({ + choosen_interests: choosen_interests, + choosen_endgoals: choosen_endgoals, + other_endgoals: other_endgoals, + other_interests: other_interests + }); + } + }, []); + + const handlePathFinderOutput = (data: string[]) => { + setSearchParams({ ...searchParams, interests: data.join(",") }); + navigate( + "/register/interests?" + + (ruri ? `ruri=${ruri}&` : "") + + "interests=" + + data.join(",") + ); + }; + + const handleAccountCreation = (userData: RegisterRequestDataType) => { + if (!userInterest) { + toast.error("Please select your interests and endgoals"); + navigate("/register/interests"); + return; + } + userData.interests = userInterest; + submitUserData({ + setIsLoading: setIsLoading, + userData: userData + }).then(res => { + if (res) { + navigate( + ruri + ? `/register/organization/?ruri=${ruri}` + : "/register/organization" + ); + } + }); + }; + + if (!interests || interests.length < 1) { + return ; + } else if (!endgoals || endgoals.length < 1) { + var params = new URLSearchParams(); + params.append("interests", interests.join(",")); + params.append("ruri", ruri ?? ""); + navigate("/register/interests?" + params.toString()); + return null; + } else { + return ( + + ); + } +} diff --git a/src/modules/Common/Authentication/pages/Onboarding/UserInterest/UserInterest.tsx b/src/modules/Common/Authentication/pages/Onboarding/UserInterest/UserInterest.tsx index bd6bbc722..a23bbfb56 100644 --- a/src/modules/Common/Authentication/pages/Onboarding/UserInterest/UserInterest.tsx +++ b/src/modules/Common/Authentication/pages/Onboarding/UserInterest/UserInterest.tsx @@ -1,315 +1,73 @@ -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 { privateGateway, publicGateway } from "@/MuLearnServices/apiGateways"; +import UserInterestSelectionComponent from "../../../components/UserInterest/UserInterestComponent"; +import { privateGateway } from "@/MuLearnServices/apiGateways"; import { onboardingRoutes } from "@/MuLearnServices/urls"; - -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"; -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 INITIAL_INTERESTS = [ - { 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: "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 } -]; - -type InterestGroup = { - id: string; - name: string; - category: string; -}; - -type InterestGroups = { - [key: string]: InterestGroup[]; -}; +import { useEffect, useState } from "react"; +import toast from "react-hot-toast"; +import { useNavigate, useSearchParams } from "react-router-dom"; export default function UserInterest() { - 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 [searchParams, _] = useSearchParams(); + const ruri = searchParams.get("ruri"); const navigate = useNavigate(); - const ruri = window.location.href.split("=")[1]; - + const [newUser, setNewUser] = useState(true); useEffect(() => { - const fetchInterestGroups = async () => { - try { - const res = await publicGateway.get( - onboardingRoutes.interestGroups + const accessToken = localStorage.getItem("accessToken"); + if (accessToken) { + setNewUser(false); + } + }, []); + const handleSubmit = (interests: RegisterInterestData) => { + if (newUser) { + const params = new URLSearchParams(); + + if (interests.choosen_interests.length) + params.append( + "interests", + interests.choosen_interests.join(",") ); - const data: InterestGroup[] = - res.data?.response?.interestGroup ?? []; - - const interestGroupsData = interests.reduce( - (acc, interest) => ({ - ...acc, - [interest.value]: data.filter( - group => group.category === interest.value - ) - }), - {} + if (interests.other_interests?.length) + params.set( + "interests", + [ + params.get("interests"), + interests.other_interests.join(",") + ] + .filter(Boolean) + .join(",") ); - - setInterestGroups(interestGroupsData); - } catch (err) { - console.error("Failed to fetch interest groups:", err); - } - }; - - fetchInterestGroups(); - }, []); - - 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 = 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, - choosen_endgoals: selectedEndgoals, - other_interests: otherInterest, - other_endgoals: otherEndgoal - }; - - try { - const res = await privateGateway.post( - onboardingRoutes.interests, - data - ); - toast.success(res.data?.message.general[0]); - navigate( - ruri - ? ruri == "noredirect" - ? "/dashboard/profile" - : `/register/organization/?ruri=${ruri}` - : "/register/organization" - ); - } 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); - - 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} -
  • - ) - )} -
-
- - )} - {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 - } - /> -
- )} -
+ if (interests.choosen_endgoals.length) + params.append("endgoals", interests.choosen_endgoals.join(",")); + if (interests.other_endgoals?.length) + params.set( + "endgoals", + [params.get("endgoals"), interests.other_endgoals.join(",")] + .filter(Boolean) + .join(",") + ); + if (ruri) params.append("ruri", ruri); + + navigate(`/register?${params.toString()}`); + } else { + privateGateway + .post(onboardingRoutes.interests, interests) + .then(res => { + toast.success(res.data?.message.general[0]); + navigate( + ruri + ? ruri == "noredirect" + ? "/dashboard/profile" + : `/register/organization/?ruri=${ruri}` + : "/register/organization" ); - })} -
- ), - [handleChange, interestGroups, otherInterest, otherEndgoal] - ); - - return ( - <> - -
-
- mulearn -

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

-

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

- - {stepTwo - ? renderItems(endgoals, false) - : renderItems(interests, true)} + }) + .catch(err => { + toast.error( + err.response?.data.message.general[0] || + "Unexpected Error occurred" + ); + }); + } + }; - {(stepTwo ? isEndgoalSelected : isInterestSelected) && ( - - Continue - - )} -
-
- - ); + return ; } diff --git a/src/modules/Common/Authentication/pages/Onboarding/constants.ts b/src/modules/Common/Authentication/pages/Onboarding/constants.ts new file mode 100644 index 000000000..9f6f51b49 --- /dev/null +++ b/src/modules/Common/Authentication/pages/Onboarding/constants.ts @@ -0,0 +1,21 @@ +import creative from "/src/modules/Common/Authentication/assets/interests/creative.svg"; +import maker from "/src/modules/Common/Authentication/assets/interests/makers.svg"; +import software from "/src/modules/Common/Authentication/assets/interests/software.svg"; +import others from "/src/modules/Common/Authentication/assets/interests/others.svg"; + +export const INITIAL_INTERESTS = [ + { 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 } +]; + +export const INITIAL_ENDGOALS = [ + { title: "Job", value: "job", 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 } +]; diff --git a/src/modules/Common/Authentication/pages/Onboarding/onboarding.d.ts b/src/modules/Common/Authentication/pages/Onboarding/onboarding.d.ts new file mode 100644 index 000000000..bec71e1a4 --- /dev/null +++ b/src/modules/Common/Authentication/pages/Onboarding/onboarding.d.ts @@ -0,0 +1,38 @@ +interface RegisterUserData { + full_name: string; + email: string; + password: string; +} + +interface DWMSData { + email: string; + fullName: string; + phoneNumber: string; + gender?: string; + dob?: string; +} + +interface RegisterInterestData { + choosen_interests: string[]; + choosen_endgoals: string[]; + other_interests: string[]; + other_endgoals: string[]; +} + +type RegisterRequestDataType = { + user: RegisterUserData; + interests: InterestData; + referral?: { muid: string }; + gender?: string; + dob?: string; + communities?: string[]; + integration?: { + param: string; + title: string; + }; +}; + +interface Question { + question: string; + options: { text: string; category: string }[]; +} From ecb1608ddea14605c6138a667ae745edbf4c08aa Mon Sep 17 00:00:00 2001 From: Aswanth Vc Date: Sun, 17 Nov 2024 13:20:18 +0530 Subject: [PATCH 4/4] feat(onboard): new onboarding --- src/modules/Dashboard/modules/ConnectDiscord/services/apis.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/Dashboard/modules/ConnectDiscord/services/apis.ts b/src/modules/Dashboard/modules/ConnectDiscord/services/apis.ts index a6ab76aad..c1a76d8af 100644 --- a/src/modules/Dashboard/modules/ConnectDiscord/services/apis.ts +++ b/src/modules/Dashboard/modules/ConnectDiscord/services/apis.ts @@ -37,7 +37,7 @@ export const getInfo = ( ); if (response.data.response?.interest_selected) { toast.error(response.data.response?.interest_selected); - navigate("/register/interests?ruri=noredirect"); + navigate("/register/pathfinder?ruri=noredirect"); } if (setMuid) setMuid(response.data.response.muid); if (onComplete) onComplete();