diff --git a/imports/client/components/PuzzlePage.tsx b/imports/client/components/PuzzlePage.tsx
index c355cd473..a1ae22a3e 100644
--- a/imports/client/components/PuzzlePage.tsx
+++ b/imports/client/components/PuzzlePage.tsx
@@ -1084,7 +1084,11 @@ const PuzzlePageMetadata = ({
{" Answer"}
{/* eslint-disable-next-line @typescript-eslint/no-use-before-define */}
-
+
>
);
}
@@ -1643,12 +1647,16 @@ const PuzzleAnswerModal = React.forwardRef(
(
{
puzzle,
+ guesses,
}: {
puzzle: PuzzleType;
+ guesses: GuessType[];
},
forwardedRef: React.Ref,
) => {
const [answer, setAnswer] = useState("");
+ const [confirmingSubmit, setConfirmingSubmit] = useState(false);
+ const [confirmationMessage, setConfirmationMessage] = useState("");
const [submitState, setSubmitState] = useState(
PuzzleAnswerSubmitState.IDLE,
);
@@ -1674,7 +1682,8 @@ const PuzzleAnswerModal = React.forwardRef(
const onAnswerChange: NonNullable =
useCallback((e) => {
- setAnswer(e.currentTarget.value);
+ setAnswer(e.currentTarget.value.toUpperCase());
+ setConfirmingSubmit(false);
}, []);
const onDismissError = useCallback(() => {
@@ -1682,7 +1691,33 @@ const PuzzleAnswerModal = React.forwardRef(
setSubmitError("");
}, []);
+ const solvedness = useMemo(() => {
+ return computeSolvedness(puzzle);
+ }, [puzzle]);
+
const onSubmit = useCallback(() => {
+ const strippedAnswer = answer.replaceAll(/\s/g, "");
+ const repeatAnswer = guesses.find((g) => {
+ return (
+ g.state === "correct" &&
+ g.guess.replaceAll(/\s/g, "") === strippedAnswer
+ );
+ });
+ if ((repeatAnswer || solvedness !== "unsolved") && !confirmingSubmit) {
+ const repeatAnswerStr = repeatAnswer
+ ? "This answer has already been submitted. "
+ : "";
+ const solvednessStr = {
+ solved: "This puzzle has already been solved. ",
+ noAnswers:
+ "This puzzle does not expect any answers to be submitted. ",
+ unsolved: "",
+ }[solvedness];
+ const msg = `${solvednessStr} ${repeatAnswerStr} Are you sure you want to submit this answer?`;
+ setConfirmationMessage(msg);
+ setConfirmingSubmit(true);
+ return;
+ }
setSubmitState(PuzzleAnswerSubmitState.SUBMITTING);
setSubmitError("");
addPuzzleAnswer.call(
@@ -1699,20 +1734,17 @@ const PuzzleAnswerModal = React.forwardRef(
setSubmitState(PuzzleAnswerSubmitState.IDLE);
hide();
}
+ setConfirmingSubmit(false);
},
);
- }, [puzzle._id, answer, hide]);
+ }, [puzzle._id, confirmingSubmit, guesses, solvedness, answer, hide]);
return (
@@ -1730,6 +1762,9 @@ const PuzzleAnswerModal = React.forwardRef(
+ {confirmingSubmit ? (
+ {confirmationMessage}
+ ) : null}
{submitState === PuzzleAnswerSubmitState.FAILED ? (
{submitError ||