mirror of
https://github.com/lux-tel/websites.git
synced 2026-10-30 20:31:36 +00:00
91 lines
3.0 KiB
TypeScript
91 lines
3.0 KiB
TypeScript
'use client';
|
|
|
|
import { DYNAMIC_MODULE, HANDRAIL_THRESHOLD, URL } from '@/lib/constants';
|
|
import { externalLink } from '@/lib/locale-defaults';
|
|
import { Module, ModuleTitle, ModuleTooltip } from '@session/ui/components/Module';
|
|
import { useTranslations } from 'next-intl';
|
|
import { useWallet } from '@session/wallet/hooks/wallet-hooks';
|
|
import { useStakingBackendQueryWithParams } from '@/lib/sent-staking-backend-client';
|
|
import { getStakedNodes } from '@/lib/queries/getStakedNodes';
|
|
import { useMemo } from 'react';
|
|
import type { QUERY_STATUS } from '@/lib/query';
|
|
import {
|
|
getVariableFontSizeForSmallModule,
|
|
ModuleDynamicQueryText,
|
|
} from '@/components/ModuleDynamic';
|
|
import { formatSENTBigInt } from '@session/contracts/hooks/SENT';
|
|
import { Address } from 'viem';
|
|
|
|
export const useUnclaimedTokens = (params?: { addressOverride?: Address }) => {
|
|
const { address: connectedAddress } = useWallet();
|
|
const address = useMemo(
|
|
() => params?.addressOverride ?? connectedAddress,
|
|
[params?.addressOverride, connectedAddress]
|
|
);
|
|
|
|
const { data, status, refetch } = useStakingBackendQueryWithParams(
|
|
getStakedNodes,
|
|
{
|
|
address: address!,
|
|
},
|
|
{
|
|
enabled: !!address,
|
|
}
|
|
);
|
|
|
|
const unclaimedRewards = useMemo(
|
|
() => (data?.wallet ? data.wallet.rewards - data.wallet.contract_claimed : undefined),
|
|
[data?.wallet?.rewards, data?.wallet?.contract_claimed]
|
|
);
|
|
|
|
const formattedUnclaimedRewardsAmount = useMemo(
|
|
() => formatSENTBigInt(unclaimedRewards, DYNAMIC_MODULE.SENT_ROUNDED_DECIMALS),
|
|
[unclaimedRewards]
|
|
);
|
|
|
|
const canClaim = Boolean(
|
|
status === 'success' &&
|
|
unclaimedRewards &&
|
|
unclaimedRewards >= BigInt(HANDRAIL_THRESHOLD.CLAIM_REWARDS_AMOUNT)
|
|
);
|
|
|
|
return { status, refetch, unclaimedRewards, formattedUnclaimedRewardsAmount, canClaim };
|
|
};
|
|
|
|
export default function UnclaimedTokensModule({ addressOverride }: { addressOverride?: Address }) {
|
|
const dictionary = useTranslations('modules.unclaimedTokens');
|
|
const toastDictionary = useTranslations('modules.toast');
|
|
const titleFormat = useTranslations('modules.title');
|
|
const title = dictionary('title');
|
|
|
|
const { formattedUnclaimedRewardsAmount, status, refetch } = useUnclaimedTokens({
|
|
addressOverride,
|
|
});
|
|
|
|
return (
|
|
<Module>
|
|
<ModuleTooltip>
|
|
{dictionary.rich('description', { link: externalLink(URL.LEARN_MORE_UNCLAIMED_REWARDS) })}
|
|
</ModuleTooltip>
|
|
<ModuleTitle>{titleFormat('format', { title })}</ModuleTitle>
|
|
<ModuleDynamicQueryText
|
|
status={status as QUERY_STATUS}
|
|
fallback={0}
|
|
errorToast={{
|
|
messages: {
|
|
error: toastDictionary('error', { module: title }),
|
|
refetching: toastDictionary('refetching'),
|
|
success: toastDictionary('refetchSuccess', { module: title }),
|
|
},
|
|
refetch,
|
|
}}
|
|
style={{
|
|
fontSize: getVariableFontSizeForSmallModule(formattedUnclaimedRewardsAmount.length),
|
|
}}
|
|
>
|
|
{formattedUnclaimedRewardsAmount}
|
|
</ModuleDynamicQueryText>
|
|
</Module>
|
|
);
|
|
}
|