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