Skip to content

126 bugfix coreq #146

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion client/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,9 @@
"react-icons": "^5.3.0",
"react-qr-code": "^2.0.15",
"react-router-dom": "^6.26.1",
"recharts": "^2.7.2",
"zod": "^3.23.8",
"recharts": "^2.7.2"
"zustand": "^5.0.3"
},
"devDependencies": {
"@eslint/js": "^9.8.0",
Expand Down
2 changes: 2 additions & 0 deletions client/src/components/discovery/ClassInfoModal.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ import { FaCircleCheck, FaCircleExclamation } from "react-icons/fa6";

import { useAuthContext } from "../../contexts/hooks/useAuthContext";
import { useBackendContext } from "../../contexts/hooks/useBackendContext";
import useSignupStore from "../../stores/SignupStore";
import PublishedReviews from "../reviews/classReview";
import SuccessSignupModal from "./SuccessSignupModal";

Expand All @@ -46,6 +47,7 @@ function ClassInfoModal({
}) {
const { currentUser, role } = useAuthContext();
const { backend } = useBackendContext();
const coreqStore = useSignupStore();

const [openSuccessModal, setOpenSuccessModal] = useState(false);

Expand Down
3 changes: 3 additions & 0 deletions client/src/components/discovery/CoReqWarningModal.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import ClassInfoModal from "./ClassInfoModal";
import EventInfoModal from "./EventInfoModal";

function CoReqWarningModal({
user,
origin,
isOpenProp,
lstCorequisites,
Expand Down Expand Up @@ -63,6 +64,7 @@ function CoReqWarningModal({
costume={coreq.costume}
isCorequisiteSignUp={true}
handleClose={cancelSignUp}
user={user}
/>
) : (
<ClassInfoModal
Expand All @@ -77,6 +79,7 @@ function CoReqWarningModal({
id={coreq.id}
isCorequisiteSignUp={true}
handleClose={cancelSignUp}
user={user}
/>
)}

Expand Down
69 changes: 30 additions & 39 deletions client/src/components/discovery/EventInfoModal.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -70,29 +70,24 @@ function EventInfoModal({
// }
// }, [backend, id, user?.data, isOpenProp]);


const enrollInEvent = async () => {
// Check if already checked into event
const currentCheckIn = await backend.get(
`/event-enrollments/test`,
{
params:{
student_id: user.data[0].id,
event_id: id
}
}
);
const currentCheckIn = await backend.get(`/event-enrollments/test`, {
params: {
student_id: user.data[0].id,
event_id: id,
},
});
if (user.data[0] && !currentCheckIn.data.exists) {
const req = await backend.post(`/event-enrollments/`, {
student_id: user.data[0].id,
event_id: id,
attendance: null
attendance: null,
});
if (req.status === 201) {
setOpenSuccessModal(true);
}
}
else {
} else {
console.log("Already signed up for this event!");
}
};
Expand Down Expand Up @@ -139,39 +134,35 @@ function EventInfoModal({
>
<ModalOverlay />
<ModalContent>
<ModalHeader>
{title}
</ModalHeader>
<ModalHeader>{title}</ModalHeader>
<ModalCloseButton />
<ModalBody>
<VStack
spacing={4}
align="center"
>
<HStack width="100%">
{!isCorequisiteSignUp && (
<Box>
<Text as="b">Corequisites</Text>
{!corequisites || corequisites.length === 0 ? (
<Text>No corequisites for this class</Text>
) : (
<List>
{corequisites.map((coreq, index) => (
<ListItem key={index}>
<ListIcon
as={
coreq.enrolled
? FaCircleCheck
: FaCircleExclamation
}
/>
{coreq.title}
</ListItem>
))}
</List>
)}
</Box>
)}
<Box>
<Text as="b">Corequisites</Text>
{!corequisites || corequisites.length === 0 ? (
<Text>No corequisites for this class</Text>
) : (
<List>
{corequisites.map((coreq, index) => (
<ListItem key={index}>
<ListIcon
as={
coreq.enrolled
? FaCircleCheck
: FaCircleExclamation
}
/>
{coreq.title}
</ListItem>
))}
</List>
)}
</Box>
</HStack>
<Box
boxSize="sm"
Expand Down
126 changes: 126 additions & 0 deletions client/src/components/discovery/SignUpClassController.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
import { useCallback, useEffect, useState } from "react";

import { useAuthContext } from "../../contexts/hooks/useAuthContext";
import { useBackendContext } from "../../contexts/hooks/useBackendContext";
import useSignupStore from "../../stores/SignupStore";
import ClassInfoModal from "./ClassInfoModal";
import SignUpController from "./SignUpController";

function SignUpClassController({
user,
openRootModal,
setOpenRootModal,
class_id = null,
event_id = null,
...infoProps
}) {
const coreqStore = useSignupStore();
const { backend } = useBackendContext();
const { currentUser } = useAuthContext();
const [coreqEvent, setCoreqEvent] = useState(null);
const [openCoreqModal, setOpenCoreqModal] = useState(false);
const [corequisites, setCorequisites] = useState(null);
const fetchCorequirements = useCallback(async () => {
const id = class_id !== null ? class_id : event_id;
const COREQUESITE_ROUTE =
class_id !== null
? `/classes/corequisites/${id}`
: `/events/corequisites/${id}`;

const ENROLLMENT_ROUTE =
class_id === null ? "/class-enrollments" : "/event-enrollments";

const fetchEnrollments = async (coreq) => {
try {
const enrollment = await backend
.get(ENROLLMENT_ROUTE)
.then((res) => res.data);

const user = await backend
.get(`/users/${currentUser.uid}`)
.then((res) => res.data[0]);

const userEnrollments = enrollment
.filter((event) => event.studentId === user.id)
.map((event) => {
if (class_id === null) {
return event.classId;
} else {
return event.eventId;
}
});

const corequisitesWithEnrollmentStatus = coreq.map((coreq) => {
if (userEnrollments.includes(coreq.id)) {
return { ...coreq, enrolled: true };
}
return coreq;
});
setCorequisites(corequisitesWithEnrollmentStatus);
} catch (error) {
console.error("Error fetching enrolled events or users:", error);
}
};

const response = await backend.get(COREQUESITE_ROUTE);
const coreq = response.data.map((coreq) => ({
...coreq,
enrolled: false,
}));
setCorequisites(coreq);
await fetchEnrollments(coreq);
setCoreqEvent(coreq[0]);
}, [backend, class_id, event_id, currentUser.uid, coreqEvent]);

const toggleRootModal = () => {
setOpenRootModal(false);
coreqStore.setOpenRoot(false);
};
const toggleCoreqModal = () => {
setOpenRootModal(!openRootModal);
coreqStore.setOpenRoot(false);
setOpenCoreqModal(true);
};

useEffect(() => {
if (coreqStore.openRoot || openRootModal) {
fetchCorequirements();
}
}, [coreqStore.openRoot, openRootModal]);

return (
<>
<ClassInfoModal
isOpenProp={
openRootModal ||
(!openRootModal && coreqStore.openRoot && coreqStore.root == class_id)
}
id={class_id}
{...infoProps}
corequisites={corequisites}
isCorequisiteSignUp={false}
handleClose={toggleRootModal}
handleResolveCoreq={toggleCoreqModal}
user={user}
/>
{coreqEvent && (
<SignUpController
event_id={coreqEvent.id}
title={coreqEvent.title}
description={coreqEvent.description}
location={coreqEvent.location}
capacity={"might remove for events"}
level={coreqEvent.level}
costume={coreqEvent.costume}
date={coreqEvent.date}
setOpenRootModal={setOpenCoreqModal}
openRootModal={openCoreqModal}
override_isCorequisite={true}
user={user}
/>
)}
</>
);
}

export default SignUpClassController;
31 changes: 20 additions & 11 deletions client/src/components/discovery/SignUpController.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { Button } from "@chakra-ui/react";

import { useAuthContext } from "../../contexts/hooks/useAuthContext";
import { useBackendContext } from "../../contexts/hooks/useBackendContext";
import useSignupStore from "../../stores/SignupStore";
import ClassInfoModal from "./ClassInfoModal";
import CoReqWarningModal from "./CoReqWarningModal";
import EventInfoModal from "./EventInfoModal";
Expand All @@ -15,10 +16,12 @@ function SignUpController({
user,
openRootModal,
setOpenRootModal,
override_isCorequisite = false,
class_id = null,
event_id = null,
...infoProps
}) {
const coreqStore = useSignupStore();
const { backend } = useBackendContext();
const { currentUser } = useAuthContext();
const [openCoreqModal, setOpenCoreqModal] = useState(false);
Expand Down Expand Up @@ -48,18 +51,23 @@ function SignUpController({
.filter((event) => event.studentId === user.id)
.map((event) => {
if (class_id === null) {
return event.classId;
if (event.classId !== coreqStore.root) {
return event.classId;
}
} else {
return event.eventId;
}
});

const corequisitesWithEnrollmentStatus = coreq.map((coreq) => {
if (userEnrollments.includes(coreq.id)) {
return { ...coreq, enrolled: true };
}
return coreq;
});
const corequisitesWithEnrollmentStatus = coreq
.filter((x) => x.id !== coreqStore.root)
.map((coreq) => {
if (userEnrollments.includes(coreq.id)) {
return { ...coreq, enrolled: true };
}
return coreq;
});
console.log(corequisitesWithEnrollmentStatus, coreqStore.root);
setCorequisites(corequisitesWithEnrollmentStatus);
} catch (error) {
console.error("Error fetching enrolled events or users:", error);
Expand All @@ -74,10 +82,12 @@ function SignUpController({

const toggleRootModal = () => {
setOpenRootModal(!openRootModal);
coreqStore.setOpenRoot(true);
};
const toggleCoreqModal = () => {
toggleRootModal();
setOpenCoreqModal(true);
coreqStore.setOpenRoot(true);
};

useEffect(() => {
Expand All @@ -97,7 +107,7 @@ function SignUpController({
id={class_id}
{...infoProps}
corequisites={corequisites}
isCorequisiteSignUp={false}
isCorequisiteSignUp={override_isCorequisite}
handleClose={toggleRootModal}
handleResolveCoreq={toggleCoreqModal}
user={user}
Expand All @@ -108,21 +118,20 @@ function SignUpController({
id={event_id}
{...infoProps}
corequisites={corequisites}
isCorequisiteSignUp={false}
isCorequisiteSignUp={override_isCorequisite}
handleClose={toggleRootModal}
handleResolveCoreq={toggleCoreqModal}
user={user}
/>
)}

<CoReqWarningModal
origin={class_id ? "CLASS" : "EVENT"}
isOpenProp={openCoreqModal}
lstCorequisites={corequisites}
handleClose={toggleCoreqModal}
killModal={() => setOpenCoreqModal(false)}
user={user}
/>

{/* <Button onClick={() => setOpenRootModal(true)}>View Details</Button> */}
</>
);
Expand Down
Loading