Skip to content

Commit

Permalink
implementation of finish question as non-answerer
Browse files Browse the repository at this point in the history
  • Loading branch information
danielxue committed Mar 28, 2024
1 parent dc613a9 commit 79b4530
Show file tree
Hide file tree
Showing 2 changed files with 64 additions and 15 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import { Button, Modal } from "semantic-ui-react";

interface FinishConfirmModalProps {
finishFunc: () => void;

This comment has been minimized.

Copy link
@esinx

esinx Mar 28, 2024

Member

onFinish

closeFunc: () => void;

This comment has been minimized.

Copy link
@esinx

esinx Mar 28, 2024

Member

onClose

open: boolean;

This comment has been minimized.

Copy link
@esinx

esinx Mar 28, 2024

Member

also make these two parameters optional

}

const FinishConfirmModal = (props: FinishConfirmModalProps) => {
const { finishFunc, closeFunc, open } = props;

return (
<Modal open={open}>
<Modal.Header>Finish Confirmation</Modal.Header>
<Modal.Content>
<Modal.Description>
You are about to finish a question that you did not start.
Is this intended?
</Modal.Description>
</Modal.Content>
<Modal.Actions>
<Button content="Cancel" onClick={closeFunc} />
<Button
content="Finish"
loading={false}
color="green"
onClick={finishFunc}
/>
</Modal.Actions>
</Modal>
);
};

export default FinishConfirmModal;
45 changes: 30 additions & 15 deletions frontend/components/Course/InstructorQueuePage/QuestionCard.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import RejectQuestionModal from "./RejectQuestionModal";
import { AuthUserContext } from "../../../context/auth";
import { Question, QuestionStatus, User } from "../../../types";
import MessageQuestionModal from "./MessageQuestionModal";
import FinishConfirmModal from "./FinishConfirmModal";
import LinkedText from "../../common/ui/LinkedText";

export const fullName = (user: User) => `${user.firstName} ${user.lastName}`;
Expand All @@ -24,6 +25,7 @@ interface QuestionCardProps {
notifs: boolean;
setNotifs: (boolean) => void;

This comment has been minimized.

Copy link
@esinx

esinx Mar 28, 2024

Member

onChange and optional!

}

const QuestionCard = (props: QuestionCardProps) => {
const { question, mutate: mutateQuestion, notifs, setNotifs } = props;
const { id: questionId, askedBy } = question;
Expand All @@ -36,6 +38,7 @@ const QuestionCard = (props: QuestionCardProps) => {

This comment has been minimized.

Copy link
@esinx

esinx Mar 28, 2024

Member

Are you using ErrorBoundaries? If not this could break UX

const [open, setOpen] = useState(false);
const [messageModalOpen, setMessageModalOpen] = useState(false);
const [finishConfirmModalOpen, setFinishConfirmModalOpen] = useState(false);

// save notification preference for when an instructor answers a question
const [lastNotif, setLastNotif] = useState(notifs);
Expand All @@ -58,8 +61,17 @@ const QuestionCard = (props: QuestionCardProps) => {
};

const onFinish = async () => {
setNotifs(lastNotif); // resets notification preference when finished answering question
await mutateQuestion(questionId, { status: QuestionStatus.ANSWERED });
if (
question.respondedToBy!.username === user.username ||

This comment has been minimized.

Copy link
@esinx

esinx Mar 28, 2024

Member

Turn this into respondedToBy?

finishConfirmModalOpen
) {
setNotifs(lastNotif); // resets notification preference when finished answering question
await mutateQuestion(questionId, {
status: QuestionStatus.ANSWERED,
});
} else {
setFinishConfirmModalOpen(true);
}
};

const onUndo = async () => {
Expand Down Expand Up @@ -94,6 +106,11 @@ const QuestionCard = (props: QuestionCardProps) => {
closeFunc={() => setMessageModalOpen(false)}
mutate={mutateQuestion}
/>
<FinishConfirmModal
open={finishConfirmModalOpen}
finishFunc={onFinish}

This comment has been minimized.

Copy link
@esinx

esinx Mar 28, 2024

Member

How about making onFinish a function that takes in a flag for "forced"

const handleFinish = async (forced: boolean) => {
   if(question.respondedToBy!.username === user.username ||
   boolean) {
   // mutate
   }
}

And call () => handleFinish(true) instead?

closeFunc={() => setMessageModalOpen(false)}
/>
<Segment attached="top" color="blue" clearing>
<div
style={{
Expand Down Expand Up @@ -239,19 +256,17 @@ const QuestionCard = (props: QuestionCardProps) => {
/>
)}
{/* if response started, then some user responded */}
{question.timeResponseStarted &&
question.respondedToBy!.username ===
user.username && (
<Button
compact
size="mini"
color="green"
content="Finish"
disabled={isLoading()}
onClick={onFinish}
loading={false}
/>
)}
{question.timeResponseStarted && (
<Button
compact
size="mini"
color="green"
content="Finish"
disabled={isLoading()}
onClick={onFinish}
loading={false}
/>
)}
{question.timeResponseStarted &&
question.videoChatUrl && (
<a
Expand Down

1 comment on commit 79b4530

@esinx
Copy link
Member

@esinx esinx commented on 79b4530 Mar 28, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

looks... fine to me but can improve

Please sign in to comment.