UNPKG

@rainbow-me/rainbowkit

Version:
48 lines (45 loc) 1.4 kB
"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 };