@@ -12,7 +12,7 @@ import {
1212 FieldErrorsImpl ,
1313 Merge ,
1414 useFormContext ,
15- useFieldArray ,
15+ UseFormGetFieldState ,
1616 UseFormRegister ,
1717 UseFormTrigger ,
1818 UseFormWatch ,
@@ -37,6 +37,7 @@ export interface InputItemProps {
3737 trigger : UseFormTrigger < { addresses : Record < string , RoleFieldSchema [ ] > } > ;
3838 watch : UseFormWatch < ManagersNewAddresses > ;
3939 error : Merge < FieldError , FieldErrorsImpl < { value : string } [ ] > > | undefined ;
40+ getFieldState : UseFormGetFieldState < ManagersNewAddresses > ;
4041}
4142
4243export const InputItem : FC < InputItemProps > = ( {
@@ -48,10 +49,11 @@ export const InputItem: FC<InputItemProps> = ({
4849 trigger,
4950 watch,
5051 error,
52+ getFieldState,
5153} ) => {
5254 const [ decorator , setDecorator ] = useState < ReactNode | null > ( ) ;
53- const { control , setValue, getValues } = useFormContext ( ) ;
54- const { remove : removeFromMain } = useFieldArray ( { control , name } ) ;
55+ const { setValue, getValues } = useFormContext ( ) ;
56+
5557 const inputKey =
5658 `addresses.${ name } .${ index } .value` as `addresses.${ManagersKeys } .${number } .value`;
5759 const field = register ( inputKey ) ;
@@ -60,11 +62,22 @@ export const InputItem: FC<InputItemProps> = ({
6062
6163 const handleKeyDown = async ( e : KeyboardEvent < HTMLInputElement > ) => {
6264 if ( e . key === 'Enter' ) {
65+ e . preventDefault ( ) ;
66+
6367 const values : RoleFieldSchema [ ] = getValues ( name ) ;
64- const output = await trigger ( inputKey ) ;
68+ const value = ( e . currentTarget || ( e . target as HTMLInputElement ) ) . value ;
6569
70+ if ( isAddress ( value ) ) {
71+ const item = getValues (
72+ `${ name } .${ values ?. length - 1 ?? 0 } ` ,
73+ ) as RoleFieldSchema ;
74+ if ( item && item . value === value ) {
75+ return ;
76+ }
77+ }
78+
79+ const output = await trigger ( inputKey ) ;
6680 if ( output ) {
67- const value = ( e . currentTarget || ( e . target as HTMLInputElement ) ) . value ;
6881 setValue (
6982 `${ name } .${ values ?. length ?? 0 } ` ,
7083 {
@@ -79,34 +92,41 @@ export const InputItem: FC<InputItemProps> = ({
7992
8093 const handleBlur = async ( e : FocusEvent < HTMLInputElement > ) => {
8194 const value = ( e . currentTarget || e . target ) . value ;
82- const output = await trigger ( inputKey ) ;
95+ const values : RoleFieldSchema [ ] = getValues ( name ) ;
96+ if ( isAddress ( value ) ) {
97+ const item = getValues (
98+ `${ name } .${ values ?. length - 1 ?? 0 } ` ,
99+ ) as RoleFieldSchema ;
100+ if ( item && item . value === value ) {
101+ return ;
102+ }
103+ }
83104
105+ const output = await trigger ( inputKey ) ;
84106 if ( isAddress ( value ) && output ) {
85- const values : RoleFieldSchema [ ] = getValues ( name ) ;
86- const output = await trigger ( inputKey ) ;
87- if ( output ) {
88- setValue (
89- `${ name } .${ values ?. length ?? 0 } ` ,
90- {
91- value : value ,
92- state : 'grant' ,
93- } as RoleFieldSchema ,
94- { shouldDirty : true } ,
95- ) ;
96- }
107+ setValue (
108+ `${ name } .${ values ?. length ?? 0 } ` ,
109+ {
110+ value : value ,
111+ state : 'grant' ,
112+ } as RoleFieldSchema ,
113+ { shouldDirty : true } ,
114+ ) ;
97115 } else {
98116 void field . onBlur ( e ) ;
99117 }
100118 } ;
101119
102120 const removeFieldItem = async ( ) => {
103- const output = await trigger ( inputKey ) ;
121+ const { invalid } = getFieldState ( inputKey ) ;
104122 const values : RoleFieldSchema [ ] = getValues ( name ) ;
105- const mainFormItemIndex = values . findIndex (
106- ( item ) => item . value === fieldValue ,
123+ const mainFormItemIndex = values . findLastIndex (
124+ ( item ) => ! item . isGranted && item . value === fieldValue ,
107125 ) ;
108- if ( mainFormItemIndex > - 1 && output ) {
109- removeFromMain ( mainFormItemIndex ) ;
126+
127+ if ( mainFormItemIndex > - 1 && ! invalid ) {
128+ const filtered = values . filter ( ( _ , index ) => index !== mainFormItemIndex ) ;
129+ setValue ( name , filtered , { shouldDirty : true , shouldTouch : true } ) ;
110130 }
111131 remove ( index ) ;
112132 } ;
0 commit comments