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.

115 lines (114 loc) 6.34 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.useNFT = exports.DEFAULT_FETCH_STRATEGY = exports.NftDataFetchStrategy = void 0; const tslib_1 = require("tslib"); const react_1 = require("react"); const NFTFetchContext_1 = require("../context/NFTFetchContext"); const useOpenseaNFT_1 = require("./useOpenseaNFT"); const addresses_1 = require("../constants/addresses"); const useNFTIndexer_1 = require("./useNFTIndexer"); const useBlockchainNFT_1 = require("./useBlockchainNFT"); const swr_1 = tslib_1.__importDefault(require("swr")); const ExtractResultData_1 = require("../fetcher/ExtractResultData"); const TransformFetchResults_1 = require("../fetcher/TransformFetchResults"); const ErrorUtils_1 = require("../fetcher/ErrorUtils"); const useNFTIndexerV2_1 = require("./useNFTIndexerV2"); var NftDataFetchStrategy; (function (NftDataFetchStrategy) { NftDataFetchStrategy[NftDataFetchStrategy["ZoraIndexer"] = 1] = "ZoraIndexer"; NftDataFetchStrategy[NftDataFetchStrategy["Opensea"] = 2] = "Opensea"; NftDataFetchStrategy[NftDataFetchStrategy["Blockchain"] = 4] = "Blockchain"; NftDataFetchStrategy[NftDataFetchStrategy["ZoraIndexerV2"] = 8] = "ZoraIndexerV2"; NftDataFetchStrategy[NftDataFetchStrategy["AllIndexers"] = 11] = "AllIndexers"; NftDataFetchStrategy[NftDataFetchStrategy["All"] = 15] = "All"; })(NftDataFetchStrategy = exports.NftDataFetchStrategy || (exports.NftDataFetchStrategy = {})); exports.DEFAULT_FETCH_STRATEGY = NftDataFetchStrategy.Opensea; const swrConfigurationDefault = { refreshInterval: 60000, errorRetryInterval: 5000, errorRetryCount: 5, onErrorRetry: ErrorUtils_1.onErrorRetry, revalidateOnFocus: true }; const auctionSwrConfigurationDefault = { refreshInterval: 15000, errorRetryInterval: 5000, errorRetryCount: 5, onErrorRetry: ErrorUtils_1.onErrorRetry, revalidateOnFocus: true }; const currencySwrConfigurationDefault = { refreshInterval: 60000, errorRetryInterval: 5000, errorRetryCount: 5, onErrorRetry: ErrorUtils_1.onErrorRetry, revalidateOnFocus: true }; /** * Fetches on-chain NFT data and pricing for the given zNFT id * * @param contractAddress address of the contract, if null and tokenID is passed in, a ZNFT is assumed * @param tokenId id of NFT to fetch blockchain information for * @param options custom options and an option to load currency info * @param swrConfiguration SWR flags configuration * @returns useNFTType hook results include loading, error, and chainNFT data. */ function useNFT(contractAddress, tokenId, options = {}, swrConfiguration = swrConfigurationDefault, auctionSwrConfiguration = auctionSwrConfigurationDefault, currencySwrConfiguration = currencySwrConfigurationDefault) { const fetchStrategy = options.fetchStrategy || exports.DEFAULT_FETCH_STRATEGY; const fetcher = react_1.useContext(NFTFetchContext_1.NFTFetchContext); const resolvedContractAddress = !contractAddress ? addresses_1.ZORA_MEDIA_CONTRACT_BY_NETWORK[fetcher.networkId] : contractAddress; let hasOpensea = (fetchStrategy & NftDataFetchStrategy.Opensea) != 0; let hasZora = (fetchStrategy & NftDataFetchStrategy.ZoraIndexer) != 0; let hasZoraV2 = (fetchStrategy & NftDataFetchStrategy.ZoraIndexerV2) != 0; let hasBlockchain = (fetchStrategy & NftDataFetchStrategy.Blockchain) != 0; const openseaNFT = useOpenseaNFT_1.useOpenseaNFT(hasOpensea ? resolvedContractAddress : undefined, hasOpensea ? tokenId : undefined, swrConfiguration, options.requireData); const betaIndexerNFT = useNFTIndexer_1.useZoraNFTIndexer(hasZora ? resolvedContractAddress : undefined, hasZora ? tokenId : undefined, swrConfiguration, options.requireData); const zoraIndexerNFTV2 = useNFTIndexerV2_1.useZoraNFTIndexerV2(hasZoraV2 ? resolvedContractAddress : undefined, hasZoraV2 ? tokenId : undefined, swrConfiguration, options.requireData); const blockchainNFT = useBlockchainNFT_1.useBlockchainNFT(hasBlockchain ? resolvedContractAddress : undefined, hasBlockchain ? tokenId : undefined, swrConfiguration); const auctionData = swr_1.default(contractAddress && tokenId ? ['loadAuctionForNFT', contractAddress, tokenId] : null, (_, contractAddress, tokenId) => fetcher.loadAuctionInfo(contractAddress, tokenId), auctionSwrConfiguration); let data; if (hasOpensea && openseaNFT.data && openseaNFT.data != swrConfiguration.initialData) { data = openseaNFT; } else if (hasZoraV2 && zoraIndexerNFTV2.data && zoraIndexerNFTV2.data != swrConfiguration.initialData) { data = zoraIndexerNFTV2; } else if (hasZora && betaIndexerNFT.data && betaIndexerNFT.data != swrConfiguration.initialData) { data = betaIndexerNFT; } else if (hasBlockchain && blockchainNFT.data && blockchainNFT.data != swrConfiguration.initialData) { data = blockchainNFT; } else { //if all failed - take error. if ((!hasOpensea || !!openseaNFT.error) && (!hasZoraV2 || !!zoraIndexerNFTV2.error) && (!hasZora || !!betaIndexerNFT.error) && (!hasBlockchain || !!blockchainNFT.error)) { data = [openseaNFT, zoraIndexerNFTV2, betaIndexerNFT, blockchainNFT].find(data => !!data.error); } else { data = openseaNFT; //take any (initial data). } } const nftResponseData = data.data; const currencyData = swr_1.default(nftResponseData && options.loadCurrencyInfo ? ['loadCurrencies', ...ExtractResultData_1.getCurrenciesInUse(TransformFetchResults_1.addAuctionInformation({ reserve: TransformFetchResults_1.auctionDataToPricing(auctionData.data), }))] : null, (_, ...currencies) => fetcher.loadCurrencies(currencies), currencySwrConfiguration); if (data.data && auctionData.data) { data.data.pricing = TransformFetchResults_1.addAuctionInformation({ reserve: TransformFetchResults_1.auctionDataToPricing(auctionData.data), }, currencyData.data); } return { currencyLoaded: !!currencyData.data, error: data.error, data: data.data, }; } exports.useNFT = useNFT;