Skip to content

Commit

Permalink
Refactoring use Tabs methods for custom contract fetching
Browse files Browse the repository at this point in the history
  • Loading branch information
hide-on-bush-x committed Aug 31, 2023
1 parent 7a76fce commit a65d0fc
Show file tree
Hide file tree
Showing 3 changed files with 70 additions and 42 deletions.
6 changes: 5 additions & 1 deletion src/refactor/masa/interfaces.ts
Expand Up @@ -15,7 +15,11 @@ export interface Metadata {
export interface TokenWithMetadata extends Token {
metadata: Metadata;
}
export interface HydratedContracts extends FullContract {

export interface FullContractWithTokens extends FullContract {
tokens: Token[];
}
export interface HydratedContract extends FullContract {
tokens: TokenWithMetadata[];
}

Expand Down
100 changes: 62 additions & 38 deletions src/refactor/masa/use-custom-sbt.ts
Expand Up @@ -9,7 +9,8 @@ import { useSession } from './use-session';
import type {
CustomGallerySBT,
FullContract,
HydratedContracts,
FullContractWithTokens,
HydratedContract,
Token,
TokenWithMetadata,
} from './interfaces';
Expand Down Expand Up @@ -73,6 +74,63 @@ export const useCustomGallerySBT = () => {
};
};

export const fetchContractsAndTokens = async (
customContracts: FullContract[]
): Promise<FullContractWithTokens[]> => {
const contractPromises = customContracts.map(
async (contract: FullContract) => {
if (contract.contract) {
try {
const tokens: Token[] = await contract.list();
return {
...contract,
tokens,
} as FullContractWithTokens;
} catch (error) {
console.log('LIST TOKENS ERROR', error);
}
}
return null;
}
);
const contractsAndTokens = await Promise.all(contractPromises);

return contractsAndTokens.filter(Boolean) as FullContractWithTokens[];
};

export const hydrateTokensWithMetadata = async (
contractsAndTokens: FullContractWithTokens[]
): Promise<HydratedContract[]> => {
const contractPromises = contractsAndTokens.map(
async (contract: FullContractWithTokens) => {
if (!contract.getMetadata) {
return { ...contract, tokens: [] };
}

const tokenPromises = contract.tokens.map(async (token: Token) => {
try {
const metadata = await contract.getMetadata(token);
return { metadata, ...token };
} catch (error) {
console.log('METADATA ERROR', error);
return null;
}
});

const hydratedTokens = (await Promise.all(tokenPromises)).filter(
Boolean
) as TokenWithMetadata[];
return { ...contract, tokens: hydratedTokens } as HydratedContract;
}
);

const hydratedContracts = (await Promise.all(
contractPromises
)) as HydratedContract[];

return hydratedContracts;
};

export const useCustomSBTs = () => {
const { masaAddress, masaNetwork } = useMasaClient();
const canQuery = useCanQuery();
Expand All @@ -83,44 +141,10 @@ export const useCustomSBTs = () => {
const [, getCustomContracts] = useAsyncFn(async () => {
if (!canQuery) return null;

const hydratedContractsPromises = customContracts.map(
async (contract: FullContract) => {
if (!contract.contract) return null;

try {
const tokens: Token[] = await contract.list();

// Fetch metadata for all tokens concurrently if the getMetadata method exists
const tokensWithMetadataPromises = contract.getMetadata
? tokens.map(async (token: Token) => {
try {
const metadata = await contract.getMetadata(token);
return { metadata, ...token } as TokenWithMetadata;
} catch (error) {
console.log('METADATA ERROR', error);
return null;
}
})
: [];

const tokensWithMetadata = (
await Promise.all(tokensWithMetadataPromises)
).filter(Boolean) as TokenWithMetadata[];

return {
...contract,
tokens: tokensWithMetadata,
} as HydratedContracts;
} catch (error) {
console.log('LIST TOKENS ERROR', error);
return null;
}
}
);
const contractsAndTokens = await fetchContractsAndTokens(customContracts);
const hydratedContracts =
await hydrateTokensWithMetadata(contractsAndTokens);

const hydratedContracts = (
await Promise.all(hydratedContractsPromises)
).filter(Boolean) as HydratedContracts[];
return hydratedContracts;
}, [canQuery, customContracts]);

Expand Down
6 changes: 3 additions & 3 deletions src/refactor/ui/components/modals/gallery/useTabs.tsx
Expand Up @@ -3,7 +3,7 @@ import { useMasaClient } from '../../../../masa-client';
import { useCustomSBTs } from '../../../../masa/use-custom-sbt';
import {
GalleryMetadata,
HydratedContracts,
HydratedContract,
TabsInterface,
TokenWithMetadata,
} from '../../../../masa/interfaces';
Expand All @@ -17,12 +17,12 @@ export const useTabs = () => {
return [];

const customSBTsWithTokens = customSBTs.filter(
(contract: HydratedContracts) =>
(contract: HydratedContract) =>
contract.tokens && contract.tokens.length > 0
);

const newTabs: TabsInterface[] = customSBTsWithTokens.map(
(customSBT: HydratedContracts) => {
(customSBT: HydratedContract) => {
const { tokens } = customSBT;

const items = tokens.map((token: TokenWithMetadata) => {
Expand Down

0 comments on commit a65d0fc

Please sign in to comment.