add max attempts to lazys
This commit is contained in:
parent
ac0f834155
commit
08c5d23636
|
@ -16,9 +16,17 @@
|
|||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
export function makeLazy<T>(factory: () => T): () => T {
|
||||
export function makeLazy<T>(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<T>(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];
|
||||
}
|
||||
|
|
|
@ -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<T extends object = any>(factory: () => React.ComponentType<T>) {
|
||||
const get = makeLazy(factory);
|
||||
export function LazyComponent<T extends object = any>(factory: () => React.ComponentType<T>, attempts = 5) {
|
||||
const get = makeLazy(factory, attempts);
|
||||
return (props: T) => {
|
||||
const Component = get();
|
||||
const Component = get() ?? NoopComponent;
|
||||
return <Component {...props} />;
|
||||
};
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue