From e353ee4afa489e637807c6bb636479eaaa5727a2 Mon Sep 17 00:00:00 2001 From: Samuel Rowe Date: Fri, 12 Aug 2022 11:04:05 +0530 Subject: [PATCH] feat: created `FormModal` component --- .../frontend/src/components/FormModal.tsx | 91 +++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 services/frontend/src/components/FormModal.tsx diff --git a/services/frontend/src/components/FormModal.tsx b/services/frontend/src/components/FormModal.tsx new file mode 100644 index 0000000..3bd5a0d --- /dev/null +++ b/services/frontend/src/components/FormModal.tsx @@ -0,0 +1,91 @@ +import { ReactElement, useCallback, useState } from "react"; +import { Formik } from "formik"; +import { Button, styled } from "@mui/joy"; + +import { reportErrorsAndSubmit } from "../utils/forms"; +import { ScrollView } from "./ScrollView"; +import Modal from "./Modal"; +import Tabs from "./Tabs"; +import Tab from "./Tab"; + +export interface IFormModalProps { + title: string; + tabs: { value: string; title: string }[]; + onHide: () => void; + initialValues: any; + validationSchema: any; + onCreate: (values: any, formik: any) => void; + renderTabs: (current: string) => ReactElement; +} + +const StyledScrollView = styled(ScrollView)` + position: relative; + padding-top: 0.75rem; + padding-bottom: 0.75rem; + padding-left: 1rem; + padding-right: 1rem; + flex: 1 1 auto; +`; + +const Actions = styled("div")` + display: flex; + padding-top: 0.75rem; + padding-bottom: 0.75rem; + padding-left: 1rem; + padding-right: 1rem; + justify-content: flex-end; + align-items: center; + border-bottom-right-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; + border-top-width: 1px; + border-style: solid; +`; + +const FormModal = (props: IFormModalProps) => { + const { + title, + tabs, + initialValues, + validationSchema, + onHide, + onCreate, + renderTabs + } = props; + const [openTab, setOpenTab] = useState(() => tabs[0].value); + + const handleCreate = useCallback((values: any, formik: any) => { + onCreate(values, formik); + onHide(); + }, []); + + return ( + + + {(formik) => ( + <> + + {tabs.map((tab) => ( + + ))} + + + + {renderTabs(openTab)} + + + + + + + )} + + + ); +}; + +export default FormModal;