diff --git a/apps/trading/client-pages/referrals/apply-code-form.tsx b/apps/trading/client-pages/referrals/apply-code-form.tsx index ba4dad242..c2e7533ea 100644 --- a/apps/trading/client-pages/referrals/apply-code-form.tsx +++ b/apps/trading/client-pages/referrals/apply-code-form.tsx @@ -13,7 +13,7 @@ import type { ButtonHTMLAttributes, MouseEventHandler } from 'react'; import { useCallback, useEffect, useRef, useState } from 'react'; import { RainbowButton } from './buttons'; import { useVegaWallet, useVegaWalletDialogStore } from '@vegaprotocol/wallet'; -import { useReferral } from './hooks/use-referral'; +import { useIsInReferralSet, useReferral } from './hooks/use-referral'; import { Routes } from '../../lib/links'; import { useTransactionEventSubscription } from '@vegaprotocol/web3'; import { Statistics, useStats } from './referral-statistics'; @@ -34,11 +34,10 @@ const validateCode = (value: string, t: ReturnType) => { export const ApplyCodeFormContainer = () => { const { pubKey } = useVegaWallet(); - const { data: referee } = useReferral({ pubKey, role: 'referee' }); - const { data: referrer } = useReferral({ pubKey, role: 'referrer' }); + const isInReferralSet = useIsInReferralSet(pubKey); - // go to main page if the current pubkey is already a referrer or referee - if (referee || referrer) { + // Navigate to the index page when already in the referral set. + if (isInReferralSet) { return ; } diff --git a/apps/trading/client-pages/referrals/create-code-form.tsx b/apps/trading/client-pages/referrals/create-code-form.tsx index 642960db4..c647ab3dc 100644 --- a/apps/trading/client-pages/referrals/create-code-form.tsx +++ b/apps/trading/client-pages/referrals/create-code-form.tsx @@ -23,10 +23,20 @@ import { ABOUT_REFERRAL_DOCS_LINK, DISCLAIMER_REFERRAL_DOCS_LINK, } from './constants'; -import { useReferral } from './hooks/use-referral'; +import { useIsInReferralSet, useReferral } from './hooks/use-referral'; import { useT } from '../../lib/use-t'; +import { Navigate } from 'react-router-dom'; +import { Routes } from '../../lib/links'; export const CreateCodeContainer = () => { + const { pubKey } = useVegaWallet(); + const isInReferralSet = useIsInReferralSet(pubKey); + + // Navigate to the index page when already in the referral set. + if (isInReferralSet) { + return ; + } + return ; }; diff --git a/apps/trading/client-pages/referrals/error-boundary.tsx b/apps/trading/client-pages/referrals/error-boundary.tsx index 2e42ca240..ec1008456 100644 --- a/apps/trading/client-pages/referrals/error-boundary.tsx +++ b/apps/trading/client-pages/referrals/error-boundary.tsx @@ -53,7 +53,7 @@ export const NotFound = () => { const navigate = useNavigate(); return ( -
+
{ {t('Go back and try again')}

-
+
); }; diff --git a/apps/trading/client-pages/referrals/hooks/use-referral-toasts.tsx b/apps/trading/client-pages/referrals/hooks/use-referral-toasts.tsx index 362855fb6..f4e86ed56 100644 --- a/apps/trading/client-pages/referrals/hooks/use-referral-toasts.tsx +++ b/apps/trading/client-pages/referrals/hooks/use-referral-toasts.tsx @@ -75,10 +75,7 @@ export const useReferralToasts = () => { data-testid="toast-apply-code" size="xs" onClick={() => { - const matched = matchPath( - Routes.REFERRALS_APPLY_CODE, - pathname - ); + const matched = matchPath(Routes.REFERRALS, pathname); if (!matched) navigate(Routes.REFERRALS_APPLY_CODE); updateToast(NON_ELIGIBLE_REFERRAL_SET_TOAST_ID + epoch, { hidden: true, diff --git a/apps/trading/client-pages/referrals/hooks/use-referral.ts b/apps/trading/client-pages/referrals/hooks/use-referral.ts index 8265bafce..f9ffc8a64 100644 --- a/apps/trading/client-pages/referrals/hooks/use-referral.ts +++ b/apps/trading/client-pages/referrals/hooks/use-referral.ts @@ -2,7 +2,10 @@ import { removePaginationWrapper } from '@vegaprotocol/utils'; import { useCallback } from 'react'; import { useRefereesQuery } from './__generated__/Referees'; import compact from 'lodash/compact'; -import type { ReferralSetsQueryVariables } from './__generated__/ReferralSets'; +import type { + ReferralSetsQuery, + ReferralSetsQueryVariables, +} from './__generated__/ReferralSets'; import { useReferralSetsQuery } from './__generated__/ReferralSets'; import { useStakeAvailable } from './use-stake-available'; @@ -118,3 +121,36 @@ export const useReferral = (args: UseReferralArgs) => { refetch, }; }; + +const retrieveReferralSetData = (data: ReferralSetsQuery | undefined) => + data?.referralSets.edges && data.referralSets.edges.length > 0 + ? data.referralSets.edges[0]?.node + : undefined; + +export const useIsInReferralSet = (pubKey: string | null) => { + const [asRefereeVariables, asRefereeSkip] = prepareVariables({ + pubKey, + role: 'referee', + }); + const [asReferrerVariables, asReferrerSkip] = prepareVariables({ + pubKey, + role: 'referrer', + }); + + const { data: asRefereeData } = useReferralSetsQuery({ + variables: asRefereeVariables, + skip: asRefereeSkip, + fetchPolicy: 'cache-and-network', + }); + + const { data: asReferrerData } = useReferralSetsQuery({ + variables: asReferrerVariables, + skip: asReferrerSkip, + fetchPolicy: 'cache-and-network', + }); + + return Boolean( + retrieveReferralSetData(asRefereeData) || + retrieveReferralSetData(asReferrerData) + ); +}; diff --git a/apps/trading/client-pages/referrals/referral-statistics.tsx b/apps/trading/client-pages/referrals/referral-statistics.tsx index 98c31eaf9..be590704f 100644 --- a/apps/trading/client-pages/referrals/referral-statistics.tsx +++ b/apps/trading/client-pages/referrals/referral-statistics.tsx @@ -126,7 +126,7 @@ export const useStats = ({ t.discountFactor === discountFactorValue ); const nextBenefitTierValue = currentBenefitTierValue - ? benefitTiers.find((t) => t.tier === currentBenefitTierValue.tier - 1) + ? benefitTiers.find((t) => t.tier === currentBenefitTierValue.tier + 1) : minBy(benefitTiers, (bt) => bt.tier); // min tier number is lowest tier const epochsValue = !isNaN(currentEpoch) && refereeInfo?.atEpoch @@ -173,6 +173,7 @@ export const Statistics = ({ discountFactorValue, currentBenefitTierValue, epochsValue, + nextBenefitTierValue, nextBenefitTierVolumeValue, nextBenefitTierEpochsValue, } = useStats({ data, program, as }); @@ -300,7 +301,16 @@ export const Statistics = ({ ); const currentBenefitTierTile = ( - + {isApplyCodePreview ? currentBenefitTierValue?.tier || benefitTiers[0]?.tier || 'None' : currentBenefitTierValue?.tier || 'None'}