synstate-react-hooks-compat 6.1.1 → 6.2.0
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 +1 -1
- package/dist/synstate.d.mts +1 -0
- package/dist/synstate.d.mts.map +1 -1
- package/dist/use-observable-effect.d.mts +14 -0
- package/dist/use-observable-effect.d.mts.map +1 -1
- package/dist/use-observable-effect.mjs +33 -2
- package/dist/use-observable-effect.mjs.map +1 -1
- package/package.json +5 -5
- package/src/synstate.mts +75 -0
- package/src/use-observable-effect.mts +36 -2
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# SynState React hooks (compat)
|
|
2
2
|
|
|
3
|
-
synstate-react-hooks-compat re-exports
|
|
3
|
+
synstate-react-hooks-compat re-exports every function and type synstate exports except for `createState`, `createReducer`, and `createBooleanState`, and exports modified versions of those creation functions.
|
|
4
4
|
|
|
5
5
|
The first element of the array returned by the `createState<T>` function provided by synstate-react-hooks-compat is changed from `InitializedObservable<T>` to a React hook `() => T`, and the `InitializedObservable<T>` has been moved to the `state` property in the object at index 2.
|
|
6
6
|
|
package/dist/synstate.d.mts
CHANGED
|
@@ -1,2 +1,3 @@
|
|
|
1
1
|
export { attachIndex, audit, collectToArray, combine, combineLatest, counter, createAsyncChildObservable, createEventEmitter, createInitializedSyncChildObservable, createRootObservable, createScope, createSyncChildObservable, createValueEmitter, debounce, derive, distinctUntilChanged, empty, filter, flatMap, fromAbortablePromise, fromPromise, fromSubscribable, getCurrentScope, getKey, isChildObservable, isManagerObservable, isObservable, isRootObservable, just, keepEqualParts, map, mapOptional, mapResultErr, mapResultOk, mapTo, merge, mergeMap, onScopeDispose, pairwise, pluck, scan, skip, skipIfNoChange, skipUntil, skipWhile, source, switchMap, take, takeUntil, takeWhile, throttle, timer, untracked, unwrapOptional, unwrapResultErr, unwrapResultOk, withBuffered, withBufferedFrom, withCurrentValueFrom, withIndex, withInitialValue, withLatestFrom, zip, } from 'synstate';
|
|
2
|
+
export type { AsyncChildObservable, AsyncChildObservableHooks, AsyncChildObservableTools, AuditOperatorObservable, ChildObservable, ChildObservableConfig, ChildObservableKind, CombineObservable, CombineObservableRefined, CounterObservable, DebounceOperatorObservable, DeriveObservable, DeriveObservableRefined, DropInitialValueOperator, FilterOperatorObservable, FromPromiseObservable, FromSubscribableObservable, InitializedAsyncChildObservable, InitializedChildObservableConfig, InitializedObservable, InitializedRootObservable, InitializedSourceObservable, InitializedSyncChildObservable, KeepEqualPartsOperatorObservable, KeepInitialValueOperator, ManagerObservable, ManagerObservableKind, MapOperatorObservable, MergeMapOperatorObservable, MergeObservable, MergeObservableRefined, NonEmptyUnknownList, Observable, ObservableBase, ObservableKind, ObservableValue, Operator, PairwiseOperatorObservable, RootObservable, RootObservableConfig, RootObservableTools, ScanOperatorObservable, Scope, SkipIfNoChangeOperatorObservable, SkipUntilOperatorObservable, SkipWhileOperatorObservable, SourceObservable, StateOptions, Subscribable, Subscriber, Subscription, SwitchMapOperatorObservable, SyncChildObservable, SyncChildObservableHooks, SyncChildObservableTools, TakeOperatorObservable, TakeUntilOperatorObservable, TakeWhileOperatorObservable, ThrottleOperatorObservable, TimerId, TimerObservable, TupleToQueueTuple, Unwrap, UpdateToken, WithBufferedFromOperatorObservable, WithCurrentValueFromOperatorObservable, WithInitialValueOperator, WithInitialValueOperatorObservable, Wrap, WrapInitialized, ZipObservable, ZipObservableRefined, } from 'synstate';
|
|
2
3
|
//# sourceMappingURL=synstate.d.mts.map
|
package/dist/synstate.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"synstate.d.mts","sourceRoot":"","sources":["../src/synstate.mts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,KAAK,EACL,cAAc,EACd,OAAO,EACP,aAAa,EACb,OAAO,EACP,0BAA0B,EAC1B,kBAAkB,EAClB,oCAAoC,EACpC,oBAAoB,EACpB,WAAW,EACX,yBAAyB,EACzB,kBAAkB,EAClB,QAAQ,EACR,MAAM,EACN,oBAAoB,EACpB,KAAK,EACL,MAAM,EACN,OAAO,EACP,oBAAoB,EACpB,WAAW,EACX,gBAAgB,EAChB,eAAe,EACf,MAAM,EACN,iBAAiB,EACjB,mBAAmB,EACnB,YAAY,EACZ,gBAAgB,EAChB,IAAI,EACJ,cAAc,EACd,GAAG,EACH,WAAW,EACX,YAAY,EACZ,WAAW,EACX,KAAK,EACL,KAAK,EACL,QAAQ,EACR,cAAc,EACd,QAAQ,EACR,KAAK,EACL,IAAI,EACJ,IAAI,EACJ,cAAc,EACd,SAAS,EACT,SAAS,EACT,MAAM,EACN,SAAS,EACT,IAAI,EACJ,SAAS,EACT,SAAS,EACT,QAAQ,EACR,KAAK,EACL,SAAS,EACT,cAAc,EACd,eAAe,EACf,cAAc,EACd,YAAY,EACZ,gBAAgB,EAChB,oBAAoB,EACpB,SAAS,EACT,gBAAgB,EAChB,cAAc,EACd,GAAG,GACJ,MAAM,UAAU,CAAC"}
|
|
1
|
+
{"version":3,"file":"synstate.d.mts","sourceRoot":"","sources":["../src/synstate.mts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,KAAK,EACL,cAAc,EACd,OAAO,EACP,aAAa,EACb,OAAO,EACP,0BAA0B,EAC1B,kBAAkB,EAClB,oCAAoC,EACpC,oBAAoB,EACpB,WAAW,EACX,yBAAyB,EACzB,kBAAkB,EAClB,QAAQ,EACR,MAAM,EACN,oBAAoB,EACpB,KAAK,EACL,MAAM,EACN,OAAO,EACP,oBAAoB,EACpB,WAAW,EACX,gBAAgB,EAChB,eAAe,EACf,MAAM,EACN,iBAAiB,EACjB,mBAAmB,EACnB,YAAY,EACZ,gBAAgB,EAChB,IAAI,EACJ,cAAc,EACd,GAAG,EACH,WAAW,EACX,YAAY,EACZ,WAAW,EACX,KAAK,EACL,KAAK,EACL,QAAQ,EACR,cAAc,EACd,QAAQ,EACR,KAAK,EACL,IAAI,EACJ,IAAI,EACJ,cAAc,EACd,SAAS,EACT,SAAS,EACT,MAAM,EACN,SAAS,EACT,IAAI,EACJ,SAAS,EACT,SAAS,EACT,QAAQ,EACR,KAAK,EACL,SAAS,EACT,cAAc,EACd,eAAe,EACf,cAAc,EACd,YAAY,EACZ,gBAAgB,EAChB,oBAAoB,EACpB,SAAS,EACT,gBAAgB,EAChB,cAAc,EACd,GAAG,GACJ,MAAM,UAAU,CAAC;AAElB,YAAY,EACV,oBAAoB,EACpB,yBAAyB,EACzB,yBAAyB,EACzB,uBAAuB,EACvB,eAAe,EACf,qBAAqB,EACrB,mBAAmB,EACnB,iBAAiB,EACjB,wBAAwB,EACxB,iBAAiB,EACjB,0BAA0B,EAC1B,gBAAgB,EAChB,uBAAuB,EACvB,wBAAwB,EACxB,wBAAwB,EACxB,qBAAqB,EACrB,0BAA0B,EAC1B,+BAA+B,EAC/B,gCAAgC,EAChC,qBAAqB,EACrB,yBAAyB,EACzB,2BAA2B,EAC3B,8BAA8B,EAC9B,gCAAgC,EAChC,wBAAwB,EACxB,iBAAiB,EACjB,qBAAqB,EACrB,qBAAqB,EACrB,0BAA0B,EAC1B,eAAe,EACf,sBAAsB,EACtB,mBAAmB,EACnB,UAAU,EACV,cAAc,EACd,cAAc,EACd,eAAe,EACf,QAAQ,EACR,0BAA0B,EAC1B,cAAc,EACd,oBAAoB,EACpB,mBAAmB,EACnB,sBAAsB,EACtB,KAAK,EACL,gCAAgC,EAChC,2BAA2B,EAC3B,2BAA2B,EAC3B,gBAAgB,EAChB,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,2BAA2B,EAC3B,mBAAmB,EACnB,wBAAwB,EACxB,wBAAwB,EACxB,sBAAsB,EACtB,2BAA2B,EAC3B,2BAA2B,EAC3B,0BAA0B,EAC1B,OAAO,EACP,eAAe,EACf,iBAAiB,EACjB,MAAM,EACN,WAAW,EACX,kCAAkC,EAClC,sCAAsC,EACtC,wBAAwB,EACxB,kCAAkC,EAClC,IAAI,EACJ,eAAe,EACf,aAAa,EACb,oBAAoB,GACrB,MAAM,UAAU,CAAC"}
|
|
@@ -1,3 +1,17 @@
|
|
|
1
1
|
import type { Observable } from 'synstate';
|
|
2
|
+
/**
|
|
3
|
+
* Subscribes `subscriptionFn` to `observable$` while the component is
|
|
4
|
+
* mounted, and unsubscribes when it unmounts.
|
|
5
|
+
*
|
|
6
|
+
* Each value is passed to the `subscriptionFn` of the latest render, so it
|
|
7
|
+
* sees the current props and state; a new function on every render does not
|
|
8
|
+
* re-subscribe. Passing a different Observable moves the subscription to it,
|
|
9
|
+
* so pass one that keeps its identity across renders (made outside the
|
|
10
|
+
* component, or memoized): one built during render is subscribed again, and
|
|
11
|
+
* an initialized one calls `subscriptionFn` again, on every render.
|
|
12
|
+
*
|
|
13
|
+
* @param observable$ The Observable to subscribe to.
|
|
14
|
+
* @param subscriptionFn Called with each value `observable$` emits.
|
|
15
|
+
*/
|
|
2
16
|
export declare const useObservableEffect: <A>(observable$: Observable<A>, subscriptionFn: (v: A) => void) => void;
|
|
3
17
|
//# sourceMappingURL=use-observable-effect.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-observable-effect.d.mts","sourceRoot":"","sources":["../src/use-observable-effect.mts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAE3C,eAAO,MAAM,mBAAmB,GAAI,CAAC,eACtB,UAAU,CAAC,CAAC,CAAC,kBACV,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,KAC7B,
|
|
1
|
+
{"version":3,"file":"use-observable-effect.d.mts","sourceRoot":"","sources":["../src/use-observable-effect.mts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAE3C;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,mBAAmB,GAAI,CAAC,eACtB,UAAU,CAAC,CAAC,CAAC,kBACV,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,KAC7B,IAmBF,CAAC"}
|
|
@@ -1,10 +1,41 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
2
16
|
export const useObservableEffect = (observable$, subscriptionFn) => {
|
|
17
|
+
const mut_subscriptionFnRef = React.useRef(subscriptionFn);
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
useBeforeEffects(() => {
|
|
22
|
+
mut_subscriptionFnRef.current = subscriptionFn;
|
|
23
|
+
});
|
|
3
24
|
React.useEffect(() => {
|
|
4
|
-
const s = observable$.subscribe(
|
|
25
|
+
const s = observable$.subscribe((v) => {
|
|
26
|
+
mut_subscriptionFnRef.current(v);
|
|
27
|
+
});
|
|
5
28
|
return () => {
|
|
6
29
|
s.unsubscribe();
|
|
7
30
|
};
|
|
8
|
-
}, []);
|
|
31
|
+
}, [observable$]);
|
|
9
32
|
};
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
const useBeforeEffects =
|
|
38
|
+
|
|
39
|
+
React.useInsertionEffect ??
|
|
40
|
+
(typeof window === 'undefined' ? React.useEffect : React.useLayoutEffect);
|
|
10
41
|
//# sourceMappingURL=use-observable-effect.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-observable-effect.mjs","sourceRoot":"","sources":["../src/use-observable-effect.mts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,WAA0B,EAC1B,cAA8B,EACxB,EAAE;IACR,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,MAAM,CAAC,GAAG,WAAW,CAAC,SAAS,CAAC,
|
|
1
|
+
{"version":3,"file":"use-observable-effect.mjs","sourceRoot":"","sources":["../src/use-observable-effect.mts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,WAA0B,EAC1B,cAA8B,EACxB,EAAE;IACR,MAAM,qBAAqB,GAAG,KAAK,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;IAE3D,2EAA2E;IAC3E,qEAAqE;IACrE,oBAAoB;IACpB,gBAAgB,CAAC,GAAG,EAAE;QACpB,qBAAqB,CAAC,OAAO,GAAG,cAAc,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,MAAM,CAAC,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE;YACpC,qBAAqB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;QAEH,OAAO,GAAG,EAAE;YACV,CAAC,CAAC,WAAW,EAAE,CAAC;QAClB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;AACpB,CAAC,CAAC;AAEF,8EAA8E;AAC9E,wEAAwE;AACxE,2EAA2E;AAC3E,6CAA6C;AAC7C,MAAM,gBAAgB;AACpB,4HAA4H;AAC5H,KAAK,CAAC,kBAAkB;IACxB,CAAC,OAAO,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "synstate-react-hooks-compat",
|
|
3
|
-
"version": "6.
|
|
3
|
+
"version": "6.2.0",
|
|
4
4
|
"description": "SynState React hooks for React 16.8–17 (without useSyncExternalStore)",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -38,10 +38,10 @@
|
|
|
38
38
|
"@types/react": "19.3.0",
|
|
39
39
|
"@types/react-dom": "19.3.0",
|
|
40
40
|
"@vitest/browser-playwright": "5.0.5",
|
|
41
|
-
"eslint-config-typed": "7.1
|
|
42
|
-
"eslint-plugin-ts-data-forge": "0.10.
|
|
43
|
-
"eslint-plugin-ts-fortress": "1.3.
|
|
44
|
-
"eslint-plugin-ts-type-forge": "0.8.
|
|
41
|
+
"eslint-config-typed": "7.2.1",
|
|
42
|
+
"eslint-plugin-ts-data-forge": "0.10.6",
|
|
43
|
+
"eslint-plugin-ts-fortress": "1.3.11",
|
|
44
|
+
"eslint-plugin-ts-type-forge": "0.8.16",
|
|
45
45
|
"playwright": "1.64.1",
|
|
46
46
|
"prettier": "3.9.10",
|
|
47
47
|
"prettier-plugin-organize-imports": "4.3.0",
|
package/src/synstate.mts
CHANGED
|
@@ -63,3 +63,78 @@ export {
|
|
|
63
63
|
withLatestFrom,
|
|
64
64
|
zip,
|
|
65
65
|
} from 'synstate';
|
|
66
|
+
|
|
67
|
+
export type {
|
|
68
|
+
AsyncChildObservable,
|
|
69
|
+
AsyncChildObservableHooks,
|
|
70
|
+
AsyncChildObservableTools,
|
|
71
|
+
AuditOperatorObservable,
|
|
72
|
+
ChildObservable,
|
|
73
|
+
ChildObservableConfig,
|
|
74
|
+
ChildObservableKind,
|
|
75
|
+
CombineObservable,
|
|
76
|
+
CombineObservableRefined,
|
|
77
|
+
CounterObservable,
|
|
78
|
+
DebounceOperatorObservable,
|
|
79
|
+
DeriveObservable,
|
|
80
|
+
DeriveObservableRefined,
|
|
81
|
+
DropInitialValueOperator,
|
|
82
|
+
FilterOperatorObservable,
|
|
83
|
+
FromPromiseObservable,
|
|
84
|
+
FromSubscribableObservable,
|
|
85
|
+
InitializedAsyncChildObservable,
|
|
86
|
+
InitializedChildObservableConfig,
|
|
87
|
+
InitializedObservable,
|
|
88
|
+
InitializedRootObservable,
|
|
89
|
+
InitializedSourceObservable,
|
|
90
|
+
InitializedSyncChildObservable,
|
|
91
|
+
KeepEqualPartsOperatorObservable,
|
|
92
|
+
KeepInitialValueOperator,
|
|
93
|
+
ManagerObservable,
|
|
94
|
+
ManagerObservableKind,
|
|
95
|
+
MapOperatorObservable,
|
|
96
|
+
MergeMapOperatorObservable,
|
|
97
|
+
MergeObservable,
|
|
98
|
+
MergeObservableRefined,
|
|
99
|
+
NonEmptyUnknownList,
|
|
100
|
+
Observable,
|
|
101
|
+
ObservableBase,
|
|
102
|
+
ObservableKind,
|
|
103
|
+
ObservableValue,
|
|
104
|
+
Operator,
|
|
105
|
+
PairwiseOperatorObservable,
|
|
106
|
+
RootObservable,
|
|
107
|
+
RootObservableConfig,
|
|
108
|
+
RootObservableTools,
|
|
109
|
+
ScanOperatorObservable,
|
|
110
|
+
Scope,
|
|
111
|
+
SkipIfNoChangeOperatorObservable,
|
|
112
|
+
SkipUntilOperatorObservable,
|
|
113
|
+
SkipWhileOperatorObservable,
|
|
114
|
+
SourceObservable,
|
|
115
|
+
StateOptions,
|
|
116
|
+
Subscribable,
|
|
117
|
+
Subscriber,
|
|
118
|
+
Subscription,
|
|
119
|
+
SwitchMapOperatorObservable,
|
|
120
|
+
SyncChildObservable,
|
|
121
|
+
SyncChildObservableHooks,
|
|
122
|
+
SyncChildObservableTools,
|
|
123
|
+
TakeOperatorObservable,
|
|
124
|
+
TakeUntilOperatorObservable,
|
|
125
|
+
TakeWhileOperatorObservable,
|
|
126
|
+
ThrottleOperatorObservable,
|
|
127
|
+
TimerId,
|
|
128
|
+
TimerObservable,
|
|
129
|
+
TupleToQueueTuple,
|
|
130
|
+
Unwrap,
|
|
131
|
+
UpdateToken,
|
|
132
|
+
WithBufferedFromOperatorObservable,
|
|
133
|
+
WithCurrentValueFromOperatorObservable,
|
|
134
|
+
WithInitialValueOperator,
|
|
135
|
+
WithInitialValueOperatorObservable,
|
|
136
|
+
Wrap,
|
|
137
|
+
WrapInitialized,
|
|
138
|
+
ZipObservable,
|
|
139
|
+
ZipObservableRefined,
|
|
140
|
+
} from 'synstate';
|
|
@@ -1,15 +1,49 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
2
|
import type { Observable } from 'synstate';
|
|
3
3
|
|
|
4
|
+
/**
|
|
5
|
+
* Subscribes `subscriptionFn` to `observable$` while the component is
|
|
6
|
+
* mounted, and unsubscribes when it unmounts.
|
|
7
|
+
*
|
|
8
|
+
* Each value is passed to the `subscriptionFn` of the latest render, so it
|
|
9
|
+
* sees the current props and state; a new function on every render does not
|
|
10
|
+
* re-subscribe. Passing a different Observable moves the subscription to it,
|
|
11
|
+
* so pass one that keeps its identity across renders (made outside the
|
|
12
|
+
* component, or memoized): one built during render is subscribed again, and
|
|
13
|
+
* an initialized one calls `subscriptionFn` again, on every render.
|
|
14
|
+
*
|
|
15
|
+
* @param observable$ The Observable to subscribe to.
|
|
16
|
+
* @param subscriptionFn Called with each value `observable$` emits.
|
|
17
|
+
*/
|
|
4
18
|
export const useObservableEffect = <A,>(
|
|
5
19
|
observable$: Observable<A>,
|
|
6
20
|
subscriptionFn: (v: A) => void,
|
|
7
21
|
): void => {
|
|
22
|
+
const mut_subscriptionFnRef = React.useRef(subscriptionFn);
|
|
23
|
+
|
|
24
|
+
// On React 18 and later, runs before the layout and passive effects of the
|
|
25
|
+
// commit, so a value one of them emits already reaches this render's
|
|
26
|
+
// `subscriptionFn`.
|
|
27
|
+
useBeforeEffects(() => {
|
|
28
|
+
mut_subscriptionFnRef.current = subscriptionFn;
|
|
29
|
+
});
|
|
30
|
+
|
|
8
31
|
React.useEffect(() => {
|
|
9
|
-
const s = observable$.subscribe(
|
|
32
|
+
const s = observable$.subscribe((v) => {
|
|
33
|
+
mut_subscriptionFnRef.current(v);
|
|
34
|
+
});
|
|
10
35
|
|
|
11
36
|
return () => {
|
|
12
37
|
s.unsubscribe();
|
|
13
38
|
};
|
|
14
|
-
}, []);
|
|
39
|
+
}, [observable$]);
|
|
15
40
|
};
|
|
41
|
+
|
|
42
|
+
// `useInsertionEffect` is React 18's (`'useInsertionEffect' in React` narrows
|
|
43
|
+
// to `never`, as the types have it). Before it, `useLayoutEffect` comes
|
|
44
|
+
// closest, running before the passive effects only; it warns when rendered
|
|
45
|
+
// on the server, where nothing emits anyway.
|
|
46
|
+
const useBeforeEffects: typeof React.useLayoutEffect =
|
|
47
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- React 16 and 17 have none, whatever the types say
|
|
48
|
+
React.useInsertionEffect ??
|
|
49
|
+
(typeof window === 'undefined' ? React.useEffect : React.useLayoutEffect);
|