diff --git a/kleros-sdk/src/dataMappings/utils/index.ts b/kleros-sdk/src/dataMappings/utils/index.ts index bacf46150..1c9d85d45 100644 --- a/kleros-sdk/src/dataMappings/utils/index.ts +++ b/kleros-sdk/src/dataMappings/utils/index.ts @@ -1,3 +1,6 @@ export * from "./populateTemplate"; export * from "./retrieveVariables"; export * from "./disputeDetailsTypes"; + +export const isUndefined = (maybeObject: any): maybeObject is undefined | null => + typeof maybeObject === "undefined" || maybeObject === null; diff --git a/kleros-sdk/src/dataMappings/utils/replacePlaceholdersWithValues.ts b/kleros-sdk/src/dataMappings/utils/replacePlaceholdersWithValues.ts index 2f5520ef7..655cad0c5 100644 --- a/kleros-sdk/src/dataMappings/utils/replacePlaceholdersWithValues.ts +++ b/kleros-sdk/src/dataMappings/utils/replacePlaceholdersWithValues.ts @@ -2,6 +2,7 @@ import mustache from "mustache"; import retrieveVariables from "./retrieveVariables"; import { ActionMapping } from "./actionTypes"; import { InvalidContextError } from "../../errors"; +import { isUndefined } from "."; export function replacePlaceholdersWithValues( mapping: ActionMapping, @@ -35,7 +36,8 @@ const validateContext = (template: string, context: Record) => const variables = retrieveVariables(template); variables.forEach((variable) => { - if (!context[variable]) throw new InvalidContextError(`Expected key "${variable}" to be provided in context.`); + if (isUndefined(context[variable])) + throw new InvalidContextError(`Expected key "${variable}" to be provided in context.`); }); return true; }; diff --git a/web-devtools/src/app/(main)/dispute-template/page.tsx b/web-devtools/src/app/(main)/dispute-template/page.tsx index ff9802520..e1522060b 100644 --- a/web-devtools/src/app/(main)/dispute-template/page.tsx +++ b/web-devtools/src/app/(main)/dispute-template/page.tsx @@ -26,6 +26,8 @@ import ReactMarkdown from "components/ReactMarkdown"; import FetchDisputeRequestInput, { DisputeRequest } from "./FetchDisputeRequestInput"; import FetchFromIDInput from "./FetchFromIdInput"; import CustomContextInputs from "./CustomContextInputs"; +import { debounceErrorToast } from "utils/debounceErrorToast"; +import { isEmpty } from "utils/isEmpty"; const Container = styled.div` height: auto; @@ -193,12 +195,14 @@ const DisputeTemplateView = () => { if (customContext) initialContext = { ...initialContext, ...customContext }; const fetchData = async () => { + if (isEmpty(disputeTemplateInput)) return; try { const data = dataMappingsInput ? await executeActions(JSON.parse(dataMappingsInput), initialContext) : {}; const finalDisputeDetails = populateTemplate(disputeTemplateInput, data); setDisputeDetails(finalDisputeDetails); - } catch (e) { + } catch (e: any) { console.error(e); + debounceErrorToast(e?.message); setDisputeDetails(undefined); } finally { setLoading(false); diff --git a/web-devtools/src/hooks/queries/useDisputeTemplateFromId.ts b/web-devtools/src/hooks/queries/useDisputeTemplateFromId.ts index fc33ae2b7..74f98ea1e 100644 --- a/web-devtools/src/hooks/queries/useDisputeTemplateFromId.ts +++ b/web-devtools/src/hooks/queries/useDisputeTemplateFromId.ts @@ -5,6 +5,7 @@ import { isUndefined } from "utils/isUndefined"; import { graphql } from "src/graphql-generated"; import { DisputeTemplateQuery } from "src/graphql-generated/graphql"; +import { isEmpty } from "utils/isEmpty"; const disputeTemplateQuery = graphql(` query DisputeTemplate($id: ID!) { @@ -18,7 +19,7 @@ const disputeTemplateQuery = graphql(` `); export const useDisputeTemplateFromId = (templateId?: string) => { - const isEnabled = !isUndefined(templateId); + const isEnabled = !isUndefined(templateId) && !isEmpty(templateId); const { graphqlBatcher } = useGraphqlBatcher(); return useQuery({ diff --git a/web-devtools/src/utils/isEmpty.ts b/web-devtools/src/utils/isEmpty.ts new file mode 100644 index 000000000..db4a97dbd --- /dev/null +++ b/web-devtools/src/utils/isEmpty.ts @@ -0,0 +1 @@ +export const isEmpty = (str: string): boolean => str.trim() === "";