Skip to content

Commit ad4945f

Browse files
authored
Merge pull request #97 from lidofinance/feature/si-1982-no-fee-recepient
Node Operator fee recipient
2 parents 847b3fe + 88e744b commit ad4945f

22 files changed

Lines changed: 153 additions & 25 deletions

File tree

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,19 @@
1-
import { vaultTexts } from 'modules/vaults';
2-
import { AddressInputHookForm } from 'shared/hook-form/controls';
1+
import { Input, Loader } from '@lidofinance/lido-ui';
2+
3+
import { useVaultInfo, vaultTexts } from 'modules/vaults';
4+
5+
const label = vaultTexts.actions.claim.addressLabel;
36

47
export const ClaimInputs = () => {
8+
const { activeVault, isLoadingVault } = useVaultInfo();
9+
510
return (
6-
<AddressInputHookForm
7-
label={vaultTexts.actions.claim.addressLabel}
8-
fieldName="recipient"
11+
<Input
12+
leftDecorator={isLoadingVault ? <Loader /> : null}
13+
label={label}
14+
value={activeVault?.nodeOperatorFeeRecipient}
15+
readOnly
16+
disabled
917
/>
1018
);
1119
};

features/settings/main/components/controllers/radio-selector/radio-selector.styles.ts

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,3 @@ export const RadioSelectorContainer = styled.div`
55
flex-direction: column;
66
gap: ${({ theme }) => theme.spaceMap.sm}px;
77
`;
8-
9-
export const RadioSelectorTitle = styled.div`
10-
font-size: ${({ theme }) => theme.fontSizesMap.xs}px;
11-
line-height: 24px;
12-
color: ${({ theme }) => theme.colors.textDark};
13-
font-weight: 700;
14-
`;

features/settings/main/components/controllers/radio-selector/radio-selector.tsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,13 @@
11
import { FC } from 'react';
22
import { useFormContext, useFormState } from 'react-hook-form';
3+
import { Text } from '@lidofinance/lido-ui';
34

45
import { RadioInput, RadioWithInput } from 'shared/components';
56
import { useVaultConfirmingRoles, useVaultPermission } from 'modules/vaults';
67
import { VaultInfo } from 'types';
78

89
import { ReadonlyView } from '../readonly-view';
9-
import {
10-
RadioSelectorContainer,
11-
RadioSelectorTitle,
12-
} from './radio-selector.styles';
10+
import { RadioSelectorContainer } from './radio-selector.styles';
1311
import { Skeleton } from 'features/settings/main/styles';
1412

1513
export type RadioFormData = {
@@ -46,7 +44,9 @@ export const RadioSelector: FC<VotingSelectorProps> = ({
4644

4745
return (
4846
<RadioSelectorContainer>
49-
<RadioSelectorTitle>{title}</RadioSelectorTitle>
47+
<Text size="xs" strong>
48+
{title}
49+
</Text>
5050
{isLoading && <Skeleton />}
5151
{isEditable && !isLoading && (
5252
<>
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
export { MainSettingsAction } from './main-settings-action';
22
export { NodeOperator } from './node-operator';
3+
export { NodeOperatorFeeRecipient } from './no-fee-recipient';
34
export * from './controllers';
45
export * from './admins';
56
export * from './voting';
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import { vaultTexts } from 'modules/vaults';
2+
import { AddressInputHookForm } from 'shared/hook-form/controls';
3+
4+
const texts = vaultTexts.actions.settings.fields.nodeOperatorFeeRecipient;
5+
6+
export const EditRecipient = () => {
7+
return (
8+
<AddressInputHookForm
9+
label={texts.editLabel}
10+
fieldName="nodeOperatorFeeRecipient"
11+
showRightDecorator={false}
12+
/>
13+
);
14+
};
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export { NodeOperatorFeeRecipient } from './no-fee-recipient';
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import { FC } from 'react';
2+
import { useFormState } from 'react-hook-form';
3+
import { Text } from '@lidofinance/lido-ui';
4+
5+
import { useVaultInfo, useVaultPermission, vaultTexts } from 'modules/vaults';
6+
import { AddressBadge } from 'shared/components';
7+
8+
import { Skeleton } from 'features/settings/main/styles';
9+
10+
import { Wrapper } from './styles';
11+
import { EditRecipient } from './edit-recipient';
12+
13+
const texts = vaultTexts.actions.settings.fields.nodeOperatorFeeRecipient;
14+
15+
export const NodeOperatorFeeRecipient: FC = () => {
16+
const { isLoading: isFormLoading } = useFormState();
17+
const { activeVault } = useVaultInfo();
18+
const { hasPermission, isLoading: isPermissionLoading } = useVaultPermission(
19+
'nodeOperatorManager',
20+
);
21+
const isLoading = isFormLoading || isPermissionLoading;
22+
23+
return (
24+
<Wrapper>
25+
<Text size="xs" strong>
26+
{texts.title}
27+
</Text>
28+
{isLoading && <Skeleton />}
29+
{hasPermission && !isLoading && <EditRecipient />}
30+
{!hasPermission && !isLoading && (
31+
<AddressBadge
32+
weight={400}
33+
address={activeVault?.nodeOperatorFeeRecipient}
34+
symbols={21}
35+
/>
36+
)}
37+
</Wrapper>
38+
);
39+
};
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import styled from 'styled-components';
2+
3+
import { Block } from '@lidofinance/lido-ui';
4+
5+
export const Wrapper = styled(Block)`
6+
display: flex;
7+
flex-direction: column;
8+
gap: ${({ theme }) => theme.spaceMap.sm}px;
9+
padding: 0;
10+
`;

features/settings/main/consts.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ export const votingLifetimeSchema = z.coerce
6767

6868
export const editMainSettingsSchema = z.object({
6969
nodeOperatorManagers: z.array(addressSchema),
70+
nodeOperatorFeeRecipient: accountSchema,
7071
defaultAdmins: z.array(addressSchema),
7172
nodeOperatorFeeBP: z.string(),
7273
nodeOperatorFeeBPCustom: z

features/settings/main/contexts/main-settings-data-provider.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,7 @@ export const MainSettingsDataProvider: FC<PropsWithChildren> = ({
118118
return {
119119
defaultAdmins,
120120
nodeOperatorManagers,
121+
nodeOperatorFeeRecipient: activeVault.nodeOperatorFeeRecipient,
121122
nodeOperatorFeeBP: nodeOperatorFeeBP.sort((a, b) => {
122123
if (a.type === 'My proposal') return 1;
123124
if (b.type === 'My proposal') return -1;

0 commit comments

Comments
 (0)