@ispb/react-lazy 0.0.8 → 0.0.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -1
- package/dist/async.d.ts +1 -1
- package/dist/async.js.map +1 -1
- package/dist/components.js +34 -5
- package/dist/components.js.map +1 -1
- package/dist/hooks.d.ts +6 -10
- package/dist/hooks.js +22 -86
- package/dist/hooks.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/internal.d.ts +5 -0
- package/dist/internal.js +24 -1
- package/dist/internal.js.map +1 -1
- package/dist/lazy.d.ts +16 -0
- package/dist/lazy.js +92 -0
- package/dist/lazy.js.map +1 -0
- package/dist/operators.d.ts +16 -0
- package/dist/operators.js +92 -0
- package/dist/operators.js.map +1 -0
- package/dist/types.d.ts +12 -13
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -112,7 +112,15 @@ import { LazyContext } from "@ispb/react-lazy"
|
|
|
112
112
|
</LazyContext.Provider>
|
|
113
113
|
```
|
|
114
114
|
|
|
115
|
-
Available options are `onLoading`, `onReloading`, `onError`, `defaultMessage`, `loadingMessage`, `reloadingMessage`, and `
|
|
115
|
+
Available options are `onLoading`, `onReloading`, `onError`, `defaultMessage`, `loadingMessage`, `reloadingMessage`, `errorMessage`, and `delay`. Per-component overrides take precedence over context options.
|
|
116
|
+
|
|
117
|
+
Set `delay` (in milliseconds) to avoid flicker for loads that usually finish quickly. Until loading has lasted that long, an initial load renders nothing instead of `onLoading`, and a reload keeps showing the previous content without marking it as reloading (`onReloading` receives `reloading: false`, and the render function's state has `isLoading: false`):
|
|
118
|
+
|
|
119
|
+
```tsx
|
|
120
|
+
<LazyContext.Provider value={{ delay: 200, onLoading: () => <Spinner /> }}>
|
|
121
|
+
{children}
|
|
122
|
+
</LazyContext.Provider>
|
|
123
|
+
```
|
|
116
124
|
|
|
117
125
|
## Hooks
|
|
118
126
|
|
|
@@ -124,6 +132,8 @@ Available options are `onLoading`, `onReloading`, `onError`, `defaultMessage`, `
|
|
|
124
132
|
- `useLazyAsPromise` and `useLazyAsObservable` adapt a lazy event to a promise or RxJS subject.
|
|
125
133
|
- `isLoading`, `isFulfilled`, and `isRejected` are type guards for lazy events.
|
|
126
134
|
|
|
135
|
+
The mapping hooks are memoized wrappers around plain functions that can be used outside React: `lazyMap`, `lazyChain`, `lazyFlatten`, and `lazyCombine`.
|
|
136
|
+
|
|
127
137
|
The package also exports `Asyncified`, `asyncified`, `Observing`, `observing`, `Lazy`, and `lazified` for component-based and higher-order-component integrations.
|
|
128
138
|
|
|
129
139
|
## License
|
package/dist/async.d.ts
CHANGED
|
@@ -3,6 +3,7 @@ import { ValueOrFactory } from "value-or-factory";
|
|
|
3
3
|
import { LazyHOCOptions } from "./hoc.js";
|
|
4
4
|
import { LazyState } from "./state.js";
|
|
5
5
|
import { LazyEvent, LazyOverrides } from "./types.js";
|
|
6
|
+
export type Retry = (suppressReload?: boolean | undefined) => void;
|
|
6
7
|
/**
|
|
7
8
|
* Options for the async hook.
|
|
8
9
|
* @typeParam D The data type.
|
|
@@ -33,7 +34,6 @@ export type AsyncLazyState<D> = LazyState<D> & {
|
|
|
33
34
|
export interface AsyncifiedOptions<D, P> extends AsyncLazyOptions<D>, LazyHOCOptions<AsyncLazyState<D>, P> {
|
|
34
35
|
}
|
|
35
36
|
export declare function asyncified<I extends {}, D extends {}, P extends {}>(factory: (props: I) => AsyncifiedOptions<D, P>): (component: import("react").ComponentType<D & P>) => (props: I) => import("react").JSX.Element;
|
|
36
|
-
export type Retry = (suppressReload?: boolean | undefined) => void;
|
|
37
37
|
export interface AsyncifiedProps<D> extends AsyncLazyOptions<D> {
|
|
38
38
|
readonly children: ValueOrFactory<ReactNode, [D, AsyncLazyState<D>]>;
|
|
39
39
|
/**
|
package/dist/async.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"async.js","sourceRoot":"","sources":["../src/async.tsx"],"names":[],"mappings":";AACA,OAAO,EAAa,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AACnE,OAAO,EAAkB,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAC5D,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AACtC,OAAO,EAAkB,QAAQ,EAAE,MAAM,UAAU,CAAA;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"async.js","sourceRoot":"","sources":["../src/async.tsx"],"names":[],"mappings":";AACA,OAAO,EAAa,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AACnE,OAAO,EAAkB,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAC5D,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AACtC,OAAO,EAAkB,QAAQ,EAAE,MAAM,UAAU,CAAA;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAmC/C,MAAM,UAAU,YAAY,CAAI,KAAmD;IAC/E,MAAM,OAAO,GAAG,OAAO,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAA;IACxE,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAe,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAA;IAC7J,MAAM,GAAG,GAAG,WAAW,CAAC,CAAC,UAA2B,EAAE,EAAE;QACpD,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;YAChD,QAAQ,CAAC;gBACL,MAAM,EAAE,WAAW;gBACnB,KAAK;aACR,CAAC,CAAA;QACN,CAAC,EAAE,MAAM,CAAC,EAAE;YACR,QAAQ,CAAC;gBACL,MAAM,EAAE,UAAU;gBAClB,MAAM;aACT,CAAC,CAAA;QACN,CAAC,CAAC,CAAA;IACN,CAAC,EAAE;QACC,OAAO,CAAC,OAAO;KAClB,CAAC,CAAA;IACF,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,cAAc,GAAG,KAAK,EAAE,EAAE;QACjD,IAAI,CAAC,cAAc,EAAE,CAAC;YAClB,QAAQ,CAAC;gBACL,MAAM,EAAE,SAAS;aACpB,CAAC,CAAA;QACN,CAAC;QACD,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAA;QACxC,GAAG,CAAC,UAAU,CAAC,CAAA;QACf,OAAO,GAAG,EAAE;YACR,UAAU,CAAC,KAAK,EAAE,CAAA;QACtB,CAAC,CAAA;IACL,CAAC,EAAE;QACC,GAAG;KACN,CAAC,CAAA;IACF,MAAM,YAAY,GAAG,eAAe,EAAE,CAAA;IACtC,SAAS,CAAC,GAAG,EAAE;QACX,IAAI,YAAY,EAAE,CAAC;YACf,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;gBAC9B,OAAM;YACV,CAAC;QACL,CAAC;aACI,CAAC;YACF,QAAQ,CAAC;gBACL,MAAM,EAAE,SAAS;aACpB,CAAC,CAAA;QACN,CAAC;QACD,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAA;QACxC,GAAG,CAAC,UAAU,CAAC,CAAA;QACf,OAAO,GAAG,EAAE;YACR,UAAU,CAAC,KAAK,EAAE,CAAA;QACtB,CAAC,CAAA;IACL,CAAC,EAAE;QACC,GAAG;KACN,CAAC,CAAA;IACF,OAAO;QACH,GAAG,KAAK;QACR,KAAK;KACR,CAAA;AACL,CAAC;AAOD,MAAM,UAAU,UAAU,CAA2C,OAA8C;IAC/G,OAAO,QAAQ,CAAC,CAAC,KAAQ,EAAE,EAAE;QACzB,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAA;QAC9B,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,CAAA;QACnC,OAAO;YACH,KAAK;YACL,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC;YACtF,SAAS,EAAE,OAAO,CAAC,SAAS;SAC/B,CAAA;IACL,CAAC,CAAC,CAAA;AACN,CAAC;AAaD,MAAM,CAAC,MAAM,UAAU,GAAG,CAAK,KAAyB,EAAE,EAAE;IACxD,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,CAAA;IACjC,OAAO,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,EACrB,SAAS,EAAE,KAAK,CAAC,SAAS,EAC1B,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,GAAI,CAAA;AAC1G,CAAC,CAAA"}
|
package/dist/components.js
CHANGED
|
@@ -1,22 +1,25 @@
|
|
|
1
1
|
import { useContext } from "react";
|
|
2
2
|
import { LazyContext } from "./hooks.js";
|
|
3
|
+
import { useDelayedFlag } from "./internal.js";
|
|
3
4
|
import { useLazyState } from "./state.js";
|
|
4
5
|
export function Lazy(props) {
|
|
5
6
|
const context = useContext(LazyContext);
|
|
6
7
|
const options = { ...context, ...props.overrides };
|
|
7
|
-
const
|
|
8
|
+
const actual = useLazyState(props.event);
|
|
9
|
+
const showLoading = useDelayedFlag(actual.isLoading, options.delay);
|
|
10
|
+
const state = showLoading ? actual : settle(actual);
|
|
8
11
|
if (state.isLoading && !state.isSettled) {
|
|
9
|
-
if (options.onLoading === undefined) {
|
|
12
|
+
if (options.onLoading === undefined || !showLoading) {
|
|
10
13
|
return null;
|
|
11
14
|
}
|
|
12
15
|
return options.onLoading({
|
|
13
|
-
message: options.loadingMessage
|
|
16
|
+
message: options.loadingMessage
|
|
14
17
|
});
|
|
15
18
|
}
|
|
16
19
|
const onReloading = options.onReloading ?? ((props) => props.children);
|
|
17
20
|
return onReloading({
|
|
18
21
|
reloading: state.isLoading,
|
|
19
|
-
message: options.reloadingMessage ?? options.
|
|
22
|
+
message: options.reloadingMessage ?? options.loadingMessage,
|
|
20
23
|
children: (() => {
|
|
21
24
|
if (state.isRejected) {
|
|
22
25
|
if (options.onError === undefined) {
|
|
@@ -24,7 +27,6 @@ export function Lazy(props) {
|
|
|
24
27
|
}
|
|
25
28
|
return options.onError({
|
|
26
29
|
reason: state.reason,
|
|
27
|
-
message: options.errorMessage ?? options.defaultMessage,
|
|
28
30
|
});
|
|
29
31
|
}
|
|
30
32
|
else {
|
|
@@ -33,4 +35,31 @@ export function Lazy(props) {
|
|
|
33
35
|
})()
|
|
34
36
|
});
|
|
35
37
|
}
|
|
38
|
+
/**
|
|
39
|
+
* Presents a reloading state as the settled state it is reloading from, for use while the loading delay has not yet elapsed.
|
|
40
|
+
*/
|
|
41
|
+
function settle(state) {
|
|
42
|
+
if (!state.isReloading) {
|
|
43
|
+
return state;
|
|
44
|
+
}
|
|
45
|
+
if (state.isFulfilled) {
|
|
46
|
+
return {
|
|
47
|
+
isLoading: false,
|
|
48
|
+
isReloading: false,
|
|
49
|
+
isSettled: true,
|
|
50
|
+
isFulfilled: true,
|
|
51
|
+
isRejected: false,
|
|
52
|
+
value: state.value,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
return {
|
|
56
|
+
isLoading: false,
|
|
57
|
+
isReloading: false,
|
|
58
|
+
isSettled: true,
|
|
59
|
+
isFulfilled: false,
|
|
60
|
+
isRejected: true,
|
|
61
|
+
reason: state.reason,
|
|
62
|
+
retry: state.retry,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
36
65
|
//# sourceMappingURL=components.js.map
|
package/dist/components.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"components.js","sourceRoot":"","sources":["../src/components.tsx"],"names":[],"mappings":"AACA,OAAO,EAAgC,UAAU,EAAE,MAAM,OAAO,CAAA;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AACxC,OAAO,EAAa,YAAY,EAAE,MAAM,YAAY,CAAA;AAWpD,MAAM,UAAU,IAAI,CAAI,KAAmB;IACvC,MAAM,OAAO,GAAG,UAAU,CAAC,WAAW,CAAC,CAAA;IACvC,MAAM,OAAO,GAAG,EAAE,GAAG,OAAO,EAAE,GAAG,KAAK,CAAC,SAAS,EAAE,CAAA;IAClD,MAAM,
|
|
1
|
+
{"version":3,"file":"components.js","sourceRoot":"","sources":["../src/components.tsx"],"names":[],"mappings":"AACA,OAAO,EAAgC,UAAU,EAAE,MAAM,OAAO,CAAA;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAC9C,OAAO,EAAa,YAAY,EAAE,MAAM,YAAY,CAAA;AAWpD,MAAM,UAAU,IAAI,CAAI,KAAmB;IACvC,MAAM,OAAO,GAAG,UAAU,CAAC,WAAW,CAAC,CAAA;IACvC,MAAM,OAAO,GAAG,EAAE,GAAG,OAAO,EAAE,GAAG,KAAK,CAAC,SAAS,EAAE,CAAA;IAClD,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;IACxC,MAAM,WAAW,GAAG,cAAc,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,CAAA;IACnE,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IACnD,IAAI,KAAK,CAAC,SAAS,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;QACtC,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,IAAI,CAAC,WAAW,EAAE,CAAC;YAClD,OAAO,IAAI,CAAA;QACf,CAAC;QACD,OAAO,OAAO,CAAC,SAAS,CAAC;YACrB,OAAO,EAAE,OAAO,CAAC,cAAc;SAClC,CAAC,CAAA;IACN,CAAC;IACD,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,CAAC,CAAC,KAAwB,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;IACzF,OAAO,WAAW,CAAC;QACf,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,OAAO,EAAE,OAAO,CAAC,gBAAgB,IAAI,OAAO,CAAC,cAAc;QAC3D,QAAQ,EAAE,CAAC,GAAG,EAAE;YACZ,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;gBACnB,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;oBAChC,MAAM,KAAK,CAAC,MAAM,CAAA;gBACtB,CAAC;gBACD,OAAO,OAAO,CAAC,OAAO,CAAC;oBACnB,MAAM,EAAE,KAAK,CAAC,MAAM;iBACvB,CAAC,CAAA;YACN,CAAC;iBACI,CAAC;gBACF,OAAO,OAAO,KAAK,CAAC,QAAQ,KAAK,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAA;YACrG,CAAC;QACL,CAAC,CAAC,EAAE;KACP,CAAC,CAAA;AACN,CAAC;AAED;;GAEG;AACH,SAAS,MAAM,CAAI,KAAmB;IAClC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;QACrB,OAAO,KAAK,CAAA;IAChB,CAAC;IACD,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;QACpB,OAAO;YACH,SAAS,EAAE,KAAK;YAChB,WAAW,EAAE,KAAK;YAClB,SAAS,EAAE,IAAI;YACf,WAAW,EAAE,IAAI;YACjB,UAAU,EAAE,KAAK;YACjB,KAAK,EAAE,KAAK,CAAC,KAAK;SACrB,CAAA;IACL,CAAC;IACD,OAAO;QACH,SAAS,EAAE,KAAK;QAChB,WAAW,EAAE,KAAK;QAClB,SAAS,EAAE,IAAI;QACf,WAAW,EAAE,KAAK;QAClB,UAAU,EAAE,IAAI;QAChB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,KAAK,EAAE,KAAK,CAAC,KAAK;KACrB,CAAA;AACL,CAAC"}
|
package/dist/hooks.d.ts
CHANGED
|
@@ -1,20 +1,16 @@
|
|
|
1
|
-
import { DependencyList } from "react";
|
|
2
1
|
import { Observable, Subject } from "rxjs";
|
|
3
|
-
import {
|
|
2
|
+
import { Retry } from "./async.js";
|
|
3
|
+
import { ExtractLazy, LazyEvent } from "./types.js";
|
|
4
4
|
export declare const LazyContext: import("react").Context<Partial<import("./types.js").LazyOptions>>;
|
|
5
|
-
export declare function isLoading<T>(event: LazyEvent<T>): event is LazyLoading;
|
|
6
|
-
export declare function isFulfilled<T>(event: LazyEvent<T>): event is LazyFulfilled<T>;
|
|
7
|
-
export declare function isRejected<T>(event: LazyEvent<T>): event is LazyRejected;
|
|
8
5
|
export declare function useLazyFlatten<O>(event: LazyEvent<LazyEvent<O>>): LazyEvent<O>;
|
|
9
6
|
export declare function useLazyChain<I, O>(event: LazyEvent<I>, map: (value: I) => LazyEvent<O>): LazyEvent<O>;
|
|
10
|
-
export declare function useLazyMap<I, O>(event: LazyEvent<I>, map: (value: I) => O):
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
7
|
+
export declare function useLazyMap<I, O>(event: LazyEvent<I>, map: (value: I) => O): LazyEvent<O>;
|
|
8
|
+
export declare function useLazyRecover<T>(event: LazyEvent<T>, map: (reason: unknown) => LazyEvent<T>): LazyEvent<T>;
|
|
9
|
+
export declare function useLazyOrElse<T, D>(event: LazyEvent<T>, orElse: () => D): D | T;
|
|
10
|
+
export declare function useLazyFold<T, O>(event: LazyEvent<T>, loading: () => O, fulfilled: (value: T) => O, rejected: (reason: unknown, retry?: Retry | undefined) => O): O;
|
|
14
11
|
export declare function useObservableAsPromise<T>(observable: Observable<T>): Promise<T>;
|
|
15
12
|
export declare function useLazyAsPromise<T>(event: LazyEvent<T>): Promise<T>;
|
|
16
13
|
export declare function useLazyAsObservable<T>(event: LazyEvent<T>): Subject<T>;
|
|
17
|
-
export declare function useShallowMemo<T, D extends DependencyList>(factory: () => T, deps: D): T;
|
|
18
14
|
export declare function useLazyCombine<T extends Record<string, LazyEvent<unknown>>>(lazies: T): LazyEvent<{
|
|
19
15
|
[K in keyof T]: ExtractLazy<T[K]>;
|
|
20
16
|
}>;
|
package/dist/hooks.js
CHANGED
|
@@ -2,60 +2,38 @@ import pDefer from "p-defer";
|
|
|
2
2
|
import { createContext, useEffect, useMemo, useRef, useState } from "react";
|
|
3
3
|
import { Subject } from "rxjs";
|
|
4
4
|
import shallowEqual from "shallowequal";
|
|
5
|
+
import { lazyChain, lazyCombine, lazyFlatten, lazyFold, lazyMap, lazyOrElse, lazyRecover } from "./operators.js";
|
|
5
6
|
export const LazyContext = createContext({});
|
|
6
|
-
|
|
7
|
-
if (
|
|
8
|
-
return true;
|
|
9
|
-
}
|
|
10
|
-
else {
|
|
11
|
-
return false;
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
export function isFulfilled(event) {
|
|
15
|
-
if (event.status === "fulfilled") {
|
|
16
|
-
return true;
|
|
17
|
-
}
|
|
18
|
-
else {
|
|
7
|
+
function eachEqual(a, b) {
|
|
8
|
+
if (a.length !== b.length) {
|
|
19
9
|
return false;
|
|
20
10
|
}
|
|
11
|
+
return a.every((value, key) => shallowEqual(value, b[key]));
|
|
21
12
|
}
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
else {
|
|
27
|
-
return false;
|
|
13
|
+
function useShallowMemo(factory, deps) {
|
|
14
|
+
const ref = useRef(deps);
|
|
15
|
+
if (!eachEqual(ref.current, deps)) {
|
|
16
|
+
ref.current = deps;
|
|
28
17
|
}
|
|
18
|
+
return useMemo(factory, [ref.current]);
|
|
29
19
|
}
|
|
30
20
|
export function useLazyFlatten(event) {
|
|
31
|
-
return
|
|
21
|
+
return useMemo(() => lazyFlatten(event), [event]);
|
|
32
22
|
}
|
|
33
23
|
export function useLazyChain(event, map) {
|
|
34
|
-
return useMemo(() =>
|
|
35
|
-
if (event.status === "fulfilled") {
|
|
36
|
-
return map(event.value);
|
|
37
|
-
}
|
|
38
|
-
else {
|
|
39
|
-
return event;
|
|
40
|
-
}
|
|
41
|
-
}, [
|
|
42
|
-
event
|
|
43
|
-
]);
|
|
24
|
+
return useMemo(() => lazyChain(event, map), [event]);
|
|
44
25
|
}
|
|
45
26
|
export function useLazyMap(event, map) {
|
|
46
|
-
return useMemo(() =>
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
}, [
|
|
57
|
-
event
|
|
58
|
-
]);
|
|
27
|
+
return useMemo(() => lazyMap(event, map), [event]);
|
|
28
|
+
}
|
|
29
|
+
export function useLazyRecover(event, map) {
|
|
30
|
+
return useMemo(() => lazyRecover(event, map), [event]);
|
|
31
|
+
}
|
|
32
|
+
export function useLazyOrElse(event, orElse) {
|
|
33
|
+
return useMemo(() => lazyOrElse(event, orElse), [event]);
|
|
34
|
+
}
|
|
35
|
+
export function useLazyFold(event, loading, fulfilled, rejected) {
|
|
36
|
+
return useMemo(() => lazyFold(event, loading, fulfilled, rejected), [event]);
|
|
59
37
|
}
|
|
60
38
|
export function useObservableAsPromise(observable) {
|
|
61
39
|
const [promise, setPromise] = useState(() => new Promise(() => void 0));
|
|
@@ -107,49 +85,7 @@ export function useLazyAsObservable(event) {
|
|
|
107
85
|
]);
|
|
108
86
|
return subject;
|
|
109
87
|
}
|
|
110
|
-
function eachEqual(a, b) {
|
|
111
|
-
if (a.length !== b.length) {
|
|
112
|
-
return false;
|
|
113
|
-
}
|
|
114
|
-
return a.every((value, key) => shallowEqual(value, b[key]));
|
|
115
|
-
}
|
|
116
|
-
export function useShallowMemo(factory, deps) {
|
|
117
|
-
const ref = useRef(deps);
|
|
118
|
-
if (!eachEqual(ref.current, deps)) {
|
|
119
|
-
ref.current = deps;
|
|
120
|
-
}
|
|
121
|
-
return useMemo(factory, [ref.current]);
|
|
122
|
-
}
|
|
123
88
|
export function useLazyCombine(lazies) {
|
|
124
|
-
return useShallowMemo(() =>
|
|
125
|
-
const entries = Object.entries(lazies);
|
|
126
|
-
if (entries.map(entry => entry[1]).some(isLoading)) {
|
|
127
|
-
return {
|
|
128
|
-
status: "loading",
|
|
129
|
-
};
|
|
130
|
-
}
|
|
131
|
-
else {
|
|
132
|
-
const failed = entries.map(entry => entry[1]).filter(isRejected).at(0);
|
|
133
|
-
if (failed !== undefined) {
|
|
134
|
-
return {
|
|
135
|
-
status: "rejected",
|
|
136
|
-
reason: failed
|
|
137
|
-
};
|
|
138
|
-
}
|
|
139
|
-
else {
|
|
140
|
-
return {
|
|
141
|
-
status: "fulfilled",
|
|
142
|
-
value: Object.fromEntries(entries.map(([key, value]) => {
|
|
143
|
-
return [
|
|
144
|
-
key,
|
|
145
|
-
value.status === "fulfilled" ? value.value : undefined,
|
|
146
|
-
];
|
|
147
|
-
}))
|
|
148
|
-
};
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
}, [
|
|
152
|
-
lazies
|
|
153
|
-
]);
|
|
89
|
+
return useShallowMemo(() => lazyCombine(lazies), [lazies]);
|
|
154
90
|
}
|
|
155
91
|
//# sourceMappingURL=hooks.js.map
|
package/dist/hooks.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,SAAS,CAAA;AAC5B,OAAO,EAAE,aAAa,EAAkB,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAC3F,OAAO,EAAc,OAAO,EAAE,MAAM,MAAM,CAAA;AAC1C,OAAO,YAAY,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":"AACA,cAAc,YAAY,CAAA;AAC1B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,UAAU,CAAA;AACxB,cAAc,YAAY,CAAA;AAC1B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,YAAY,CAAA;AAC1B,cAAc,YAAY,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":"AACA,cAAc,YAAY,CAAA;AAC1B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,UAAU,CAAA;AACxB,cAAc,YAAY,CAAA;AAC1B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,YAAY,CAAA;AAC1B,cAAc,YAAY,CAAA"}
|
package/dist/internal.d.ts
CHANGED
|
@@ -2,3 +2,8 @@ export declare function useIsFirstMount(): boolean;
|
|
|
2
2
|
export declare function usePrevious<T>(value: {
|
|
3
3
|
readonly current: T;
|
|
4
4
|
} | undefined): T | undefined;
|
|
5
|
+
/**
|
|
6
|
+
* Returns true once `active` has stayed true for at least `delay` milliseconds.
|
|
7
|
+
* Returns false whenever `active` is false, and restarts the timer each time `active` becomes true.
|
|
8
|
+
*/
|
|
9
|
+
export declare function useDelayedFlag(active: boolean, delay: number | undefined): boolean;
|
package/dist/internal.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { useRef } from "react";
|
|
1
|
+
import { useEffect, useRef, useState } from "react";
|
|
2
2
|
export function useIsFirstMount() {
|
|
3
3
|
const isFirst = useRef(true);
|
|
4
4
|
if (isFirst.current) {
|
|
@@ -17,4 +17,27 @@ export function usePrevious(value) {
|
|
|
17
17
|
}
|
|
18
18
|
return previous.current;
|
|
19
19
|
}
|
|
20
|
+
/**
|
|
21
|
+
* Returns true once `active` has stayed true for at least `delay` milliseconds.
|
|
22
|
+
* Returns false whenever `active` is false, and restarts the timer each time `active` becomes true.
|
|
23
|
+
*/
|
|
24
|
+
export function useDelayedFlag(active, delay) {
|
|
25
|
+
const enabled = delay !== undefined && delay > 0;
|
|
26
|
+
const [elapsed, setElapsed] = useState(false);
|
|
27
|
+
useEffect(() => {
|
|
28
|
+
if (!active || !enabled) {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
const timeout = setTimeout(() => setElapsed(true), delay);
|
|
32
|
+
return () => {
|
|
33
|
+
clearTimeout(timeout);
|
|
34
|
+
setElapsed(false);
|
|
35
|
+
};
|
|
36
|
+
}, [
|
|
37
|
+
active,
|
|
38
|
+
enabled,
|
|
39
|
+
delay,
|
|
40
|
+
]);
|
|
41
|
+
return active && (!enabled || elapsed);
|
|
42
|
+
}
|
|
20
43
|
//# sourceMappingURL=internal.js.map
|
package/dist/internal.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"internal.js","sourceRoot":"","sources":["../src/internal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"internal.js","sourceRoot":"","sources":["../src/internal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAEnD,MAAM,UAAU,eAAe;IAC3B,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,CAAA;IAC5B,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QAClB,OAAO,CAAC,OAAO,GAAG,KAAK,CAAA;QACvB,OAAO,IAAI,CAAA;IACf,CAAC;IACD,OAAO,OAAO,CAAC,OAAO,CAAA;AAC1B,CAAC;AAED,MAAM,UAAU,WAAW,CAAI,KAA0C;IACrE,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;IACvC,MAAM,KAAK,GAAG,eAAe,EAAE,CAAA;IAC/B,IAAI,CAAC,KAAK,EAAE,CAAC;QACT,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACtB,QAAQ,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAA;QACpC,CAAC;IACL,CAAC;IACD,OAAO,QAAQ,CAAC,OAAO,CAAA;AAC3B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,MAAe,EAAE,KAAyB;IACrE,MAAM,OAAO,GAAG,KAAK,KAAK,SAAS,IAAI,KAAK,GAAG,CAAC,CAAA;IAChD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAC7C,SAAS,CAAC,GAAG,EAAE;QACX,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;YACtB,OAAM;QACV,CAAC;QACD,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,CAAA;QACzD,OAAO,GAAG,EAAE;YACR,YAAY,CAAC,OAAO,CAAC,CAAA;YACrB,UAAU,CAAC,KAAK,CAAC,CAAA;QACrB,CAAC,CAAA;IACL,CAAC,EAAE;QACC,MAAM;QACN,OAAO;QACP,KAAK;KACR,CAAC,CAAA;IACF,OAAO,MAAM,IAAI,CAAC,CAAC,OAAO,IAAI,OAAO,CAAC,CAAA;AAC1C,CAAC"}
|
package/dist/lazy.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Retry } from "./async.js";
|
|
2
|
+
import { ExtractLazy, LazyEvent, LazyFulfilled, LazyLoading, LazyRejected, LazySettled } from "./types.js";
|
|
3
|
+
export declare function isLoading<T>(event: LazyEvent<T>): event is LazyLoading;
|
|
4
|
+
export declare function isSettled<T>(event: LazyEvent<T>): event is LazySettled<T>;
|
|
5
|
+
export declare function isFulfilled<T>(event: LazyEvent<T>): event is LazyFulfilled<T>;
|
|
6
|
+
export declare function isRejected<T>(event: LazyEvent<T>): event is LazyRejected;
|
|
7
|
+
export declare function lazyFold<T, O>(event: LazyEvent<T>, loading: () => O, fulfilled: (value: T) => O, rejected: (reason: unknown, retry?: Retry | undefined) => O): O;
|
|
8
|
+
export declare function lazyOrElse<T, D>(event: LazyEvent<T>, orElse: () => D): D | T;
|
|
9
|
+
export declare function lazyOrUndefined<T>(event: LazyEvent<T>): T | undefined;
|
|
10
|
+
export declare function lazyFlatten<O>(event: LazyEvent<LazyEvent<O>>): LazyEvent<O>;
|
|
11
|
+
export declare function lazyChain<I, O>(event: LazyEvent<I>, map: (value: I) => LazyEvent<O>): LazyEvent<O>;
|
|
12
|
+
export declare function lazyMap<I, O>(event: LazyEvent<I>, map: (value: I) => O): LazyEvent<O>;
|
|
13
|
+
export declare function lazyRecover<T>(event: LazyEvent<T>, map: (reason: unknown) => LazyEvent<T>): LazyEvent<T>;
|
|
14
|
+
export declare function lazyCombine<T extends Record<string, LazyEvent<unknown>>>(lazies: T): LazyEvent<{
|
|
15
|
+
[K in keyof T]: ExtractLazy<T[K]>;
|
|
16
|
+
}>;
|
package/dist/lazy.js
ADDED
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
export function isLoading(event) {
|
|
2
|
+
return event.status === "loading";
|
|
3
|
+
}
|
|
4
|
+
export function isSettled(event) {
|
|
5
|
+
return event.status === "fulfilled" || event.status === "rejected";
|
|
6
|
+
}
|
|
7
|
+
export function isFulfilled(event) {
|
|
8
|
+
return event.status === "fulfilled";
|
|
9
|
+
}
|
|
10
|
+
export function isRejected(event) {
|
|
11
|
+
return event.status === "rejected";
|
|
12
|
+
}
|
|
13
|
+
export function lazyFold(event, loading, fulfilled, rejected) {
|
|
14
|
+
if (event.status === "loading") {
|
|
15
|
+
return loading();
|
|
16
|
+
}
|
|
17
|
+
else if (event.status === "fulfilled") {
|
|
18
|
+
return fulfilled(event.value);
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
return rejected(event.reason, event.retry);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export function lazyOrElse(event, orElse) {
|
|
25
|
+
if (isFulfilled(event)) {
|
|
26
|
+
return event.value;
|
|
27
|
+
}
|
|
28
|
+
return orElse();
|
|
29
|
+
}
|
|
30
|
+
export function lazyOrUndefined(event) {
|
|
31
|
+
return lazyOrElse(event, () => undefined);
|
|
32
|
+
}
|
|
33
|
+
export function lazyFlatten(event) {
|
|
34
|
+
return lazyChain(event, event => event);
|
|
35
|
+
}
|
|
36
|
+
export function lazyChain(event, map) {
|
|
37
|
+
if (event.status === "fulfilled") {
|
|
38
|
+
return map(event.value);
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
return event;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
export function lazyMap(event, map) {
|
|
45
|
+
if (event.status === "fulfilled") {
|
|
46
|
+
return {
|
|
47
|
+
status: "fulfilled",
|
|
48
|
+
value: map(event.value)
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
return event;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
export function lazyRecover(event, map) {
|
|
56
|
+
if (event.status === "rejected") {
|
|
57
|
+
return map(event.reason);
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
return event;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
export function lazyCombine(lazies) {
|
|
64
|
+
const entries = Object.entries(lazies);
|
|
65
|
+
if (entries.map(entry => entry[1]).some(isLoading)) {
|
|
66
|
+
return {
|
|
67
|
+
status: "loading",
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
const failed = entries.map(entry => entry[1]).filter(isRejected);
|
|
71
|
+
if (failed.length > 0) {
|
|
72
|
+
return {
|
|
73
|
+
status: "rejected",
|
|
74
|
+
reason: failed.map(failed => failed.reason),
|
|
75
|
+
retry: (suppressReload) => {
|
|
76
|
+
failed.forEach(failed => {
|
|
77
|
+
failed.retry?.(suppressReload);
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
return {
|
|
83
|
+
status: "fulfilled",
|
|
84
|
+
value: Object.fromEntries(entries.map(([key, value]) => {
|
|
85
|
+
return [
|
|
86
|
+
key,
|
|
87
|
+
value.status === "fulfilled" ? value.value : undefined,
|
|
88
|
+
];
|
|
89
|
+
}))
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=lazy.js.map
|
package/dist/lazy.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lazy.js","sourceRoot":"","sources":["../src/lazy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Retry } from "./async.js";
|
|
2
|
+
import { ExtractLazy, LazyEvent, LazyFulfilled, LazyLoading, LazyRejected, LazySettled } from "./types.js";
|
|
3
|
+
export declare function isLoading<T>(event: LazyEvent<T>): event is LazyLoading;
|
|
4
|
+
export declare function isSettled<T>(event: LazyEvent<T>): event is LazySettled<T>;
|
|
5
|
+
export declare function isFulfilled<T>(event: LazyEvent<T>): event is LazyFulfilled<T>;
|
|
6
|
+
export declare function isRejected<T>(event: LazyEvent<T>): event is LazyRejected;
|
|
7
|
+
export declare function lazyFold<T, O>(event: LazyEvent<T>, loading: () => O, fulfilled: (value: T) => O, rejected: (reason: unknown, retry?: Retry | undefined) => O): O;
|
|
8
|
+
export declare function lazyOrElse<T, D>(event: LazyEvent<T>, orElse: () => D): D | T;
|
|
9
|
+
export declare function lazyOrUndefined<T>(event: LazyEvent<T>): T | undefined;
|
|
10
|
+
export declare function lazyFlatten<O>(event: LazyEvent<LazyEvent<O>>): LazyEvent<O>;
|
|
11
|
+
export declare function lazyChain<I, O>(event: LazyEvent<I>, map: (value: I) => LazyEvent<O>): LazyEvent<O>;
|
|
12
|
+
export declare function lazyMap<I, O>(event: LazyEvent<I>, map: (value: I) => O): LazyEvent<O>;
|
|
13
|
+
export declare function lazyRecover<T>(event: LazyEvent<T>, map: (reason: unknown) => LazyEvent<T>): LazyEvent<T>;
|
|
14
|
+
export declare function lazyCombine<T extends Record<string, LazyEvent<unknown>>>(lazies: T): LazyEvent<{
|
|
15
|
+
[K in keyof T]: ExtractLazy<T[K]>;
|
|
16
|
+
}>;
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
export function isLoading(event) {
|
|
2
|
+
return event.status === "loading";
|
|
3
|
+
}
|
|
4
|
+
export function isSettled(event) {
|
|
5
|
+
return event.status === "fulfilled" || event.status === "rejected";
|
|
6
|
+
}
|
|
7
|
+
export function isFulfilled(event) {
|
|
8
|
+
return event.status === "fulfilled";
|
|
9
|
+
}
|
|
10
|
+
export function isRejected(event) {
|
|
11
|
+
return event.status === "rejected";
|
|
12
|
+
}
|
|
13
|
+
export function lazyFold(event, loading, fulfilled, rejected) {
|
|
14
|
+
if (event.status === "loading") {
|
|
15
|
+
return loading();
|
|
16
|
+
}
|
|
17
|
+
else if (event.status === "fulfilled") {
|
|
18
|
+
return fulfilled(event.value);
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
return rejected(event.reason, event.retry);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export function lazyOrElse(event, orElse) {
|
|
25
|
+
if (isFulfilled(event)) {
|
|
26
|
+
return event.value;
|
|
27
|
+
}
|
|
28
|
+
return orElse();
|
|
29
|
+
}
|
|
30
|
+
export function lazyOrUndefined(event) {
|
|
31
|
+
return lazyOrElse(event, () => undefined);
|
|
32
|
+
}
|
|
33
|
+
export function lazyFlatten(event) {
|
|
34
|
+
return lazyChain(event, event => event);
|
|
35
|
+
}
|
|
36
|
+
export function lazyChain(event, map) {
|
|
37
|
+
if (event.status === "fulfilled") {
|
|
38
|
+
return map(event.value);
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
return event;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
export function lazyMap(event, map) {
|
|
45
|
+
if (event.status === "fulfilled") {
|
|
46
|
+
return {
|
|
47
|
+
status: "fulfilled",
|
|
48
|
+
value: map(event.value)
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
return event;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
export function lazyRecover(event, map) {
|
|
56
|
+
if (event.status === "rejected") {
|
|
57
|
+
return map(event.reason);
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
return event;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
export function lazyCombine(lazies) {
|
|
64
|
+
const entries = Object.entries(lazies);
|
|
65
|
+
if (entries.map(entry => entry[1]).some(isLoading)) {
|
|
66
|
+
return {
|
|
67
|
+
status: "loading",
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
const failed = entries.map(entry => entry[1]).filter(isRejected);
|
|
71
|
+
if (failed.length > 0) {
|
|
72
|
+
return {
|
|
73
|
+
status: "rejected",
|
|
74
|
+
reason: failed.map(failed => failed.reason),
|
|
75
|
+
retry: (suppressReload) => {
|
|
76
|
+
failed.forEach(failed => {
|
|
77
|
+
failed.retry?.(suppressReload);
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
return {
|
|
83
|
+
status: "fulfilled",
|
|
84
|
+
value: Object.fromEntries(entries.map(([key, value]) => {
|
|
85
|
+
return [
|
|
86
|
+
key,
|
|
87
|
+
value.status === "fulfilled" ? value.value : undefined,
|
|
88
|
+
];
|
|
89
|
+
}))
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=operators.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operators.js","sourceRoot":"","sources":["../src/operators.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { ReactNode } from "react";
|
|
2
|
+
import { Retry } from "./async.js";
|
|
2
3
|
export type LazyLoading = {
|
|
3
4
|
readonly status: "loading";
|
|
4
5
|
};
|
|
@@ -9,19 +10,18 @@ export type LazyFulfilled<D> = {
|
|
|
9
10
|
export type LazyRejected = {
|
|
10
11
|
readonly status: "rejected";
|
|
11
12
|
readonly reason: unknown;
|
|
12
|
-
readonly retry?:
|
|
13
|
+
readonly retry?: Retry | undefined;
|
|
13
14
|
};
|
|
14
15
|
export type LazySettled<D> = LazyFulfilled<D> | LazyRejected;
|
|
15
16
|
export type LazyEvent<D> = LazySettled<D> | LazyLoading;
|
|
16
17
|
export type OnLoading = (props: LoadingProps) => ReactNode;
|
|
17
18
|
export type OnReloading = (props: ReloadingProps) => ReactNode;
|
|
18
19
|
export type OnError = (props: ErrorProps) => ReactNode;
|
|
19
|
-
type LazyMeta = string;
|
|
20
20
|
export interface LoadingProps {
|
|
21
21
|
/**
|
|
22
22
|
* The message to display.
|
|
23
23
|
*/
|
|
24
|
-
readonly message?:
|
|
24
|
+
readonly message?: string | undefined;
|
|
25
25
|
}
|
|
26
26
|
export interface ReloadingProps {
|
|
27
27
|
/**
|
|
@@ -31,7 +31,7 @@ export interface ReloadingProps {
|
|
|
31
31
|
/**
|
|
32
32
|
* The message to display.
|
|
33
33
|
*/
|
|
34
|
-
readonly message?:
|
|
34
|
+
readonly message?: string | undefined;
|
|
35
35
|
/**
|
|
36
36
|
* The children.
|
|
37
37
|
*/
|
|
@@ -42,23 +42,22 @@ export interface ErrorProps {
|
|
|
42
42
|
* The error.
|
|
43
43
|
*/
|
|
44
44
|
readonly reason: unknown;
|
|
45
|
-
/**
|
|
46
|
-
* The message to display.
|
|
47
|
-
*/
|
|
48
|
-
readonly message?: LazyMeta | undefined;
|
|
49
45
|
}
|
|
50
46
|
export interface LazyOptions {
|
|
51
47
|
readonly onLoading?: OnLoading | undefined;
|
|
52
48
|
readonly onReloading?: OnReloading | undefined;
|
|
53
49
|
readonly onError?: OnError | undefined;
|
|
54
|
-
readonly
|
|
55
|
-
readonly
|
|
56
|
-
|
|
57
|
-
|
|
50
|
+
readonly loadingMessage?: string | undefined;
|
|
51
|
+
readonly reloadingMessage?: string | undefined;
|
|
52
|
+
/**
|
|
53
|
+
* How long (in milliseconds) loading must last before it is shown.
|
|
54
|
+
* During this time an initial load renders nothing instead of `onLoading`, and a reload keeps showing the previous content as not reloading.
|
|
55
|
+
* Use this to avoid flicker for loads that usually finish within a few milliseconds.
|
|
56
|
+
*/
|
|
57
|
+
readonly delay?: number | undefined;
|
|
58
58
|
}
|
|
59
59
|
/**
|
|
60
60
|
* Overrides for lazy options.
|
|
61
61
|
*/
|
|
62
62
|
export type LazyOverrides = Partial<LazyOptions>;
|
|
63
63
|
export type ExtractLazy<T> = T extends LazyFulfilled<infer D> ? D : never;
|
|
64
|
-
export {};
|