mirror of
https://github.com/MetaFam/TheGame.git
synced 2026-01-13 00:28:15 -05:00
63 lines
1.6 KiB
TypeScript
63 lines
1.6 KiB
TypeScript
import { Maybe } from '@metafam/utils';
|
|
import { useEffect, useState } from 'react';
|
|
|
|
import { Player } from '#graphql/autogen/hasura-sdk';
|
|
import { errorHandler } from '#utils/errorHandler';
|
|
|
|
export const useNFTCollectibles = ({
|
|
player: { ethereumAddress: owner },
|
|
}: {
|
|
player: Player;
|
|
}): {
|
|
data: any;
|
|
loading: boolean;
|
|
error: Maybe<string>;
|
|
} => {
|
|
const [data, setData] = useState<Array<any>>([]);
|
|
const [loading, setLoading] = useState<boolean>(false);
|
|
const [error, setError] = useState<Maybe<string>>(null);
|
|
|
|
useEffect(() => {
|
|
const load = async () => {
|
|
setLoading(true);
|
|
setError(null);
|
|
try {
|
|
const allData = await fetchAlchemyAllData(owner);
|
|
setData(allData);
|
|
} catch (err) {
|
|
errorHandler(err as Error);
|
|
setError((err as Error).message);
|
|
} finally {
|
|
setLoading(false);
|
|
}
|
|
};
|
|
if (owner) {
|
|
load();
|
|
}
|
|
}, [owner]);
|
|
|
|
return { data, loading, error };
|
|
};
|
|
|
|
const fetchAlchemyAllData = async (owner: string): Promise<Array<any>> => {
|
|
let offset = 0;
|
|
let data: Array<any> = [];
|
|
let lastData: Array<any> = [];
|
|
const limit = 50;
|
|
do {
|
|
// eslint-disable-next-line no-await-in-loop
|
|
lastData = await fetchAlchemyData(owner);
|
|
data = data.concat(lastData);
|
|
offset += limit;
|
|
} while (lastData.length > 0);
|
|
return data;
|
|
};
|
|
|
|
const fetchAlchemyData = async (owner: string): Promise<Array<any>> => {
|
|
const res = await fetch(`/api/alchemy?owner=${owner}`);
|
|
const body = await res.text();
|
|
const NFTs = JSON.parse(body);
|
|
if (!NFTs) throw new Error(`Received ${NFTs} assets`);
|
|
return NFTs;
|
|
};
|