From d13f37fcbe15dbe990d76643dcfd509cbba54cbd Mon Sep 17 00:00:00 2001 From: anovazzi1 Date: Fri, 7 Jul 2023 19:59:20 -0300 Subject: [PATCH] feat(modals): add BaseModal component for reusable modal functionality fix(codeAreaModal): refactor codeAreaModal to use BaseModal component for consistency and reusability --- src/frontend/src/modals/baseModal/index.tsx | 69 +++++++++ .../src/modals/codeAreaModal/index.tsx | 131 +++++++++--------- 2 files changed, 136 insertions(+), 64 deletions(-) create mode 100644 src/frontend/src/modals/baseModal/index.tsx diff --git a/src/frontend/src/modals/baseModal/index.tsx b/src/frontend/src/modals/baseModal/index.tsx new file mode 100644 index 000000000..4b135383c --- /dev/null +++ b/src/frontend/src/modals/baseModal/index.tsx @@ -0,0 +1,69 @@ +import { ReactNode, useContext } from "react"; + +import React from "react"; +import { + Dialog, + DialogContent, + DialogDescription, + DialogHeader, + DialogTitle, + DialogTrigger, +} from "../../components/ui/dialog"; +import { PopUpContext } from "../../contexts/popUpContext"; + +type ContentProps = { children: ReactNode }; +type HeaderProps = { children: ReactNode; description: string }; + +const Content: React.FC = ({ children }) => { + return
{children}
; +}; + +const Header: React.FC<{ children: ReactNode; description: string }> = ({ + children, + description, +}) => { + return ( + + {children} + {description} + + ); +}; +interface BaseModalProps { + children: [React.ReactElement, React.ReactElement]; + open: boolean; + setOpen: (open: boolean) => void; +} +function BaseModal({ open, setOpen, children }: BaseModalProps) { + const { closePopUp, setCloseEdit } = useContext(PopUpContext); + + function setModalOpen(x: boolean) { + setOpen(x); + if (x === false) { + setTimeout(() => { + setCloseEdit("editcode"); + closePopUp(); + }, 300); + } + } + const headerChild = React.Children.toArray(children).find( + (child) => (child as React.ReactElement).type === Header + ); + const ContentChild = React.Children.toArray(children).find( + (child) => (child as React.ReactElement).type === Content + ); + //UPDATE COLORS AND STYLE CLASSSES + return ( + + + + {headerChild} +
{ContentChild}
+
+
+ ); +} + +BaseModal.Content = Content; +BaseModal.Header = Header; +export default BaseModal; diff --git a/src/frontend/src/modals/codeAreaModal/index.tsx b/src/frontend/src/modals/codeAreaModal/index.tsx index e327bbb1b..4ffcec352 100644 --- a/src/frontend/src/modals/codeAreaModal/index.tsx +++ b/src/frontend/src/modals/codeAreaModal/index.tsx @@ -1,28 +1,20 @@ -// organize-imports-ignore -import { useContext, useRef, useState } from "react"; -import { PopUpContext } from "../../contexts/popUpContext"; -import AceEditor from "react-ace"; +import { DialogTitle } from "@radix-ui/react-dialog"; +import "ace-builds/src-noconflict/ace"; import "ace-builds/src-noconflict/ext-language_tools"; 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 { TerminalSquare } from "lucide-react"; +import { useContext, useEffect, useRef, useState } from "react"; +import AceEditor from "react-ace"; import { Button } from "../../components/ui/button"; -import { - Dialog, - DialogContent, - DialogDescription, - DialogFooter, - DialogHeader, - DialogTitle, - DialogTrigger, -} from "../../components/ui/dialog"; import { CODE_PROMPT_DIALOG_SUBTITLE } from "../../constants"; import { alertContext } from "../../contexts/alertContext"; import { darkContext } from "../../contexts/darkContext"; +import { PopUpContext } from "../../contexts/popUpContext"; import { postValidateCode } from "../../controllers/API"; import { APIClassType } from "../../types/api"; +import BaseModal from "../baseModal"; export default function CodeAreaModal({ value, @@ -39,18 +31,15 @@ export default function CodeAreaModal({ const [code, setCode] = useState(value); const [loading, setLoading] = useState(false); const { dark } = useContext(darkContext); + const { closePopUp } = useContext(PopUpContext); const { setErrorData, setSuccessData } = useContext(alertContext); - const { closePopUp, setCloseEdit } = useContext(PopUpContext); + const [error, setError] = useState<{ + detail: { error: string; traceback: string }; + }>(null); const ref = useRef(); - function setModalOpen(x: boolean) { - setOpen(x); - if (x === false) { - setTimeout(() => { - setCloseEdit("editcode"); - closePopUp(); - }, 300); - } - } + useEffect(() => { + setValue(code); + }, [code, setValue]); function handleClick() { setLoading(true); @@ -65,7 +54,7 @@ export default function CodeAreaModal({ title: "Code is ready to run", }); setValue(code); - setModalOpen(false); + setOpen((old) => !old); } else { if (funcErrors.length !== 0) { setErrorData({ @@ -95,46 +84,60 @@ export default function CodeAreaModal({ } return ( - - - - - - Edit Code - - {CODE_PROMPT_DIALOG_SUBTITLE} - - -
- { - setCode(value); - }} - className="h-full w-full rounded-lg border-[1px] border-gray-300 custom-scroll dark:border-gray-600" + + + + Edit Code + + + +
+
+ { + setCode(value); + }} + className="h-full w-full rounded-lg border-[1px] border-gray-300 custom-scroll dark:border-gray-600" + /> +
+
+
+

+ {error?.detail?.error} +

+
+
+                  {error?.detail?.traceback}
+                
+
+
+
+
+ +
- - - - - -
+ + ); }