@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
JavaScript
;
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;