Skip to content

Commit 6ad1303

Browse files
committed
feat: refactor field
1 parent 93e243f commit 6ad1303

16 files changed

Lines changed: 109 additions & 100 deletions

File tree

features/settings/permissions/components/address-list/address-block/address-block.tsx renamed to features/settings/permissions/components/address-block/address-block.tsx

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
1-
import { FC } from 'react';
1+
import { FC, useCallback } from 'react';
22
import { useFieldArray } from 'react-hook-form';
33

4-
import { AddressItem } from 'features/settings/permissions/components/address-list/address-item';
4+
import { AddressField } from 'features/settings/permissions/components';
55
import { Wrapper } from './styles';
66

77
import {
88
EditPermissionsSchema,
9+
FieldSchema,
910
PermissionKeys,
1011
} from 'features/settings/permissions/types';
1112
import { InputBlock } from '../input-block';
@@ -19,20 +20,36 @@ export const AddressBlock: FC<AddressBlockProps> = ({
1920
permission,
2021
readonly,
2122
}) => {
22-
const { fields, update, append } = useFieldArray<EditPermissionsSchema>({
23-
name: permission,
24-
});
23+
const { fields, update, append, remove } =
24+
useFieldArray<EditPermissionsSchema>({
25+
name: permission,
26+
});
27+
28+
const handleUpdateField = useCallback(
29+
(content: FieldSchema, index: number) => {
30+
update(index, content);
31+
},
32+
[update],
33+
);
34+
35+
const handleRemoveField = useCallback(
36+
(index: number) => {
37+
remove(index);
38+
},
39+
[remove],
40+
);
2541

2642
return (
2743
<Wrapper>
2844
{fields.map((field, index) => {
2945
return (
30-
<AddressItem
46+
<AddressField
3147
key={field.id}
32-
field={field}
3348
index={index}
3449
readonly={readonly}
35-
update={update}
50+
permission={permission}
51+
onUpdate={handleUpdateField}
52+
onRemove={handleRemoveField}
3653
/>
3754
);
3855
})}

features/settings/permissions/components/address-list/address-block/index.ts renamed to features/settings/permissions/components/address-block/index.ts

File renamed without changes.

features/settings/permissions/components/address-list/address-block/styles.ts renamed to features/settings/permissions/components/address-block/styles.ts

File renamed without changes.
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
import { FC, useMemo } from 'react';
2+
3+
import { AddressBadge, AddressPopoverSelectable } from 'shared/components';
4+
5+
import {
6+
FieldSchema,
7+
PermissionKeys,
8+
} from 'features/settings/permissions/types';
9+
import { useController } from 'react-hook-form';
10+
11+
export type AddressItemProps = {
12+
index: number;
13+
permission: PermissionKeys;
14+
onUpdate: (field: FieldSchema, index: number) => void;
15+
onRemove: (index: number) => void;
16+
readonly?: boolean;
17+
};
18+
19+
export const AddressField: FC<AddressItemProps> = ({
20+
index,
21+
permission,
22+
onUpdate,
23+
onRemove,
24+
readonly,
25+
}) => {
26+
const {
27+
field: { value },
28+
} = useController({ name: `${permission}.${index}` });
29+
const { account, action } = value as FieldSchema;
30+
const isChecked = action === 'revoke';
31+
32+
const bgColor = useMemo(() => {
33+
if (isChecked) return 'error';
34+
if (action === 'grant') return 'success';
35+
return 'default';
36+
}, [isChecked, action]);
37+
38+
const handleChangeField = () => {
39+
switch (action) {
40+
case 'grant':
41+
onRemove(index);
42+
break;
43+
case 'display':
44+
onUpdate({ account, action: 'revoke' }, index);
45+
break;
46+
case 'revoke':
47+
onUpdate({ account, action: 'display' }, index);
48+
break;
49+
}
50+
};
51+
52+
if (readonly) {
53+
return <AddressBadge address={account} />;
54+
}
55+
56+
return (
57+
<AddressPopoverSelectable
58+
address={account}
59+
checked={isChecked}
60+
bgColor={bgColor}
61+
onCheckedChange={handleChangeField}
62+
/>
63+
);
64+
};
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export { AddressField } from './address-field';

features/settings/permissions/components/address-list/address-item/styles.ts renamed to features/settings/permissions/components/address-field/styles.ts

File renamed without changes.

features/settings/permissions/components/address-list/address-item/address-item.tsx

Lines changed: 0 additions & 59 deletions
This file was deleted.

features/settings/permissions/components/address-list/address-item/index.ts

Lines changed: 0 additions & 1 deletion
This file was deleted.

features/settings/permissions/components/address-list/index.ts

Lines changed: 0 additions & 3 deletions
This file was deleted.
Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
export * from './address-list';
21
export { PermissionsAction } from './permissions-action';
32
export { RoleDescription } from './role-description';
43
export { FormBackdrop } from './form-backdrop';
4+
export { InputBlock } from './input-block';
5+
export { AddressField } from './address-field';
6+
export { AddressBlock } from './address-block';

0 commit comments

Comments
 (0)