import { VegaIcon, VegaIconNames } from '@vegaprotocol/ui-toolkit'; import { useT } from '../../../lib/use-t'; import classNames from 'classnames'; import BigNumber from 'bignumber.js'; import type { PartyActivityStreak } from '@vegaprotocol/types'; import { NetworkParams, useNetworkParams, } from '@vegaprotocol/network-parameters'; export const safeProgress = ( i: number, userTierIndex: number, total: number | string, progress?: number | string ) => { if (i < userTierIndex) return 100; if (i > userTierIndex) return 0; if (!progress || !total) return 0; if (new BigNumber(progress).isGreaterThan(total)) return 100; return new BigNumber(progress) .multipliedBy(100) .dividedBy(total || 1) .toNumber(); }; export const useGetUserTier = ( tiers: { minimum_activity_streak: number; reward_multiplier: string; vesting_multiplier: string; }[], progress?: number ) => { if (!progress) return 0; if (!tiers || tiers.length === 0) return 0; let userTier = 0; let i = 0; while ( i < tiers.length && tiers[userTier].minimum_activity_streak < progress ) { userTier = i; i++; } if ( i === tiers.length && tiers[userTier].minimum_activity_streak <= progress ) { userTier = i; } if (userTier > tiers.length) { userTier--; } return userTier; }; export const ActivityStreak = ({ tiers, streak, }: { tiers: { minimum_activity_streak: number; reward_multiplier: string; vesting_multiplier: string; }[]; streak?: PartyActivityStreak | null; }) => { const t = useT(); const userTierIndex = useGetUserTier(tiers, streak?.activeFor); const { params } = useNetworkParams([ NetworkParams.rewards_activityStreak_inactivityLimit, ]); const remaining = new BigNumber(params.rewards_activityStreak_inactivityLimit) .minus(streak?.inactiveFor || 0) .toNumber(); if (!tiers || tiers.length === 0) return null; const progressBarHeight = 'h-10'; return ( <>
{tiers.map((tier, index) => { return (
{t('Tier {{tier}}', { tier: index + 1, })} {t('numberEpochs', '{{count}} epochs', { count: tier.minimum_activity_streak, })} {t('Reward {{reward}}x', { reward: tier.reward_multiplier, })} {t('Vesting {{vesting}}x', { vesting: tier.vesting_multiplier, })}
); })}
{tiers.map((_tier, index) => { return (
); })}
{streak && ( {streak.isActive ? t( 'userActive', '{{active}} trader: {{count}} epochs so far', { active: 'Active', count: streak.activeFor || 0, } ) : remaining > 0 ? t( 'userInactive', '{{active}} trader: {{count}} epochs so far, you will lose your streak in {{remaining}} epochs!', { active: 'Inactive', count: streak.inactiveFor || 0, remaining, } ) : t( 'userActive', '{{active}} trader: {{count}} epochs so far', { active: 'Inactive', count: streak.inactiveFor || 0, } )}{' '} {userTierIndex > 0 && new BigNumber( tiers[0].minimum_activity_streak ).isLessThanOrEqualTo(streak?.activeFor || 0) && t('(Tier {{tier}} as of last epoch)', { tier: userTierIndex, })} )}
); };