Add FieldNumber
This commit is contained in:
parent
42b617ea00
commit
80168806cf
68
components/forms/CreateTxForm/Fields/FieldNumber.tsx
Normal file
68
components/forms/CreateTxForm/Fields/FieldNumber.tsx
Normal file
@ -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 (
|
||||
<FormField
|
||||
control={form.control}
|
||||
name={fieldFormName}
|
||||
render={({ field }) => (
|
||||
<FormItem>
|
||||
<FormLabel>{prettyLabel}</FormLabel>
|
||||
<FormControl>
|
||||
<Input placeholder={`Enter ${prettyLabel.toLowerCase()}`} {...field} />
|
||||
</FormControl>
|
||||
<FormMessage />
|
||||
</FormItem>
|
||||
)}
|
||||
/>
|
||||
);
|
||||
}
|
||||
@ -1,3 +1,4 @@
|
||||
export * from "./FieldAddress";
|
||||
export * from "./FieldAmount";
|
||||
export * from "./FieldNumber";
|
||||
export * from "./FieldString";
|
||||
|
||||
Loading…
Reference in New Issue
Block a user