diff --git a/src/frontend/src/modals/baseModal/index.tsx b/src/frontend/src/modals/baseModal/index.tsx index 1ce1a20f3..29919d82e 100644 --- a/src/frontend/src/modals/baseModal/index.tsx +++ b/src/frontend/src/modals/baseModal/index.tsx @@ -148,6 +148,7 @@ interface BaseModalProps { onChangeOpenModal?: (open?: boolean) => void; type?: "modal" | "dialog"; onSubmit?: () => void; + onEscapeKeyDown?: (e: KeyboardEvent) => void; } function BaseModal({ open, @@ -157,6 +158,7 @@ function BaseModal({ onChangeOpenModal, type = "dialog", onSubmit, + onEscapeKeyDown, }: BaseModalProps) { const headerChild = React.Children.toArray(children).find( (child) => (child as React.ReactElement).type === Header, @@ -204,7 +206,10 @@ function BaseModal({ ) : ( {triggerChild} - + {onSubmit ? ( { diff --git a/src/frontend/src/modals/codeAreaModal/index.tsx b/src/frontend/src/modals/codeAreaModal/index.tsx index f7a3f6cdb..997ca97b8 100644 --- a/src/frontend/src/modals/codeAreaModal/index.tsx +++ b/src/frontend/src/modals/codeAreaModal/index.tsx @@ -4,8 +4,9 @@ import "ace-builds/src-noconflict/mode-python"; import "ace-builds/src-noconflict/theme-github"; import "ace-builds/src-noconflict/theme-twilight"; // import "ace-builds/webpack-resolver"; -import { useEffect, useState } from "react"; +import { useEffect, useRef, useState } from "react"; import AceEditor from "react-ace"; +import ReactAce from "react-ace/lib/ace"; import IconComponent from "../../components/genericIconComponent"; import { Button } from "../../components/ui/button"; import { Input } from "../../components/ui/input"; @@ -26,6 +27,7 @@ import { useDarkStore } from "../../stores/darkStore"; import { CodeErrorDataTypeAPI } from "../../types/api"; import { codeAreaModalPropsType } from "../../types/components"; import BaseModal from "../baseModal"; +import ConfirmationModal from "../confirmationModal"; export default function CodeAreaModal({ value, @@ -47,6 +49,8 @@ export default function CodeAreaModal({ const [height, setHeight] = useState(null); const setSuccessData = useAlertStore((state) => state.setSuccessData); const setErrorData = useAlertStore((state) => state.setErrorData); + const [openConfirmation, setOpenConfirmation] = useState(false); + const codeRef = useRef(null); const [error, setError] = useState<{ detail: CodeErrorDataTypeAPI; } | null>(null); @@ -123,10 +127,6 @@ export default function CodeAreaModal({ } } - function handleClick() { - processCode(); - } - useEffect(() => { // Function to be executed after the state changes const delayedFunction = setTimeout(() => { @@ -143,12 +143,36 @@ export default function CodeAreaModal({ }; }, [error, setHeight]); + useEffect(() => { + if (!openConfirmation) { + codeRef.current?.editor.focus(); + } + }, [openConfirmation]); + useEffect(() => { setCode(value); }, [value, open]); return ( - + { + e.preventDefault(); + if (code === value) { + setOpen(false); + } else { + if ( + !( + codeRef.current?.editor.completer.popup && + codeRef.current?.editor.completer.popup.isOpen + ) + ) { + setOpenConfirmation(true); + } + } + }} + open={open} + setOpen={setOpen} + > {children} {EDIT_CODE_TITLE} @@ -168,6 +192,7 @@ export default function CodeAreaModal({
+ { + e.stopPropagation(); + setOpenConfirmation(false); + }} + size="x-small" + icon="AlertTriangle" + confirmationText="Check & Save" + cancelText="Discard Changes" + open={openConfirmation} + onCancel={() => setOpen(false)} + onConfirm={() => { + processCode(); + setOpenConfirmation(false); + }} + title="Caution" + > + +

Are you sure you want to exit without saving your changes?

+
+
); diff --git a/src/frontend/src/modals/confirmationModal/index.tsx b/src/frontend/src/modals/confirmationModal/index.tsx index b5fa35b0d..f1e0c894c 100644 --- a/src/frontend/src/modals/confirmationModal/index.tsx +++ b/src/frontend/src/modals/confirmationModal/index.tsx @@ -1,3 +1,4 @@ +import GenericIconComponent from "@/components/genericIconComponent"; import React, { useEffect, useState } from "react"; import ShadTooltip from "../../components/shadTooltipComponent"; import { Button } from "../../components/ui/button"; @@ -38,12 +39,11 @@ function ConfirmationModal({ data, index, onConfirm, - size, open, onClose, onCancel, + ...props }: ConfirmationModalType) { - const Icon: any = nodeIconsLucide[icon]; const [modalOpen, setModalOpen] = useState(open ?? false); const [flag, setFlag] = useState(false); @@ -67,12 +67,12 @@ function ConfirmationModal({ ); return ( - + {triggerChild} {title} -