diff --git a/src/utils/lazy.ts b/src/utils/lazy.ts index 55aae5ea..4bac45bc 100644 --- a/src/utils/lazy.ts +++ b/src/utils/lazy.ts @@ -16,9 +16,17 @@ * along with this program. If not, see . */ -export function makeLazy(factory: () => T): () => T { +export function makeLazy(factory: () => T, attempts = 5): () => T { + let tries = 0; let cache: T; - return () => cache ?? (cache = factory()); + return () => { + if (!cache && attempts > tries++) { + cache = factory(); + if (!cache && attempts === tries) + console.error("Lazy factory failed:", factory); + } + return cache; + }; } // Proxies demand that these properties be unmodified, so proxyLazy @@ -85,6 +93,8 @@ export function proxyLazy(factory: () => T, attempts = 5): T { [kGET]() { if (!proxyDummy[kCACHE] && attempts > tries++) { proxyDummy[kCACHE] = factory(); + if (!proxyDummy[kCACHE] && attempts === tries) + console.error("Lazy factory failed:", factory); } return proxyDummy[kCACHE]; } diff --git a/src/utils/react.tsx b/src/utils/react.tsx index e8c10815..0181c95b 100644 --- a/src/utils/react.tsx +++ b/src/utils/react.tsx @@ -21,6 +21,8 @@ import { React, useEffect, useMemo, useReducer, useState } from "@webpack/common import { makeLazy } from "./lazy"; import { checkIntersecting } from "./misc"; +export const NoopComponent = () => null; + /** * Check if an element is on screen * @param intersectOnly If `true`, will only update the state when the element comes into view @@ -125,13 +127,14 @@ export function useForceUpdater(withDep?: true) { * A lazy component. The factory method is called on first render. For example useful * for const Component = LazyComponent(() => findByDisplayName("...").default) * @param factory Function returning a Component + * @param attempts How many times to try to get the component before giving up * @returns Result of factory function */ -export function LazyComponent(factory: () => React.ComponentType) { - const get = makeLazy(factory); +export function LazyComponent(factory: () => React.ComponentType, attempts = 5) { + const get = makeLazy(factory, attempts); return (props: T) => { - const Component = get(); + const Component = get() ?? NoopComponent; return ; }; }