Skip to content

Commit f92f51e

Browse files
authored
Merge pull request #50 from lidofinance/fix/main-settings-manager
2 parents 8865dfc + 6a49b96 commit f92f51e

File tree

2 files changed

+45
-23
lines changed

2 files changed

+45
-23
lines changed

features/settings/main/components/controllers/edit-property-address/edit-property-address.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ export const EditPropertyAddress: FC<EditPropertyAddressProps> = ({
3030
trigger,
3131
watch,
3232
formState: { errors },
33+
getFieldState,
3334
} = useForm<ManagersNewAddresses>({
3435
defaultValues: {
3536
addresses: {
@@ -64,6 +65,7 @@ export const EditPropertyAddress: FC<EditPropertyAddressProps> = ({
6465
watch={watch}
6566
error={errors.addresses?.[name]}
6667
index={index}
68+
getFieldState={getFieldState}
6769
/>
6870
);
6971
})}

features/settings/main/components/controllers/edit-property-address/input-item/input-item.tsx

Lines changed: 43 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -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

4243
export 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

Comments
 (0)