-
Notifications
You must be signed in to change notification settings - Fork 2
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* refactor: make use of composition for cards * refactor: moves spinner to children and fixes error handler * feat(cr_v2): claimable rewards * refactor: make use of composition for cards * fix(WIP): align the wallet icon to the top right of its container * fix: move spinner to children * fix(rewards): claim hook --------- Co-authored-by: Juraj Piar <[email protected]> Co-authored-by: Antonio <[email protected]>
- Loading branch information
1 parent
d89a0e0
commit e4162cb
Showing
8 changed files
with
153 additions
and
11 deletions.
There are no files selected for viewing
117 changes: 117 additions & 0 deletions
117
src/app/collective-rewards/rewards/ClaimableRewards.tsx
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,117 @@ | ||
import { | ||
formatMetrics, | ||
MetricsCard, | ||
MetricsCardTitle, | ||
TokenMetricsCardRow, | ||
useClaimBuilderRewards, | ||
useClaimStateReporting, | ||
useGetBuilderRewards, | ||
} from '@/app/collective-rewards/rewards' | ||
import { useHandleErrors } from '@/app/collective-rewards/utils' | ||
import { formatBalanceToHuman } from '@/app/user/Balances/balanceUtils' | ||
import { Button, ButtonProps } from '@/components/Button' | ||
import { withSpinner } from '@/components/LoadingSpinner/withLoadingSpinner' | ||
import { Popover } from '@/components/Popover' | ||
import { usePricesContext } from '@/shared/context/PricesContext' | ||
import { FC } from 'react' | ||
import { Address } from 'viem' | ||
|
||
const ClaimYourRewardsSvg = () => ( | ||
<svg width="20" height="21" viewBox="0 0 20 21" fill="none" xmlns="http://www.w3.org/2000/svg"> | ||
<path | ||
d="M13.75 12.1667H13.7583M2.5 4.66667V16.3333C2.5 17.2538 3.24619 18 4.16667 18H15.8333C16.7538 18 17.5 17.2538 17.5 16.3333V8C17.5 7.07953 16.7538 6.33333 15.8333 6.33333L4.16667 6.33333C3.24619 6.33333 2.5 5.58714 2.5 4.66667ZM2.5 4.66667C2.5 3.74619 3.24619 3 4.16667 3H14.1667M14.1667 12.1667C14.1667 12.3968 13.9801 12.5833 13.75 12.5833C13.5199 12.5833 13.3333 12.3968 13.3333 12.1667C13.3333 11.9365 13.5199 11.75 13.75 11.75C13.9801 11.75 14.1667 11.9365 14.1667 12.1667Z" | ||
stroke="white" | ||
strokeWidth="2" | ||
strokeLinecap="round" | ||
strokeLinejoin="round" | ||
/> | ||
</svg> | ||
) | ||
|
||
const ClaimYourRewardsButton: FC<Required<Pick<ButtonProps, 'onClick' | 'disabled'>>> = buttonProps => ( | ||
<div className="self-start justify-self-end pt-[10px]"> | ||
<Popover | ||
content={ | ||
<div className="text-[12px] font-bold mb-1"> | ||
<p data-testid="builderAddressTooltip">Claim your rewards</p> | ||
</div> | ||
} | ||
size="small" | ||
position="top" | ||
trigger="hover" | ||
> | ||
<Button {...buttonProps} variant="borderless" className="px-1 py-1"> | ||
<ClaimYourRewardsSvg /> | ||
</Button> | ||
</Popover> | ||
</div> | ||
) | ||
|
||
type Token = { | ||
symbol: string | ||
address: Address | ||
} | ||
|
||
type RewardsTokenMetricsProps = { | ||
builder: Address | ||
gauge: Address | ||
token: Token | ||
currency?: string | ||
} | ||
|
||
const RewardsTokenMetrics: FC<RewardsTokenMetricsProps> = ({ | ||
builder, | ||
gauge, | ||
token: { address, symbol }, | ||
currency = 'USD', | ||
}) => { | ||
const { prices } = usePricesContext() | ||
|
||
const { | ||
data: rewards, | ||
isLoading: isLoadingRewards, | ||
error: rewardsError, | ||
} = useGetBuilderRewards(address, gauge) | ||
useHandleErrors({ error: rewardsError, title: 'Error loading rewards' }) | ||
|
||
const tokenPrice = prices[symbol]?.price ?? 0 | ||
|
||
const { amount, fiatAmount } = formatMetrics( | ||
Number(formatBalanceToHuman(rewards ?? 0n)), | ||
tokenPrice, | ||
symbol, | ||
currency, | ||
) | ||
|
||
const { isClaimFunctionReady, claimRewards, ...claimTx } = useClaimBuilderRewards(builder) | ||
|
||
useClaimStateReporting({ ...claimTx, error: rewardsError ?? claimTx.error }) | ||
|
||
return withSpinner(TokenMetricsCardRow)({ | ||
amount, | ||
fiatAmount, | ||
isLoading: isLoadingRewards, | ||
children: ( | ||
<ClaimYourRewardsButton onClick={() => claimRewards(address)} disabled={!isClaimFunctionReady} /> | ||
), | ||
}) | ||
} | ||
|
||
type ClaimableRewardsProps = { | ||
builder: Address | ||
gauge: Address | ||
currency?: string | ||
data: { | ||
[token: string]: Token | ||
} | ||
} | ||
|
||
export const ClaimableRewards: FC<ClaimableRewardsProps> = ({ data, ...rest }) => { | ||
return ( | ||
<MetricsCard borderless> | ||
<MetricsCardTitle title="Claimable rewards" data-testid="ClaimableRewards" /> | ||
<RewardsTokenMetrics {...rest} token={data.rif} /> | ||
<RewardsTokenMetrics {...rest} token={data.rbtc} /> | ||
</MetricsCard> | ||
) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,4 +1,5 @@ | ||
export * from './useClaimAllRewards' | ||
export * from './useClaimBuilderRewards' | ||
export * from './useGetBuilderRewards' | ||
export * from './useGetRewardDistributedLogs' | ||
export * from './useGetTokenProjectedReward' | ||
export * from './useGetNotifyRewardLogs' |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
22 changes: 22 additions & 0 deletions
22
src/app/collective-rewards/rewards/hooks/useGetBuilderRewards.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
import { GaugeAbi } from '@/lib/abis/v2/GaugeAbi' | ||
import { Address } from 'viem' | ||
import { useReadContract } from 'wagmi' | ||
import { AVERAGE_BLOCKTIME } from '@/lib/constants' | ||
|
||
export const useGetBuilderRewards = (rewardToken: Address, gauge: Address) => { | ||
const { data, isLoading, error } = useReadContract({ | ||
address: gauge, | ||
abi: GaugeAbi, | ||
functionName: 'builderRewards', | ||
args: [rewardToken], | ||
query: { | ||
refetchInterval: AVERAGE_BLOCKTIME, | ||
}, | ||
}) | ||
|
||
return { | ||
data, | ||
isLoading, | ||
error, | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters