UNPKG

@cross-nft-marketplace/auction-house-nft-hooks

Version:

Generic react hooks for fetching cross-nft-marketplace auctions, nfts, and data on arbitary 721s. Powers nft-components.

132 lines (131 loc) 5.61 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.fetchNFTData = exports.prepareJson = void 0; const useNFT_1 = require("../hooks/useNFT"); const addresses_1 = require("../constants/addresses"); const OpenseaUtils_1 = require("./OpenseaUtils"); const ZoraIndexerTransformers_1 = require("./ZoraIndexerTransformers"); const BlockchainUtils_1 = require("./BlockchainUtils"); const ErrorUtils_1 = require("./ErrorUtils"); const polyfill_1 = require("../utils/polyfill"); const data_1 = require("../utils/data"); /** * This removes undefined values to sanitize * data objects to work with nextJS server-side * page props. * * @param json Object to sanitize for JSON fields * @returns JSON-safe object */ function prepareJson(json) { return JSON.parse(JSON.stringify(json)); } exports.prepareJson = prepareJson; /** * Async function to fetch auction information and metadata for any * NFT or zNFT. Mirrors behavior of useNFT hook but for server-side rendering. * Fetches all metadata and auction information server-side. Will be re-validated client-side. * Can pass return value directly into `initialData` for useNFT hook. * * @param tokenId: Token ID to fetch * @param contractAddress: Contract address to fetch token from * @param fetchAgent: MediaFetchAgent instance * @param prepareDataJSON: Sanitizes undefined fields to allow data to work with next.js * @returns object with nft and metadata fields, any issues throw an RequestError */ const fetchNFTData = async ({ tokenId, contractAddress, fetchAgent, prepareDataJSON = true, fetchStrategy = useNFT_1.DEFAULT_FETCH_STRATEGY, loadAuctionInfo = true, requireData = false, }) => { let promises = []; if (contractAddress == null) { contractAddress = addresses_1.ZORA_MEDIA_CONTRACT_BY_NETWORK[fetchAgent.networkId]; } //todo also validate data in response. let auctionData; if (loadAuctionInfo) { try { auctionData = await fetchAgent.loadAuctionInfo(contractAddress, tokenId); } catch (err) { if (!(err instanceof ErrorUtils_1.NotFoundError)) { // Log any not-found error console.error(err); } } } //todo stallTimeout, priority as in FallbackProvider. let hasOpensea = (fetchStrategy & useNFT_1.NftDataFetchStrategy.Opensea) != 0; let hasZoraV2 = (fetchStrategy & useNFT_1.NftDataFetchStrategy.ZoraIndexerV2) != 0; let hasZora = (fetchStrategy & useNFT_1.NftDataFetchStrategy.ZoraIndexer) != 0; let hasBlockchain = (fetchStrategy & useNFT_1.NftDataFetchStrategy.Blockchain) != 0; if (hasOpensea) { promises.push(fetchAgent.loadNFTData(contractAddress, tokenId, auctionData).then(nft => { const metadata = OpenseaUtils_1.openseaDataToMetadata(nft); if (requireData && !data_1.hasOpenseaData(nft)) { throw new Error('Empty data'); } return { nft, metadata, }; })); } if (hasZoraV2) { promises.push(fetchAgent.loadZoraNFTIndexerV2NFTUntransformed(contractAddress, tokenId).then(untransformedNft => { var _a; let nft = ZoraIndexerTransformers_1.transformNFTIndexerV2Response(untransformedNft, auctionData); if (requireData && !data_1.hasZoraData(nft)) { throw new Error('Empty data'); } const response = { nft, metadata: (_a = nft.zoraIndexerResponse.metadata) === null || _a === void 0 ? void 0 : _a.json, }; return response; })); } if (hasZora) { promises.push(fetchAgent.loadZoraNFTIndexerNFTUntransformed(contractAddress, tokenId).then(untransformedNft => { var _a; let nft = ZoraIndexerTransformers_1.transformNFTIndexerResponse(untransformedNft, auctionData); if (requireData && !data_1.hasZoraData(nft)) { throw new Error('Empty data'); } const response = { nft, metadata: (_a = nft.zoraIndexerResponse.metadata) === null || _a === void 0 ? void 0 : _a.json, }; return response; })); } if (hasBlockchain) { let promise = new Promise((resolve, reject) => { (async () => { var _a; try { let nftUntransformed = await fetchAgent.loadBlockchainNFTDataUntransformed(contractAddress, tokenId); let nft = BlockchainUtils_1.transformBlockchainResponse(nftUntransformed, auctionData); let metadata = await fetchAgent.fetchIPFSMetadata(((_a = nft.zoraNFT) === null || _a === void 0 ? void 0 : _a.metadataURI) || nft.nft.metadataURI); const response = { nft, metadata, }; resolve(response); } catch (error) { reject(error); } })(); }); promises.push(promise); } try { const response = await polyfill_1.promiseAny(promises); if (prepareDataJSON) { return prepareJson(response); } return response; } catch (error) { throw error[0]; //throw first error } }; exports.fetchNFTData = fetchNFTData;