@rainbow-me/rainbowkit
Version:
The best way to connect a wallet
48 lines (45 loc) • 1.4 kB
JavaScript
"use client";
// src/components/AsyncImage/useAsyncImage.ts
import { useEffect, useReducer } from "react";
var cachedUrls = /* @__PURE__ */ new Map();
var cachedRequestPromises = /* @__PURE__ */ new Map();
async function loadAsyncImage(asyncImage) {
const cachedRequestPromise = cachedRequestPromises.get(asyncImage);
if (cachedRequestPromise) {
return cachedRequestPromise;
}
const load = async () => asyncImage().then(async (url) => {
cachedUrls.set(asyncImage, url);
return url;
});
const requestPromise = load().catch((_err) => {
return load().catch((_err2) => {
cachedRequestPromises.delete(asyncImage);
});
});
cachedRequestPromises.set(asyncImage, requestPromise);
return requestPromise;
}
async function loadImages(...urls) {
return await Promise.all(
urls.map((url) => typeof url === "function" ? loadAsyncImage(url) : url)
);
}
function useForceUpdate() {
const [, forceUpdate] = useReducer((x) => x + 1, 0);
return forceUpdate;
}
function useAsyncImage(url) {
const cachedUrl = typeof url === "function" ? cachedUrls.get(url) : void 0;
const forceUpdate = useForceUpdate();
useEffect(() => {
if (typeof url === "function" && !cachedUrl) {
loadAsyncImage(url).then(forceUpdate);
}
}, [url, cachedUrl, forceUpdate]);
return typeof url === "function" ? cachedUrl : url;
}
export {
loadImages,
useAsyncImage
};