From f4f700bea18c039ae19418653b98312973844273 Mon Sep 17 00:00:00 2001 From: muzam1l Date: Wed, 6 Jul 2022 19:30:25 +0530 Subject: [PATCH] Handle required prop on fields. --- components/RunScript/index.tsx | 48 ++++++++++++++++++++++------------ 1 file changed, 32 insertions(+), 16 deletions(-) diff --git a/components/RunScript/index.tsx b/components/RunScript/index.tsx index 3680676..a485ccb 100644 --- a/components/RunScript/index.tsx +++ b/components/RunScript/index.tsx @@ -3,6 +3,7 @@ import { HTMLInputTypeAttribute, useCallback, useEffect, + useMemo, useState, } from "react"; import state, { IAccount, IFile, ILog } from "../../state"; @@ -24,6 +25,7 @@ import Select from "../Select"; import Text from "../Text"; import { saveFile } from "../../state/actions/saveFile"; import { getErrors, getTags } from "../../utils/comment-parser"; +import toast from "react-hot-toast"; const generateHtmlTemplate = (code: string, data?: Record) => { let processString: string | undefined; @@ -94,6 +96,7 @@ type Fields = Record< value: string; type?: "Account" | `Account.${keyof IAccount}` | HTMLInputTypeAttribute; description?: string; + required?: boolean; } >; @@ -115,6 +118,7 @@ const RunScript: React.FC<{ file: IFile }> = ({ file: { content, name } }) => { value: tag.default || "", type: tag.type, description: tag.description, + required: !tag.optional, })); const fields: Fields = _fields.reduce((acc, field) => { @@ -129,7 +133,7 @@ const RunScript: React.FC<{ file: IFile }> = ({ file: { content, name } }) => { return fields; }, [content]); - const runScript = () => { + const runScript = useCallback(() => { try { let data: any = {}; Object.keys(fields).forEach(key => { @@ -150,7 +154,7 @@ const RunScript: React.FC<{ file: IFile }> = ({ file: { content, name } }) => { { type: "error", message: err?.message || "Could not parse template" }, ]; } - }; + }, [content, fields, snap.scriptLogs]); useEffect(() => { const handleEvent = (e: any) => { @@ -177,6 +181,20 @@ const RunScript: React.FC<{ file: IFile }> = ({ file: { content, name } }) => { value: acc.address, })); + const isDisabled = useMemo( + () => Object.values(fields).some(field => field.required && !field.value), + [fields] + ); + + const handleRun = useCallback(() => { + if (isDisabled) + return toast.error("Please fill in all the require fields."); + + state.scriptLogs = []; + runScript(); + setIsDialogOpen(false); + }, [isDisabled, runScript]); + return ( <> @@ -220,7 +238,7 @@ const RunScript: React.FC<{ file: IFile }> = ({ file: { content, name } }) => { {Object.keys(fields).map(key => { - const { name, value, type, description } = fields[key]; + const { name, value, type, description, required } = fields[key]; const isAccount = type?.startsWith("Account"); const isAccountSecret = type === "Account.secret"; @@ -230,10 +248,16 @@ const RunScript: React.FC<{ file: IFile }> = ({ file: { content, name } }) => { return ( -