Files
TheGame/packages/web/graphql/getPatrons.ts
Pacien Boisson dfff04ebaa [Quests] Frontend (#437)
* squash frontend changes

* Style quest explorer

* Style quest page

* Dates

* Dates

* Typecheck

* Prettier

* Fix create page layout

* Update only OPEN quests

* Repetition info

* Fix create quest errors

* Quest form Textarea

* Quest form Textarea

* Truncate texts

* Redirect if user not logged in

* Tooltips

* Factorize skills tags

* fix username in completions

* Metafam as default guild on creation

* Layouts

* Remove todo

* cooldown

* Rename to "claim quest"

* squash frontend changes

* Style quest explorer

* Style quest page

* Dates

* Dates

* Typecheck

* Prettier

* Fix create page layout

* Update only OPEN quests

* Repetition info

* Fix create quest errors

* Quest form Textarea

* Quest form Textarea

* Truncate texts

* Redirect if user not logged in

* Tooltips

* Factorize skills tags

* fix username in completions

* Metafam as default guild on creation

* Layouts

* Remove todo

* cooldown

* Rename to "claim quest"

* Move ConfirmModal in ds

* Extract pSeed balance

* Fix "created by me" switch

* Reword complete quest

* Style quest form

* prettier

* lint
2021-04-08 15:32:27 +04:00

112 lines
2.4 KiB
TypeScript

import gql from 'fake-tag';
import {
GetPatronsQuery,
GetPatronsQueryVariables,
GetpSeedHoldersQuery,
GetpSeedHoldersQueryVariables,
PlayerFragmentFragment,
TokenBalancesFragmentFragment,
} from './autogen/types';
import { client } from './client';
import { PlayerFragment, TokenBalancesFragment } from './fragments';
import { Patron } from './types';
// eslint-disable-next-line @typescript-eslint/no-unused-expressions
gql`
query GetpSeedBalance($address: String!) {
getTokenBalances(address: $address) {
...TokenBalancesFragment
}
}
${TokenBalancesFragment}
`;
const patronsQuery = gql`
query GetPatrons($addresses: [String!], $limit: Int) {
player(where: { ethereum_address: { _in: $addresses } }, limit: $limit) {
...PlayerFragment
}
}
${PlayerFragment}
`;
const pSeedHoldersQuery = gql`
query GetpSeedHolders($limit: Int) {
pSeedHolders: getTopPSeedHolders(limit: $limit) {
...TokenBalancesFragment
}
}
${TokenBalancesFragment}
`;
const getPlayersFromAddresses = async (
addresses: Array<string>,
limit: number,
): Promise<Array<PlayerFragmentFragment>> => {
const { data, error } = await client
.query<GetPatronsQuery, GetPatronsQueryVariables>(patronsQuery, {
addresses,
limit,
})
.toPromise();
if (!data) {
if (error) {
throw error;
}
return [];
}
return data.player;
};
const getpSeedHolders = async (
limit: number,
): Promise<Array<TokenBalancesFragmentFragment>> => {
const { data, error } = await client
.query<GetpSeedHoldersQuery, GetpSeedHoldersQueryVariables>(
pSeedHoldersQuery,
{
limit,
},
)
.toPromise();
if (!data || !data.pSeedHolders) {
if (error) {
throw error;
}
return [];
}
return data.pSeedHolders;
};
export const getPatrons = async (limit = 50): Promise<Array<Patron>> => {
const tokenBalances: Array<TokenBalancesFragmentFragment> = await getpSeedHolders(
limit,
);
const players: Array<PlayerFragmentFragment> = await getPlayersFromAddresses(
tokenBalances.map((u) => u.address),
limit,
);
const patrons: Array<Patron> = tokenBalances.reduce<Array<Patron>>(
(res, u) => {
const player = players.find((p) => p.ethereum_address === u.address);
if (player) {
const patron = { ...player, pSeedBalance: u.pSeedBalance } as Patron;
res.push(patron);
}
return res;
},
[],
);
return patrons;
};