115 lines
2.2 KiB
TypeScript
115 lines
2.2 KiB
TypeScript
|
import { gql, useQuery } from '@apollo/client';
|
||
|
import { removePaginationWrapper } from '@vegaprotocol/utils';
|
||
|
|
||
|
const REFERRER_QUERY = gql`
|
||
|
query ReferralSets($partyId: ID!) {
|
||
|
referralSets(referrer: $partyId) {
|
||
|
edges {
|
||
|
node {
|
||
|
id
|
||
|
referrer
|
||
|
createdAt
|
||
|
updatedAt
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
`;
|
||
|
|
||
|
const REFEREE_QUERY = gql`
|
||
|
query ReferralSets($partyId: ID!) {
|
||
|
referralSets(referee: $partyId) {
|
||
|
edges {
|
||
|
node {
|
||
|
id
|
||
|
referrer
|
||
|
createdAt
|
||
|
updatedAt
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
`;
|
||
|
|
||
|
const REFEREES_QUERY = gql`
|
||
|
query ReferralSets($code: ID!) {
|
||
|
referralSetReferees(id: $code) {
|
||
|
edges {
|
||
|
node {
|
||
|
referralSetId
|
||
|
refereeId
|
||
|
joinedAt
|
||
|
atEpoch
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
`;
|
||
|
|
||
|
// TODO: generate types after perps work is merged
|
||
|
export type ReferralData = {
|
||
|
code: string;
|
||
|
referees: Array<{
|
||
|
refereeId: string;
|
||
|
joinedAt: string;
|
||
|
atEpoch: number;
|
||
|
}>;
|
||
|
};
|
||
|
|
||
|
export const useReferral = (
|
||
|
pubKey: string | null,
|
||
|
role: 'referrer' | 'referee'
|
||
|
) => {
|
||
|
const query = {
|
||
|
referrer: REFERRER_QUERY,
|
||
|
referee: REFEREE_QUERY,
|
||
|
};
|
||
|
|
||
|
const {
|
||
|
data: referralData,
|
||
|
loading: referralLoading,
|
||
|
error: referralError,
|
||
|
} = useQuery(query[role], {
|
||
|
variables: {
|
||
|
partyId: pubKey,
|
||
|
},
|
||
|
skip: !pubKey,
|
||
|
fetchPolicy: 'cache-and-network',
|
||
|
});
|
||
|
|
||
|
// A user can only have 1 active referral program at a time
|
||
|
const referral = referralData?.referralSets.edges.length
|
||
|
? referralData.referralSets.edges[0].node
|
||
|
: undefined;
|
||
|
|
||
|
const {
|
||
|
data: refereesData,
|
||
|
loading: refereesLoading,
|
||
|
error: refereesError,
|
||
|
} = useQuery(REFEREES_QUERY, {
|
||
|
variables: {
|
||
|
code: referral?.id,
|
||
|
},
|
||
|
skip: !referral?.id,
|
||
|
fetchPolicy: 'cache-and-network',
|
||
|
});
|
||
|
|
||
|
const referees = removePaginationWrapper(
|
||
|
refereesData?.referralSetReferees.edges
|
||
|
);
|
||
|
|
||
|
const data =
|
||
|
referral && refereesData
|
||
|
? {
|
||
|
code: referral.id,
|
||
|
referees,
|
||
|
}
|
||
|
: undefined;
|
||
|
|
||
|
return {
|
||
|
data: data as ReferralData | undefined,
|
||
|
loading: referralLoading || refereesLoading,
|
||
|
error: referralError || refereesError,
|
||
|
};
|
||
|
};
|