vega-frontend-monorepo/apps/trading/client-pages/referrals/hooks/use-find-referral-set.ts
2024-03-08 19:24:49 +01:00

123 lines
2.9 KiB
TypeScript

import { useCallback } from 'react';
import {
type ReferralSetsQueryVariables,
useReferralSetsQuery,
} from './__generated__/ReferralSets';
import { useStakeAvailable } from '../../../lib/hooks/use-stake-available';
export type Role = 'referrer' | 'referee';
type Args = (
| { setId: string | undefined }
| { pubKey: string | undefined; role: Role }
) & {
aggregationEpochs?: number;
};
export const prepareVariables = (
args: Args
): [ReferralSetsQueryVariables, boolean] => {
const byId = 'setId' in args;
const byRole = 'pubKey' in args && 'role' in args;
let variables = {};
let skip = true;
if (byId) {
variables = {
id: args.setId,
};
skip = !args.setId;
}
if (byRole) {
if (args.role === 'referee') {
variables = { referee: args.pubKey };
}
if (args.role === 'referrer') {
variables = { referrer: args.pubKey };
}
skip = !args.pubKey;
}
return [variables, skip];
};
export const useFindReferralSet = (pubKey?: string) => {
const [referrerVariables, referrerSkip] = prepareVariables({
pubKey,
role: 'referrer',
});
const [refereeVariables, refereeSkip] = prepareVariables({
pubKey,
role: 'referee',
});
const {
data: referrerData,
loading: referrerLoading,
error: referrerError,
refetch: referrerRefetch,
} = useReferralSetsQuery({
variables: referrerVariables,
skip: referrerSkip,
fetchPolicy: 'cache-and-network',
});
const {
data: refereeData,
loading: refereeLoading,
error: refereeError,
refetch: refereeRefetch,
} = useReferralSetsQuery({
variables: refereeVariables,
skip: refereeSkip,
fetchPolicy: 'cache-and-network',
});
const set =
referrerData?.referralSets.edges[0]?.node ||
refereeData?.referralSets.edges[0]?.node;
const role: Role | undefined = set
? set?.referrer === pubKey
? 'referrer'
: 'referee'
: undefined;
const { isEligible } = useStakeAvailable(set?.referrer);
const refetch = useCallback(() => {
referrerRefetch();
refereeRefetch();
}, [refereeRefetch, referrerRefetch]);
return {
data: set,
role,
loading: referrerLoading || refereeLoading,
error: referrerError || refereeError,
refetch,
isEligible: set ? isEligible : undefined,
};
};
export const useReferralSet = (setId?: string) => {
const [variables, skip] = prepareVariables({ setId });
const { data, loading, error, refetch } = useReferralSetsQuery({
variables,
skip,
fetchPolicy: 'cache-and-network',
});
const set = data?.referralSets.edges[0]?.node;
const { isEligible } = useStakeAvailable(set?.referrer);
return {
data: set,
loading,
error,
refetch,
isEligible: set ? isEligible : undefined,
};
};
export const useIsInReferralSet = (pubKey: string | undefined) => {
const { data } = useFindReferralSet(pubKey);
return Boolean(data);
};