diff --git a/components/forms/CreateTxForm/Fields/FieldVoteOption.tsx b/components/forms/CreateTxForm/Fields/FieldVoteOption.tsx new file mode 100644 index 00000000..76315d46 --- /dev/null +++ b/components/forms/CreateTxForm/Fields/FieldVoteOption.tsx @@ -0,0 +1,69 @@ +import { FormControl, FormField, FormItem, FormLabel, FormMessage } from "@/components/ui/form"; +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from "@/components/ui/select"; +import { prettyFieldName } from "@/lib/form"; +import { printVoteOption, voteOptions } from "@/lib/gov"; +import { voteOptionFromJSON } from "cosmjs-types/cosmos/gov/v1beta1/gov"; +import * as z from "zod"; +import type { FieldProps } from "./types"; + +const selectVoteOptions = voteOptions.map((opt) => { + const voteOptionObj = voteOptionFromJSON(opt); + + return { + label: printVoteOption(voteOptionObj), + value: voteOptionObj, + }; +}); + +const isFieldVoteOption = (fieldName: string) => fieldName === "option"; + +export const getFieldVoteOption = (fieldName: string) => + isFieldVoteOption(fieldName) ? FieldVoteOption : null; + +export const getFieldVoteOptionSchema = (fieldName: string) => + isFieldVoteOption(fieldName) + ? z.coerce + .number({ + invalid_type_error: "Invalid vote option", + required_error: "Invalid vote option", + }) + .nonnegative("Invalid vote option") + : null; + +export default function FieldVoteOption({ form, fieldFormName }: FieldProps) { + return ( + ( + + {prettyFieldName(fieldFormName)} + + + + )} + /> + ); +} diff --git a/components/forms/CreateTxForm/Fields/index.ts b/components/forms/CreateTxForm/Fields/index.ts index 193c24bd..e687a79b 100644 --- a/components/forms/CreateTxForm/Fields/index.ts +++ b/components/forms/CreateTxForm/Fields/index.ts @@ -6,3 +6,4 @@ export * from "./FieldDescription"; export * from "./FieldNumber"; export * from "./FieldString"; export * from "./FieldTimeoutHeight"; +export * from "./FieldVoteOption"; diff --git a/lib/form.ts b/lib/form.ts index ac6a7b52..97e12542 100644 --- a/lib/form.ts +++ b/lib/form.ts @@ -15,6 +15,8 @@ import { getFieldStringSchema, getFieldTimeoutHeight, getFieldTimeoutHeightSchema, + getFieldVoteOption, + getFieldVoteOptionSchema, } from "@/components/forms/CreateTxForm/Fields"; import { FieldSchemaInput } from "@/components/forms/CreateTxForm/Fields/types"; import { z } from "zod"; @@ -36,6 +38,7 @@ export const getField = (fieldName: string) => getFieldTimeoutHeight(fieldName) || getFieldDescription(fieldName) || getFieldCommission(fieldName) || + getFieldVoteOption(fieldName) || null; const getFieldSchema = (fieldName: string, schemaInput: FieldSchemaInput) => @@ -47,6 +50,7 @@ const getFieldSchema = (fieldName: string, schemaInput: FieldSchemaInput) => getFieldTimeoutHeightSchema(fieldName) || getFieldDescriptionSchema(fieldName) || getFieldCommissionSchema(fieldName) || + getFieldVoteOptionSchema(fieldName) || null; export const getMsgSchema = (fieldNames: readonly string[], schemaInput: FieldSchemaInput) => {