From 1d760644c283ead3857a85a036f45bd4a8b97520 Mon Sep 17 00:00:00 2001 From: Aswanth Vc Date: Sun, 13 Oct 2024 18:27:30 +0530 Subject: [PATCH 1/6] 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 2/6] 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 3/6] 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 4/6] 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 6/6] 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 && (