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 ||