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/>.
|
* 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;
|
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
|
// Proxies demand that these properties be unmodified, so proxyLazy
|
||||||
|
@ -85,6 +93,8 @@ export function proxyLazy<T>(factory: () => T, attempts = 5): T {
|
||||||
[kGET]() {
|
[kGET]() {
|
||||||
if (!proxyDummy[kCACHE] && attempts > tries++) {
|
if (!proxyDummy[kCACHE] && attempts > tries++) {
|
||||||
proxyDummy[kCACHE] = factory();
|
proxyDummy[kCACHE] = factory();
|
||||||
|
if (!proxyDummy[kCACHE] && attempts === tries)
|
||||||
|
console.error("Lazy factory failed:", factory);
|
||||||
}
|
}
|
||||||
return proxyDummy[kCACHE];
|
return proxyDummy[kCACHE];
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,6 +21,8 @@ import { React, useEffect, useMemo, useReducer, useState } from "@webpack/common
|
||||||
import { makeLazy } from "./lazy";
|
import { makeLazy } from "./lazy";
|
||||||
import { checkIntersecting } from "./misc";
|
import { checkIntersecting } from "./misc";
|
||||||
|
|
||||||
|
export const NoopComponent = () => null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check if an element is on screen
|
* Check if an element is on screen
|
||||||
* @param intersectOnly If `true`, will only update the state when the element comes into view
|
* @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
|
* A lazy component. The factory method is called on first render. For example useful
|
||||||
* for const Component = LazyComponent(() => findByDisplayName("...").default)
|
* for const Component = LazyComponent(() => findByDisplayName("...").default)
|
||||||
* @param factory Function returning a Component
|
* @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
|
* @returns Result of factory function
|
||||||
*/
|
*/
|
||||||
|
|
||||||
export function LazyComponent<T extends object = any>(factory: () => React.ComponentType<T>) {
|
export function LazyComponent<T extends object = any>(factory: () => React.ComponentType<T>, attempts = 5) {
|
||||||
const get = makeLazy(factory);
|
const get = makeLazy(factory, attempts);
|
||||||
return (props: T) => {
|
return (props: T) => {
|
||||||
const Component = get();
|
const Component = get() ?? NoopComponent;
|
||||||
return <Component {...props} />;
|
return <Component {...props} />;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue