From 80168806cf85fedced8ad41dc6ce5cd6f0c35454 Mon Sep 17 00:00:00 2001 From: abefernan <44572727+abefernan@users.noreply.github.com> Date: Fri, 26 Jul 2024 17:24:41 +0200 Subject: [PATCH 1/2] Add FieldNumber --- .../forms/CreateTxForm/Fields/FieldNumber.tsx | 68 +++++++++++++++++++ components/forms/CreateTxForm/Fields/index.ts | 1 + 2 files changed, 69 insertions(+) create mode 100644 components/forms/CreateTxForm/Fields/FieldNumber.tsx diff --git a/components/forms/CreateTxForm/Fields/FieldNumber.tsx b/components/forms/CreateTxForm/Fields/FieldNumber.tsx new file mode 100644 index 00000000..8d5e6ec3 --- /dev/null +++ b/components/forms/CreateTxForm/Fields/FieldNumber.tsx @@ -0,0 +1,68 @@ +import { FormControl, FormField, FormItem, FormLabel, FormMessage } from "@/components/ui/form"; +import { Input } from "@/components/ui/input"; +import { prettyFieldName } from "@/lib/form"; +import * as z from "zod"; +import type { FieldProps } from "./types"; + +const isFieldNumberBigInt = (fieldName: string) => + ["proposalId", "creationHeight", "endTime", "timeoutTimestamp", "codeId"].includes(fieldName); + +const isFieldNumberString = (fieldName: string) => + ["minSelfDelegation", "commissionRate"].includes(fieldName); + +export const getFieldNumber = (fieldName: string) => + isFieldNumberBigInt(fieldName) || isFieldNumberString(fieldName) ? FieldNumber : null; + +export const getFieldNumberSchema = (fieldName: string) => { + if (isFieldNumberBigInt(fieldName)) { + return z + .any() + .transform((value) => { + try { + return BigInt(value); + } catch (error) { + return value; + } + }) + .pipe( + z + .bigint({ invalid_type_error: "Must be an integer", required_error: "Required" }) + .positive("Must be positive"), + ); + } + + if (isFieldNumberString(fieldName)) { + return z.coerce + .number({ invalid_type_error: "Must be a number", required_error: "Required" }) + .positive("Must be positive") + .transform((value) => { + try { + return String(value); + } catch (error) { + return value; + } + }); + } + + return null; +}; + +export default function FieldNumber({ form, fieldFormName }: FieldProps) { + const prettyLabel = prettyFieldName(fieldFormName); + + return ( + ( + + {prettyLabel} + + + + + + )} + /> + ); +} diff --git a/components/forms/CreateTxForm/Fields/index.ts b/components/forms/CreateTxForm/Fields/index.ts index abadf207..2135f9d3 100644 --- a/components/forms/CreateTxForm/Fields/index.ts +++ b/components/forms/CreateTxForm/Fields/index.ts @@ -1,3 +1,4 @@ export * from "./FieldAddress"; export * from "./FieldAmount"; +export * from "./FieldNumber"; export * from "./FieldString"; From c1dba718a390965eec788ea0017e3b0f2030ffc3 Mon Sep 17 00:00:00 2001 From: abefernan <44572727+abefernan@users.noreply.github.com> Date: Fri, 26 Jul 2024 17:24:48 +0200 Subject: [PATCH 2/2] Add FieldNumber to form helpers --- lib/form.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/lib/form.ts b/lib/form.ts index 06f3148b..cc2b8f19 100644 --- a/lib/form.ts +++ b/lib/form.ts @@ -3,6 +3,8 @@ import { getFieldAddressSchema, getFieldAmount, getFieldAmountSchema, + getFieldNumber, + getFieldNumberSchema, getFieldString, getFieldStringSchema, } from "@/components/forms/CreateTxForm/Fields"; @@ -18,12 +20,17 @@ export const prettyFieldName = (fieldName: string) => { }; export const getField = (fieldName: string) => - getFieldAddress(fieldName) || getFieldAmount(fieldName) || getFieldString(fieldName) || null; + getFieldAddress(fieldName) || + getFieldAmount(fieldName) || + getFieldString(fieldName) || + getFieldNumber(fieldName) || + null; const getFieldSchema = (fieldName: string, schemaInput: FieldSchemaInput) => getFieldAddressSchema(fieldName, schemaInput) || getFieldAmountSchema(fieldName) || getFieldStringSchema(fieldName) || + getFieldNumberSchema(fieldName) || null; export const getMsgSchema = (fieldNames: readonly string[], schemaInput: FieldSchemaInput) => {