import React, {ChangeEventHandler, useState} from 'react'; export default function ValidatingInputBigIntField({ id, label, value = 0n, constraints = undefined, validatorFn = (value) => { return {valid: true, value: BigInt(value)}; }, disabled = false, onChange = () => { } }: { id: string; label: string; value?: bigint; constraints?: { min?: bigint; max?: bigint; }; validatorFn: ValidatorFunction<string, bigint>; disabled: boolean; onChange: (v: bigint) => void; }) { const [error, setError] = useState<string>(); const handleValueChange: ChangeEventHandler<HTMLInputElement> = (e) => { const value = e.target.value; const validation = validatorFn(value); if (!validation.valid) { setError(validation.message); } else { setError(undefined); } if (validation.value !== undefined) { onChange(validation.value); } }; return ( <> <label htmlFor={id}>{label}: </label> <input id={id} type={"number"} onChange={handleValueChange} value={value?.toString() || ""} min={constraints?.min?.toString()} max={constraints?.max?.toString()} disabled={disabled} /> <span>{error}</span> </> ); } export interface Validation<T> { valid: boolean; message?: string; value?: T; } export type ValidatorFunction<I, T> = (v: I) => Validation<T>;