import { addDecimalsFormatNumber, getDateTimeFormat, } from '@vegaprotocol/utils'; import { useReferralProgram } from './hooks/use-referral-program'; import { Table } from './table'; import classNames from 'classnames'; import { BORDER_COLOR, GRADIENT } from './constants'; import { Tag } from './tag'; import type { ComponentProps, ReactNode } from 'react'; import { ExternalLink, truncateMiddle } from '@vegaprotocol/ui-toolkit'; import { DApp, DocsLinks, TOKEN_PROPOSAL, TOKEN_PROPOSALS, useLinks, } from '@vegaprotocol/environment'; import { useT, ns } from '../../lib/use-t'; import { Trans } from 'react-i18next'; // rainbow-ish order const TIER_COLORS: Array['color']> = [ 'pink', 'orange', 'yellow', 'green', 'blue', 'purple', ]; const getTierColor = (tier: number) => { const tiers = Object.keys(TIER_COLORS).length; let index = Math.abs(tier - 1); if (tier >= tiers) { index = index % tiers; } return TIER_COLORS[index]; }; const Loading = ({ variant }: { variant: 'large' | 'inline' }) => (
); const StakingTier = ({ tier, referralRewardMultiplier, minimumStakedTokens, }: { tier: number; referralRewardMultiplier: string; minimumStakedTokens: string; }) => { const t = useT(); const minimum = addDecimalsFormatNumber(minimumStakedTokens, 18); // TODO: Decide what to do with the multiplier images // eslint-disable-next-line @typescript-eslint/no-unused-vars const multiplierImage = (
{`${referralRewardMultiplier}x multiplier`}
); return (
{t('Multiplier')} {referralRewardMultiplier}x

]} />

); }; export const TiersContainer = () => { const t = useT(); const { benefitTiers, stakingTiers, details, loading, error } = useReferralProgram(); const ends = details?.endOfProgramTimestamp ? getDateTimeFormat().format(new Date(details.endOfProgramTimestamp)) : undefined; const governanceLink = useLinks(DApp.Governance); if ((!loading && !details) || error) { return (
{t('Governance App')} , ]} ns={ns} />{' '} {t('docs')} , ]} ns={ns} />
); } return ( <>

{t('Current Program Details')}

{details?.id && (

proposal , ]} />

)} {/* Meta */}
{details?.id && ( {t('Proposal ID:')}{' '} {truncateMiddle(details.id)} )} {ends && ( {t('Program ends:')} {ends} )}
{/* Container */}
{/* Benefit tiers */}

{t('Benefit tiers')}

{t( 'Members of a referral group can access the increasing commission and discount benefits defined in the program based on their combined running volume.' )}

{loading || !benefitTiers || benefitTiers.length === 0 ? ( ) : ( ({ ...bt, tierElement: (
{bt.tier}
), }))} /> )}
{/* Staking tiers */}

{t('Staking multipliers')}

{t( 'Referrers can access the commission multipliers defined in the program by staking VEGA tokens in the amounts shown.' )}

{loading || !stakingTiers || stakingTiers.length === 0 ? ( <> ) : ( )}
); }; const StakingTiers = ({ data, }: { data: ReturnType['stakingTiers']; }) => ( <> {data.map(({ tier, referralRewardMultiplier, minimumStakedTokens }, i) => ( ))} ); const TiersTable = ({ data, windowLength, }: { data: Array<{ tier: number; tierElement: ReactNode; commission: string; discount: string; volume: string; }>; windowLength?: number; }) => { const t = useT(); return ( ({ ...d, className: classNames({ 'from-vega-yellow-400 dark:from-vega-yellow-600 to-20% bg-highlight': 'yellow' === getTierColor(d.tier), 'from-vega-green-400 dark:from-vega-green-600 to-20% bg-highlight': 'green' === getTierColor(d.tier), 'from-vega-blue-400 dark:from-vega-blue-600 to-20% bg-highlight': 'blue' === getTierColor(d.tier), 'from-vega-purple-400 dark:from-vega-purple-600 to-20% bg-highlight': 'purple' === getTierColor(d.tier), 'from-vega-pink-400 dark:from-vega-pink-600 to-20% bg-highlight': 'pink' === getTierColor(d.tier), 'from-vega-orange-400 dark:from-vega-orange-600 to-20% bg-highlight': 'orange' === getTierColor(d.tier), 'from-vega-clight-200 dark:from-vega-cdark-200 to-20% bg-highlight': 'none' === getTierColor(d.tier), }), }))} /> ); };