radlab-ui/webapp/src/components/forms/DefaultCreateForm.tsx (153 lines of code) (raw):

import DefaultStepCreator from "@/components/forms/DefaultStepCreator" import { FormikStepper } from "@/components/forms/FormikStepper" import { alertStore, userStore } from "@/store" import { groupVariables, initialFormikData } from "@/utils/terraform" import { ALERT_TYPE, Dictionary, IFormData, ISecretManagerReq, IUIVariable, IVariables, } from "@/utils/types" import { mergeAllSafe } from "@/utils/variables" import axios from "axios" import { FormikValues } from "formik" import { useTranslation } from "next-i18next" import React, { useEffect, useState } from "react" import { useNavigate } from "react-router-dom" interface IDefaultCreateFormProps { formVariables: IUIVariable[] defaultSettingVariables: IVariables handleLoading: Function } const DefaultCreateForm: React.FC<IDefaultCreateFormProps> = ({ formVariables, defaultSettingVariables, handleLoading, }) => { const { t } = useTranslation() const [formData, setFormData] = useState<null | Dictionary<IUIVariable[]>>( null, ) const [initialFormData, setInitialData] = useState({}) const setAlert = alertStore((state) => state.setAlert) const user = userStore((state) => state.user) const navigate = useNavigate() const [answerValueData, setAnswerValueData] = useState<FormikValues>({}) const handleSubmit = async (values: IFormData) => { handleLoading(true) if (values.email_notifications) { const secretManagerPayload: ISecretManagerReq = { key: "mailBoxCred", value: values.mail_server_password, } await saveMailBoxCred(secretManagerPayload) } delete values.mail_server_password const payload = Object.assign(values, { email: user?.email, }) await axios .post(`/api/settings`, payload) .then((res) => { if (res.status === 200) { setAlert({ message: t("settings-success"), type: ALERT_TYPE.SUCCESS, durationMs: 10000, }) navigate("/modules") } else { setAlert({ message: t("settings-error"), type: ALERT_TYPE.ERROR, }) } }) .catch((error) => { console.error(error) setAlert({ message: error.message, type: ALERT_TYPE.ERROR, }) }) .finally(() => { handleLoading(false) }) } // To set matching deafult setting variables as default const setDefaultSettingVariables = () => { const initialFormData = initialFormikData(formVariables) return mergeAllSafe([initialFormData, defaultSettingVariables]) } const saveMailBoxCred = async (payload: ISecretManagerReq) => { try { await axios.post("/api/secret", payload) } catch (error: any) { setAlert({ message: error.message, type: ALERT_TYPE.ERROR, }) } } const handleChangeValues = (answerValues: FormikValues) => { setAnswerValueData(answerValues) } const formatDependsVariables = ( formVariablesData: IUIVariable[], currentAnswerValueData: FormikValues, ) => { const allNonDependsVars = formVariablesData.filter( (formVariableData) => formVariableData.name !== "mail_server_email" && formVariableData.name !== "mail_server_password", ) const allDependsVars = formVariablesData.filter( (formVariableData) => formVariableData.name === "mail_server_email" || formVariableData.name === "mail_server_password", ) const notificationAnswer = currentAnswerValueData.email_notifications const releventParse = allNonDependsVars.concat( notificationAnswer ? allDependsVars : [], ) return releventParse } useEffect(() => { if (formVariables.length > 0) { const initialFormVariable = setDefaultSettingVariables() setInitialData(initialFormVariable) const releventParse = formatDependsVariables( formVariables, answerValueData, ) const groupedVariableList = groupVariables(releventParse) setFormData(groupedVariableList) } }, [formVariables, answerValueData]) return ( <div className="w-full"> {formData && ( <FormikStepper initialValues={initialFormData} onSubmit={async (values) => handleSubmit(values)} > {Object.keys(formData).map((grpId, index) => { const group: undefined | IUIVariable[] = formData[grpId] return group ? ( <DefaultStepCreator variableList={group} idx={index} key={grpId} handleChangeValues={handleChangeValues} /> ) : ( <></> ) })} </FormikStepper> )} </div> ) } export default DefaultCreateForm