@legendapp/state 3.0.0-beta.43 → 3.0.0-beta.45
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/config/enableReactComponents.d.mts +1 -0
- package/config/enableReactComponents.d.ts +1 -0
- package/config/enableReactNativeComponents.d.mts +1 -0
- package/config/enableReactNativeComponents.d.ts +1 -0
- package/index.js +37 -3
- package/index.mjs +37 -3
- package/package.json +1 -1
- package/react-hooks/createObservableHook.js +1 -1
- package/react-hooks/createObservableHook.mjs +1 -1
- package/react-reactive/enableReactComponents.d.mts +1 -0
- package/react-reactive/enableReactComponents.d.ts +1 -0
- package/react.d.mts +13 -10
- package/react.d.ts +13 -10
- package/react.js +3 -1
- package/react.mjs +3 -1
- package/sync-plugins/crud.js +12 -2
- package/sync-plugins/crud.mjs +12 -2
- package/sync-plugins/keel.js +1 -1
- package/sync-plugins/keel.mjs +1 -1
- package/sync.d.mts +1 -0
- package/sync.d.ts +1 -0
- package/sync.js +19 -2
- package/sync.mjs +19 -2
- package/types/reactive-web.d.ts +1 -0
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { JSX } from 'react';
|
|
1
2
|
import { FCReactiveObject, FCReactive } from '@legendapp/state/react';
|
|
2
3
|
import { ActivityIndicator, ActivityIndicatorProps, Button, ButtonProps, FlatList, FlatListProps, Image, ImageProps, Pressable, PressableProps, ScrollView, ScrollViewProps, SectionList, SectionListProps, Switch, SwitchProps, Text, TextProps, TextInput, TextInputProps, TouchableWithoutFeedback, TouchableWithoutFeedbackProps, View, ViewProps } from 'react-native';
|
|
3
4
|
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { JSX } from 'react';
|
|
1
2
|
import { FCReactiveObject, FCReactive } from '@legendapp/state/react';
|
|
2
3
|
import { ActivityIndicator, ActivityIndicatorProps, Button, ButtonProps, FlatList, FlatListProps, Image, ImageProps, Pressable, PressableProps, ScrollView, ScrollViewProps, SectionList, SectionListProps, Switch, SwitchProps, Text, TextProps, TextInput, TextInputProps, TouchableWithoutFeedback, TouchableWithoutFeedbackProps, View, ViewProps } from 'react-native';
|
|
3
4
|
|
package/index.js
CHANGED
|
@@ -918,16 +918,30 @@ function processQueuedEvents() {
|
|
|
918
918
|
continue;
|
|
919
919
|
const nodeListeners = node.listeners;
|
|
920
920
|
const nodeListenersImmediate = node.listenersImmediate;
|
|
921
|
-
if (!nodeListeners && !nodeListenersImmediate) {
|
|
921
|
+
if (!nodeListeners && !nodeListenersImmediate && node.numListenersRecursive && !(type === "listener-added" && !listener)) {
|
|
922
922
|
continue;
|
|
923
923
|
}
|
|
924
924
|
let isValid = false;
|
|
925
925
|
if (type === "listener-added") {
|
|
926
|
-
|
|
926
|
+
if (listener) {
|
|
927
|
+
isValid = !!(nodeListeners == null ? void 0 : nodeListeners.has(listener)) || !!(nodeListenersImmediate == null ? void 0 : nodeListenersImmediate.has(listener));
|
|
928
|
+
} else {
|
|
929
|
+
const hasNoLocalListeners = !(nodeListeners == null ? void 0 : nodeListeners.size) && !(nodeListenersImmediate == null ? void 0 : nodeListenersImmediate.size);
|
|
930
|
+
if (hasNoLocalListeners && typeof node.numListenersRecursive === "number") {
|
|
931
|
+
isValid = node.numListenersRecursive > 0;
|
|
932
|
+
} else {
|
|
933
|
+
isValid = false;
|
|
934
|
+
}
|
|
935
|
+
}
|
|
927
936
|
} else if (type === "listener-removed") {
|
|
928
937
|
isValid = !(nodeListeners == null ? void 0 : nodeListeners.has(listener)) && !(nodeListenersImmediate == null ? void 0 : nodeListenersImmediate.has(listener));
|
|
929
938
|
} else {
|
|
930
|
-
|
|
939
|
+
const hasAnyLocal = nodeListeners && nodeListeners.size > 0 || nodeListenersImmediate && nodeListenersImmediate.size > 0;
|
|
940
|
+
if (typeof node.numListenersRecursive === "number") {
|
|
941
|
+
isValid = !hasAnyLocal && node.numListenersRecursive === 0;
|
|
942
|
+
} else {
|
|
943
|
+
isValid = !hasAnyLocal;
|
|
944
|
+
}
|
|
931
945
|
}
|
|
932
946
|
if (isValid) {
|
|
933
947
|
eventObj.type = type;
|
|
@@ -947,6 +961,14 @@ function processQueuedEvents() {
|
|
|
947
961
|
}
|
|
948
962
|
|
|
949
963
|
// src/onChange.ts
|
|
964
|
+
function isSyncedObservable(node) {
|
|
965
|
+
var _a;
|
|
966
|
+
return ((_a = node.activationState) == null ? void 0 : _a.synced) || false;
|
|
967
|
+
}
|
|
968
|
+
function shouldDispatchParentMiddlewareEvent(node) {
|
|
969
|
+
var _a, _b;
|
|
970
|
+
return !((_a = node.listeners) == null ? void 0 : _a.size) && !((_b = node.listenersImmediate) == null ? void 0 : _b.size) && isSyncedObservable(node);
|
|
971
|
+
}
|
|
950
972
|
function onChange(node, callback, options = {}, fromLinks) {
|
|
951
973
|
var _a;
|
|
952
974
|
const { initial, immediate, noArgs } = options;
|
|
@@ -1013,6 +1035,9 @@ function onChange(node, callback, options = {}, fromLinks) {
|
|
|
1013
1035
|
}
|
|
1014
1036
|
}
|
|
1015
1037
|
parent.numListenersRecursive++;
|
|
1038
|
+
if (shouldDispatchParentMiddlewareEvent(parent)) {
|
|
1039
|
+
dispatchMiddlewareEvent(parent, void 0, "listener-added");
|
|
1040
|
+
}
|
|
1016
1041
|
pathParent = [parent.key, ...pathParent];
|
|
1017
1042
|
parent = parent.parent;
|
|
1018
1043
|
}
|
|
@@ -1020,15 +1045,24 @@ function onChange(node, callback, options = {}, fromLinks) {
|
|
|
1020
1045
|
return () => {
|
|
1021
1046
|
listeners.delete(listener);
|
|
1022
1047
|
extraDisposes == null ? void 0 : extraDisposes.forEach((fn) => fn());
|
|
1048
|
+
const clearedRecursive = [];
|
|
1023
1049
|
let parent2 = node;
|
|
1024
1050
|
while (parent2) {
|
|
1025
1051
|
parent2.numListenersRecursive--;
|
|
1052
|
+
if (parent2.numListenersRecursive === 0) {
|
|
1053
|
+
clearedRecursive.push(parent2);
|
|
1054
|
+
}
|
|
1026
1055
|
parent2 = parent2.parent;
|
|
1027
1056
|
}
|
|
1028
1057
|
dispatchMiddlewareEvent(node, listener, "listener-removed");
|
|
1029
1058
|
if (listeners.size === 0) {
|
|
1030
1059
|
dispatchMiddlewareEvent(node, void 0, "listeners-cleared");
|
|
1031
1060
|
}
|
|
1061
|
+
for (const clearedNode of clearedRecursive) {
|
|
1062
|
+
if (clearedNode !== node && shouldDispatchParentMiddlewareEvent(clearedNode)) {
|
|
1063
|
+
dispatchMiddlewareEvent(clearedNode, void 0, "listeners-cleared");
|
|
1064
|
+
}
|
|
1065
|
+
}
|
|
1032
1066
|
};
|
|
1033
1067
|
}
|
|
1034
1068
|
function createCb(linkedFromNode, path, callback) {
|
package/index.mjs
CHANGED
|
@@ -916,16 +916,30 @@ function processQueuedEvents() {
|
|
|
916
916
|
continue;
|
|
917
917
|
const nodeListeners = node.listeners;
|
|
918
918
|
const nodeListenersImmediate = node.listenersImmediate;
|
|
919
|
-
if (!nodeListeners && !nodeListenersImmediate) {
|
|
919
|
+
if (!nodeListeners && !nodeListenersImmediate && node.numListenersRecursive && !(type === "listener-added" && !listener)) {
|
|
920
920
|
continue;
|
|
921
921
|
}
|
|
922
922
|
let isValid = false;
|
|
923
923
|
if (type === "listener-added") {
|
|
924
|
-
|
|
924
|
+
if (listener) {
|
|
925
|
+
isValid = !!(nodeListeners == null ? void 0 : nodeListeners.has(listener)) || !!(nodeListenersImmediate == null ? void 0 : nodeListenersImmediate.has(listener));
|
|
926
|
+
} else {
|
|
927
|
+
const hasNoLocalListeners = !(nodeListeners == null ? void 0 : nodeListeners.size) && !(nodeListenersImmediate == null ? void 0 : nodeListenersImmediate.size);
|
|
928
|
+
if (hasNoLocalListeners && typeof node.numListenersRecursive === "number") {
|
|
929
|
+
isValid = node.numListenersRecursive > 0;
|
|
930
|
+
} else {
|
|
931
|
+
isValid = false;
|
|
932
|
+
}
|
|
933
|
+
}
|
|
925
934
|
} else if (type === "listener-removed") {
|
|
926
935
|
isValid = !(nodeListeners == null ? void 0 : nodeListeners.has(listener)) && !(nodeListenersImmediate == null ? void 0 : nodeListenersImmediate.has(listener));
|
|
927
936
|
} else {
|
|
928
|
-
|
|
937
|
+
const hasAnyLocal = nodeListeners && nodeListeners.size > 0 || nodeListenersImmediate && nodeListenersImmediate.size > 0;
|
|
938
|
+
if (typeof node.numListenersRecursive === "number") {
|
|
939
|
+
isValid = !hasAnyLocal && node.numListenersRecursive === 0;
|
|
940
|
+
} else {
|
|
941
|
+
isValid = !hasAnyLocal;
|
|
942
|
+
}
|
|
929
943
|
}
|
|
930
944
|
if (isValid) {
|
|
931
945
|
eventObj.type = type;
|
|
@@ -945,6 +959,14 @@ function processQueuedEvents() {
|
|
|
945
959
|
}
|
|
946
960
|
|
|
947
961
|
// src/onChange.ts
|
|
962
|
+
function isSyncedObservable(node) {
|
|
963
|
+
var _a;
|
|
964
|
+
return ((_a = node.activationState) == null ? void 0 : _a.synced) || false;
|
|
965
|
+
}
|
|
966
|
+
function shouldDispatchParentMiddlewareEvent(node) {
|
|
967
|
+
var _a, _b;
|
|
968
|
+
return !((_a = node.listeners) == null ? void 0 : _a.size) && !((_b = node.listenersImmediate) == null ? void 0 : _b.size) && isSyncedObservable(node);
|
|
969
|
+
}
|
|
948
970
|
function onChange(node, callback, options = {}, fromLinks) {
|
|
949
971
|
var _a;
|
|
950
972
|
const { initial, immediate, noArgs } = options;
|
|
@@ -1011,6 +1033,9 @@ function onChange(node, callback, options = {}, fromLinks) {
|
|
|
1011
1033
|
}
|
|
1012
1034
|
}
|
|
1013
1035
|
parent.numListenersRecursive++;
|
|
1036
|
+
if (shouldDispatchParentMiddlewareEvent(parent)) {
|
|
1037
|
+
dispatchMiddlewareEvent(parent, void 0, "listener-added");
|
|
1038
|
+
}
|
|
1014
1039
|
pathParent = [parent.key, ...pathParent];
|
|
1015
1040
|
parent = parent.parent;
|
|
1016
1041
|
}
|
|
@@ -1018,15 +1043,24 @@ function onChange(node, callback, options = {}, fromLinks) {
|
|
|
1018
1043
|
return () => {
|
|
1019
1044
|
listeners.delete(listener);
|
|
1020
1045
|
extraDisposes == null ? void 0 : extraDisposes.forEach((fn) => fn());
|
|
1046
|
+
const clearedRecursive = [];
|
|
1021
1047
|
let parent2 = node;
|
|
1022
1048
|
while (parent2) {
|
|
1023
1049
|
parent2.numListenersRecursive--;
|
|
1050
|
+
if (parent2.numListenersRecursive === 0) {
|
|
1051
|
+
clearedRecursive.push(parent2);
|
|
1052
|
+
}
|
|
1024
1053
|
parent2 = parent2.parent;
|
|
1025
1054
|
}
|
|
1026
1055
|
dispatchMiddlewareEvent(node, listener, "listener-removed");
|
|
1027
1056
|
if (listeners.size === 0) {
|
|
1028
1057
|
dispatchMiddlewareEvent(node, void 0, "listeners-cleared");
|
|
1029
1058
|
}
|
|
1059
|
+
for (const clearedNode of clearedRecursive) {
|
|
1060
|
+
if (clearedNode !== node && shouldDispatchParentMiddlewareEvent(clearedNode)) {
|
|
1061
|
+
dispatchMiddlewareEvent(clearedNode, void 0, "listeners-cleared");
|
|
1062
|
+
}
|
|
1063
|
+
}
|
|
1030
1064
|
};
|
|
1031
1065
|
}
|
|
1032
1066
|
function createCb(linkedFromNode, path, callback) {
|
package/package.json
CHANGED
|
@@ -29,7 +29,7 @@ function createObservableHook(fn) {
|
|
|
29
29
|
const _useState = React__default.default.useState;
|
|
30
30
|
const _useReducer = React__default.default.useReducer;
|
|
31
31
|
return function(...args) {
|
|
32
|
-
const refObs = React__default.default.useRef();
|
|
32
|
+
const refObs = React__default.default.useRef(void 0);
|
|
33
33
|
overrideHooks(refObs);
|
|
34
34
|
fn(...args);
|
|
35
35
|
React__default.default.useState = _useState;
|
|
@@ -23,7 +23,7 @@ function createObservableHook(fn) {
|
|
|
23
23
|
const _useState = React.useState;
|
|
24
24
|
const _useReducer = React.useReducer;
|
|
25
25
|
return function(...args) {
|
|
26
|
-
const refObs = React.useRef();
|
|
26
|
+
const refObs = React.useRef(void 0);
|
|
27
27
|
overrideHooks(refObs);
|
|
28
28
|
fn(...args);
|
|
29
29
|
React.useState = _useState;
|
package/react.d.mts
CHANGED
|
@@ -71,18 +71,20 @@ declare function Switch<T>({ value, children, }: {
|
|
|
71
71
|
children: Partial<Record<'undefined' | 'default', () => ReactNode>>;
|
|
72
72
|
}): ReactElement | null;
|
|
73
73
|
|
|
74
|
+
type KeysOfUnion<T> = T extends T ? keyof T : never;
|
|
75
|
+
type ValueOfUnionKey$1<P, K extends PropertyKey> = P extends any ? (K extends keyof P ? P[K] : never) : never;
|
|
74
76
|
type ShapeWithNew$<T> = Partial<Omit<T, 'children'>> & {
|
|
75
77
|
[K in keyof T as K extends `$${string & K}` ? K : `$${string & K}`]?: Selector<T[K]>;
|
|
76
78
|
} & {
|
|
77
79
|
children?: Selector<ReactNode>;
|
|
78
80
|
};
|
|
79
|
-
interface BindKey<P, K extends
|
|
81
|
+
interface BindKey<P, K extends KeysOfUnion<P> = KeysOfUnion<P>> {
|
|
80
82
|
handler?: K;
|
|
81
|
-
getValue?: P
|
|
83
|
+
getValue?: ValueOfUnionKey$1<P, K> extends infer T ? T extends (...args: any) => any ? (params: Parameters<T>[0]) => any : (e: any) => any : (e: any) => any;
|
|
82
84
|
defaultValue?: any;
|
|
83
85
|
selector?: (propsOut: Record<string, any>, p: Observable<any>) => any;
|
|
84
86
|
}
|
|
85
|
-
type BindKeys<P = any, K extends
|
|
87
|
+
type BindKeys<P = any, K extends KeysOfUnion<P> = KeysOfUnion<P>> = Partial<Record<K, BindKey<P, K>>>;
|
|
86
88
|
type FCReactiveObject<T> = {
|
|
87
89
|
[K in keyof T]: FC<ShapeWithNew$<T[K]>>;
|
|
88
90
|
};
|
|
@@ -109,23 +111,24 @@ type ShapeWith$<T> = WithSelectorChildren<Partial<T>> & {
|
|
|
109
111
|
type ObjectShapeWith$<T> = {
|
|
110
112
|
[K in keyof T]: T[K] extends FC<infer P> ? FC<ShapeWith$<P>> : T[K];
|
|
111
113
|
};
|
|
112
|
-
type
|
|
113
|
-
|
|
114
|
+
type ValueOfUnionKey<T, K extends PropertyKey> = T extends any ? (K extends keyof T ? T[K] : never) : never;
|
|
115
|
+
type ReactifyProps<T, K extends KeysOfUnion<T>> = T & {
|
|
116
|
+
[P in K as `$${string & P}`]?: Selector<ValueOfUnionKey<T, P>>;
|
|
114
117
|
};
|
|
115
118
|
declare const hasSymbol: false | ((key: string) => symbol);
|
|
116
119
|
declare function observer<P extends FC<any>>(component: P): P;
|
|
117
120
|
declare function reactive<T extends object>(component: React.ComponentClass<T>, keys: undefined | null, bindKeys?: BindKeys<T>): React.FC<ShapeWith$<T>>;
|
|
118
121
|
declare function reactive<T extends object>(component: React.FC<T>, keys: undefined | null, bindKeys?: BindKeys<T>): React.FC<ShapeWith$<T>>;
|
|
119
122
|
declare function reactive<T extends object>(component: React.ForwardRefExoticComponent<T>, keys: undefined | null, bindKeys?: BindKeys<T>): React.ForwardRefExoticComponent<ShapeWith$<T>>;
|
|
120
|
-
declare function reactive<T extends object, K extends
|
|
121
|
-
declare function reactive<T extends object, K extends
|
|
123
|
+
declare function reactive<T extends object, K extends KeysOfUnion<T>>(component: React.FC<T>, keys: K[] | KeysOfUnion<T>[], bindKeys?: BindKeys<T, K>): React.FC<ReactifyProps<T, K>>;
|
|
124
|
+
declare function reactive<T extends object, K extends KeysOfUnion<T>>(component: React.ForwardRefExoticComponent<T>, keys: K[] | KeysOfUnion<T>[], bindKeys?: BindKeys<T, K>): React.ForwardRefExoticComponent<ReactifyProps<T, K>>;
|
|
122
125
|
declare function reactive<T extends object>(component: React.ComponentClass<T>): React.ComponentClass<ShapeWith$<T>>;
|
|
123
126
|
declare function reactive<T extends object>(component: React.FC<T>): React.FC<ShapeWith$<T>>;
|
|
124
127
|
declare function reactive<T extends object>(component: React.ForwardRefExoticComponent<T>): React.ForwardRefExoticComponent<ShapeWith$<T>>;
|
|
125
128
|
declare function reactiveObserver<T extends object>(component: React.FC<T>, keys: undefined | null, bindKeys?: BindKeys<T>): React.FC<ShapeWith$<T>>;
|
|
126
129
|
declare function reactiveObserver<T extends object>(component: React.ForwardRefExoticComponent<T>, keys: undefined | null, bindKeys?: BindKeys<T>): React.ForwardRefExoticComponent<ShapeWith$<T>>;
|
|
127
|
-
declare function reactiveObserver<T extends object, K extends
|
|
128
|
-
declare function reactiveObserver<T extends object, K extends
|
|
130
|
+
declare function reactiveObserver<T extends object, K extends KeysOfUnion<T>>(component: React.FC<T>, keys: K[] | KeysOfUnion<T>[], bindKeys?: BindKeys<T, K>): React.FC<ReactifyProps<T, K>>;
|
|
131
|
+
declare function reactiveObserver<T extends object, K extends KeysOfUnion<T>>(component: React.ForwardRefExoticComponent<T>, keys: K[] | KeysOfUnion<T>[], bindKeys?: BindKeys<T, K>): React.ForwardRefExoticComponent<ReactifyProps<T, K>>;
|
|
129
132
|
declare function reactiveObserver<T extends object>(component: React.FC<T>): React.FC<ShapeWith$<T>>;
|
|
130
133
|
declare function reactiveObserver<T extends object>(component: React.ForwardRefExoticComponent<T>): React.ForwardRefExoticComponent<ShapeWith$<T>>;
|
|
131
134
|
declare function reactiveComponents<P extends Record<string, any>>(components: P): ObjectShapeWith$<P>;
|
|
@@ -192,4 +195,4 @@ declare function configureReactive({ components, binders, }: {
|
|
|
192
195
|
binders?: Record<string, BindKeys>;
|
|
193
196
|
}): void;
|
|
194
197
|
|
|
195
|
-
export { type BindKey, type BindKeys, Computed, type FCReactive, type FCReactiveObject, For, type IReactive, Memo, type ObjectShapeWith$, type ReactifyProps, Reactive, type ShapeWith$, type ShapeWithNew$, Show, Switch, type UseObserveOptions, type UseSelectorOptions, configureReactive, hasSymbol, observer, reactive, reactiveComponents, reactiveObserver, useSelector as use$, useComputed, useEffectOnce, useIsMounted, useObservable as useLocalObservable, useMount, useMountOnce, useObservable, useObservableReducer, useObserve, useObserveEffect, usePauseProvider, useSelector, useUnmount, useUnmountOnce, useSelector as useValue, useWhen, useWhenReady };
|
|
198
|
+
export { type BindKey, type BindKeys, Computed, type FCReactive, type FCReactiveObject, For, type IReactive, type KeysOfUnion, Memo, type ObjectShapeWith$, type ReactifyProps, Reactive, type ShapeWith$, type ShapeWithNew$, Show, Switch, type UseObserveOptions, type UseSelectorOptions, configureReactive, hasSymbol, observer, reactive, reactiveComponents, reactiveObserver, useSelector as use$, useComputed, useEffectOnce, useIsMounted, useObservable as useLocalObservable, useMount, useMountOnce, useObservable, useObservableReducer, useObserve, useObserveEffect, usePauseProvider, useSelector, useUnmount, useUnmountOnce, useSelector as useValue, useWhen, useWhenReady };
|
package/react.d.ts
CHANGED
|
@@ -71,18 +71,20 @@ declare function Switch<T>({ value, children, }: {
|
|
|
71
71
|
children: Partial<Record<'undefined' | 'default', () => ReactNode>>;
|
|
72
72
|
}): ReactElement | null;
|
|
73
73
|
|
|
74
|
+
type KeysOfUnion<T> = T extends T ? keyof T : never;
|
|
75
|
+
type ValueOfUnionKey$1<P, K extends PropertyKey> = P extends any ? (K extends keyof P ? P[K] : never) : never;
|
|
74
76
|
type ShapeWithNew$<T> = Partial<Omit<T, 'children'>> & {
|
|
75
77
|
[K in keyof T as K extends `$${string & K}` ? K : `$${string & K}`]?: Selector<T[K]>;
|
|
76
78
|
} & {
|
|
77
79
|
children?: Selector<ReactNode>;
|
|
78
80
|
};
|
|
79
|
-
interface BindKey<P, K extends
|
|
81
|
+
interface BindKey<P, K extends KeysOfUnion<P> = KeysOfUnion<P>> {
|
|
80
82
|
handler?: K;
|
|
81
|
-
getValue?: P
|
|
83
|
+
getValue?: ValueOfUnionKey$1<P, K> extends infer T ? T extends (...args: any) => any ? (params: Parameters<T>[0]) => any : (e: any) => any : (e: any) => any;
|
|
82
84
|
defaultValue?: any;
|
|
83
85
|
selector?: (propsOut: Record<string, any>, p: Observable<any>) => any;
|
|
84
86
|
}
|
|
85
|
-
type BindKeys<P = any, K extends
|
|
87
|
+
type BindKeys<P = any, K extends KeysOfUnion<P> = KeysOfUnion<P>> = Partial<Record<K, BindKey<P, K>>>;
|
|
86
88
|
type FCReactiveObject<T> = {
|
|
87
89
|
[K in keyof T]: FC<ShapeWithNew$<T[K]>>;
|
|
88
90
|
};
|
|
@@ -109,23 +111,24 @@ type ShapeWith$<T> = WithSelectorChildren<Partial<T>> & {
|
|
|
109
111
|
type ObjectShapeWith$<T> = {
|
|
110
112
|
[K in keyof T]: T[K] extends FC<infer P> ? FC<ShapeWith$<P>> : T[K];
|
|
111
113
|
};
|
|
112
|
-
type
|
|
113
|
-
|
|
114
|
+
type ValueOfUnionKey<T, K extends PropertyKey> = T extends any ? (K extends keyof T ? T[K] : never) : never;
|
|
115
|
+
type ReactifyProps<T, K extends KeysOfUnion<T>> = T & {
|
|
116
|
+
[P in K as `$${string & P}`]?: Selector<ValueOfUnionKey<T, P>>;
|
|
114
117
|
};
|
|
115
118
|
declare const hasSymbol: false | ((key: string) => symbol);
|
|
116
119
|
declare function observer<P extends FC<any>>(component: P): P;
|
|
117
120
|
declare function reactive<T extends object>(component: React.ComponentClass<T>, keys: undefined | null, bindKeys?: BindKeys<T>): React.FC<ShapeWith$<T>>;
|
|
118
121
|
declare function reactive<T extends object>(component: React.FC<T>, keys: undefined | null, bindKeys?: BindKeys<T>): React.FC<ShapeWith$<T>>;
|
|
119
122
|
declare function reactive<T extends object>(component: React.ForwardRefExoticComponent<T>, keys: undefined | null, bindKeys?: BindKeys<T>): React.ForwardRefExoticComponent<ShapeWith$<T>>;
|
|
120
|
-
declare function reactive<T extends object, K extends
|
|
121
|
-
declare function reactive<T extends object, K extends
|
|
123
|
+
declare function reactive<T extends object, K extends KeysOfUnion<T>>(component: React.FC<T>, keys: K[] | KeysOfUnion<T>[], bindKeys?: BindKeys<T, K>): React.FC<ReactifyProps<T, K>>;
|
|
124
|
+
declare function reactive<T extends object, K extends KeysOfUnion<T>>(component: React.ForwardRefExoticComponent<T>, keys: K[] | KeysOfUnion<T>[], bindKeys?: BindKeys<T, K>): React.ForwardRefExoticComponent<ReactifyProps<T, K>>;
|
|
122
125
|
declare function reactive<T extends object>(component: React.ComponentClass<T>): React.ComponentClass<ShapeWith$<T>>;
|
|
123
126
|
declare function reactive<T extends object>(component: React.FC<T>): React.FC<ShapeWith$<T>>;
|
|
124
127
|
declare function reactive<T extends object>(component: React.ForwardRefExoticComponent<T>): React.ForwardRefExoticComponent<ShapeWith$<T>>;
|
|
125
128
|
declare function reactiveObserver<T extends object>(component: React.FC<T>, keys: undefined | null, bindKeys?: BindKeys<T>): React.FC<ShapeWith$<T>>;
|
|
126
129
|
declare function reactiveObserver<T extends object>(component: React.ForwardRefExoticComponent<T>, keys: undefined | null, bindKeys?: BindKeys<T>): React.ForwardRefExoticComponent<ShapeWith$<T>>;
|
|
127
|
-
declare function reactiveObserver<T extends object, K extends
|
|
128
|
-
declare function reactiveObserver<T extends object, K extends
|
|
130
|
+
declare function reactiveObserver<T extends object, K extends KeysOfUnion<T>>(component: React.FC<T>, keys: K[] | KeysOfUnion<T>[], bindKeys?: BindKeys<T, K>): React.FC<ReactifyProps<T, K>>;
|
|
131
|
+
declare function reactiveObserver<T extends object, K extends KeysOfUnion<T>>(component: React.ForwardRefExoticComponent<T>, keys: K[] | KeysOfUnion<T>[], bindKeys?: BindKeys<T, K>): React.ForwardRefExoticComponent<ReactifyProps<T, K>>;
|
|
129
132
|
declare function reactiveObserver<T extends object>(component: React.FC<T>): React.FC<ShapeWith$<T>>;
|
|
130
133
|
declare function reactiveObserver<T extends object>(component: React.ForwardRefExoticComponent<T>): React.ForwardRefExoticComponent<ShapeWith$<T>>;
|
|
131
134
|
declare function reactiveComponents<P extends Record<string, any>>(components: P): ObjectShapeWith$<P>;
|
|
@@ -192,4 +195,4 @@ declare function configureReactive({ components, binders, }: {
|
|
|
192
195
|
binders?: Record<string, BindKeys>;
|
|
193
196
|
}): void;
|
|
194
197
|
|
|
195
|
-
export { type BindKey, type BindKeys, Computed, type FCReactive, type FCReactiveObject, For, type IReactive, Memo, type ObjectShapeWith$, type ReactifyProps, Reactive, type ShapeWith$, type ShapeWithNew$, Show, Switch, type UseObserveOptions, type UseSelectorOptions, configureReactive, hasSymbol, observer, reactive, reactiveComponents, reactiveObserver, useSelector as use$, useComputed, useEffectOnce, useIsMounted, useObservable as useLocalObservable, useMount, useMountOnce, useObservable, useObservableReducer, useObserve, useObserveEffect, usePauseProvider, useSelector, useUnmount, useUnmountOnce, useSelector as useValue, useWhen, useWhenReady };
|
|
198
|
+
export { type BindKey, type BindKeys, Computed, type FCReactive, type FCReactiveObject, For, type IReactive, type KeysOfUnion, Memo, type ObjectShapeWith$, type ReactifyProps, Reactive, type ShapeWith$, type ShapeWithNew$, Show, Switch, type UseObserveOptions, type UseSelectorOptions, configureReactive, hasSymbol, observer, reactive, reactiveComponents, reactiveObserver, useSelector as use$, useComputed, useEffectOnce, useIsMounted, useObservable as useLocalObservable, useMount, useMountOnce, useObservable, useObservableReducer, useObserve, useObserveEffect, usePauseProvider, useSelector, useUnmount, useUnmountOnce, useSelector as useValue, useWhen, useWhenReady };
|
package/react.js
CHANGED
|
@@ -286,7 +286,9 @@ function For({
|
|
|
286
286
|
return null;
|
|
287
287
|
const value = useSelector(() => each.get(isOptimized ? optimized : true));
|
|
288
288
|
if (!item && children) {
|
|
289
|
-
const refChildren = React.useRef(
|
|
289
|
+
const refChildren = React.useRef(
|
|
290
|
+
void 0
|
|
291
|
+
);
|
|
290
292
|
refChildren.current = children;
|
|
291
293
|
item = React.useMemo(() => observer(({ item$, id }) => refChildren.current(item$, id)), []);
|
|
292
294
|
} else {
|
package/react.mjs
CHANGED
|
@@ -280,7 +280,9 @@ function For({
|
|
|
280
280
|
return null;
|
|
281
281
|
const value = useSelector(() => each.get(isOptimized ? optimized : true));
|
|
282
282
|
if (!item && children) {
|
|
283
|
-
const refChildren = useRef(
|
|
283
|
+
const refChildren = useRef(
|
|
284
|
+
void 0
|
|
285
|
+
);
|
|
284
286
|
refChildren.current = children;
|
|
285
287
|
item = useMemo(() => observer(({ item$, id }) => refChildren.current(item$, id)), []);
|
|
286
288
|
} else {
|
package/sync-plugins/crud.js
CHANGED
|
@@ -18,11 +18,21 @@ function ensureId(obj, fieldId, generateId, node) {
|
|
|
18
18
|
}
|
|
19
19
|
}
|
|
20
20
|
function computeLastSync(data, fieldUpdatedAt, fieldCreatedAt) {
|
|
21
|
+
if (!state.isArray(data) || data.length === 0) {
|
|
22
|
+
return 0;
|
|
23
|
+
}
|
|
21
24
|
let newLastSync = 0;
|
|
22
25
|
for (let i = 0; i < data.length; i++) {
|
|
23
|
-
const
|
|
26
|
+
const row = data[i];
|
|
27
|
+
if (!row || typeof row !== "object") {
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
const updated = (fieldUpdatedAt ? row[fieldUpdatedAt] : 0) || (fieldCreatedAt ? row[fieldCreatedAt] : 0);
|
|
24
31
|
if (updated) {
|
|
25
|
-
|
|
32
|
+
const updatedTime = +new Date(updated);
|
|
33
|
+
if (!Number.isNaN(updatedTime)) {
|
|
34
|
+
newLastSync = Math.max(newLastSync, updatedTime);
|
|
35
|
+
}
|
|
26
36
|
}
|
|
27
37
|
}
|
|
28
38
|
return newLastSync;
|
package/sync-plugins/crud.mjs
CHANGED
|
@@ -16,11 +16,21 @@ function ensureId(obj, fieldId, generateId, node) {
|
|
|
16
16
|
}
|
|
17
17
|
}
|
|
18
18
|
function computeLastSync(data, fieldUpdatedAt, fieldCreatedAt) {
|
|
19
|
+
if (!isArray(data) || data.length === 0) {
|
|
20
|
+
return 0;
|
|
21
|
+
}
|
|
19
22
|
let newLastSync = 0;
|
|
20
23
|
for (let i = 0; i < data.length; i++) {
|
|
21
|
-
const
|
|
24
|
+
const row = data[i];
|
|
25
|
+
if (!row || typeof row !== "object") {
|
|
26
|
+
continue;
|
|
27
|
+
}
|
|
28
|
+
const updated = (fieldUpdatedAt ? row[fieldUpdatedAt] : 0) || (fieldCreatedAt ? row[fieldCreatedAt] : 0);
|
|
22
29
|
if (updated) {
|
|
23
|
-
|
|
30
|
+
const updatedTime = +new Date(updated);
|
|
31
|
+
if (!Number.isNaN(updatedTime)) {
|
|
32
|
+
newLastSync = Math.max(newLastSync, updatedTime);
|
|
33
|
+
}
|
|
24
34
|
}
|
|
25
35
|
}
|
|
26
36
|
return newLastSync;
|
package/sync-plugins/keel.js
CHANGED
|
@@ -81,7 +81,7 @@ function setupRealtime(props) {
|
|
|
81
81
|
modifiedClients.add(client);
|
|
82
82
|
const originalRawRequest = client.client.rawRequest;
|
|
83
83
|
client.client.rawRequest = (action, body) => {
|
|
84
|
-
if (action.startsWith("list")) {
|
|
84
|
+
if (action.startsWith("list") || action.startsWith("get")) {
|
|
85
85
|
realtimeState.current = {
|
|
86
86
|
lastAction: action,
|
|
87
87
|
lastParams: body
|
package/sync-plugins/keel.mjs
CHANGED
|
@@ -79,7 +79,7 @@ function setupRealtime(props) {
|
|
|
79
79
|
modifiedClients.add(client);
|
|
80
80
|
const originalRawRequest = client.client.rawRequest;
|
|
81
81
|
client.client.rawRequest = (action, body) => {
|
|
82
|
-
if (action.startsWith("list")) {
|
|
82
|
+
if (action.startsWith("list") || action.startsWith("get")) {
|
|
83
83
|
realtimeState.current = {
|
|
84
84
|
lastAction: action,
|
|
85
85
|
lastParams: body
|
package/sync.d.mts
CHANGED
|
@@ -46,6 +46,7 @@ interface SyncedSubscribeParams<T = any> extends SyncedGetSetSubscribeBaseParams
|
|
|
46
46
|
onError: (error: Error) => void;
|
|
47
47
|
}
|
|
48
48
|
interface SyncedErrorParams {
|
|
49
|
+
syncOptions?: Readonly<SyncedOptions<any>>;
|
|
49
50
|
source: 'get' | 'set' | 'subscribe';
|
|
50
51
|
type: 'get' | 'set';
|
|
51
52
|
retry: OnErrorRetryParams;
|
package/sync.d.ts
CHANGED
|
@@ -46,6 +46,7 @@ interface SyncedSubscribeParams<T = any> extends SyncedGetSetSubscribeBaseParams
|
|
|
46
46
|
onError: (error: Error) => void;
|
|
47
47
|
}
|
|
48
48
|
interface SyncedErrorParams {
|
|
49
|
+
syncOptions?: Readonly<SyncedOptions<any>>;
|
|
49
50
|
source: 'get' | 'set' | 'subscribe';
|
|
50
51
|
type: 'get' | 'set';
|
|
51
52
|
retry: OnErrorRetryParams;
|
package/sync.js
CHANGED
|
@@ -685,6 +685,7 @@ async function doChangeRemote(changeInfo) {
|
|
|
685
685
|
if (lastErrorHandled !== error) {
|
|
686
686
|
if (!params) {
|
|
687
687
|
params = {
|
|
688
|
+
syncOptions,
|
|
688
689
|
setParams,
|
|
689
690
|
source: "set",
|
|
690
691
|
type: "set",
|
|
@@ -692,6 +693,11 @@ async function doChangeRemote(changeInfo) {
|
|
|
692
693
|
retry: setParams,
|
|
693
694
|
revert: createRevertChanges(setParams.value$, setParams.changes)
|
|
694
695
|
};
|
|
696
|
+
} else if (!params.syncOptions) {
|
|
697
|
+
params = {
|
|
698
|
+
...params,
|
|
699
|
+
syncOptions
|
|
700
|
+
};
|
|
695
701
|
}
|
|
696
702
|
state$.error.set(error);
|
|
697
703
|
(_a2 = syncOptions.onError) == null ? void 0 : _a2.call(syncOptions, error, params);
|
|
@@ -1017,9 +1023,15 @@ function syncObservable(obs$, syncOptionsOrSynced) {
|
|
|
1017
1023
|
if (lastErrorHandled !== error) {
|
|
1018
1024
|
if (!params) {
|
|
1019
1025
|
params = {
|
|
1026
|
+
syncOptions,
|
|
1020
1027
|
source: "get",
|
|
1021
1028
|
type: "get",
|
|
1022
|
-
retry:
|
|
1029
|
+
retry: { retryNum: 0, cancelRetry: false }
|
|
1030
|
+
};
|
|
1031
|
+
} else if (!params.syncOptions) {
|
|
1032
|
+
params = {
|
|
1033
|
+
...params,
|
|
1034
|
+
syncOptions
|
|
1023
1035
|
};
|
|
1024
1036
|
}
|
|
1025
1037
|
syncState$.error.set(error);
|
|
@@ -1211,6 +1223,7 @@ function syncObservable(obs$, syncOptionsOrSynced) {
|
|
|
1211
1223
|
refresh: () => state.when(syncState$.isLoaded, callSync),
|
|
1212
1224
|
onError: (error) => onGetError(error, {
|
|
1213
1225
|
source: "subscribe",
|
|
1226
|
+
syncOptions,
|
|
1214
1227
|
subscribeParams,
|
|
1215
1228
|
type: "get",
|
|
1216
1229
|
retry: {}
|
|
@@ -1309,7 +1322,11 @@ function syncObservable(obs$, syncOptionsOrSynced) {
|
|
|
1309
1322
|
};
|
|
1310
1323
|
if (state.isPromise(got)) {
|
|
1311
1324
|
got.then(handle).catch((error) => {
|
|
1312
|
-
onGetError(
|
|
1325
|
+
onGetError(
|
|
1326
|
+
error,
|
|
1327
|
+
{ getParams, syncOptions, source: "get", type: "get", retry: getParams },
|
|
1328
|
+
true
|
|
1329
|
+
);
|
|
1313
1330
|
});
|
|
1314
1331
|
} else {
|
|
1315
1332
|
handle(got);
|
package/sync.mjs
CHANGED
|
@@ -683,6 +683,7 @@ async function doChangeRemote(changeInfo) {
|
|
|
683
683
|
if (lastErrorHandled !== error) {
|
|
684
684
|
if (!params) {
|
|
685
685
|
params = {
|
|
686
|
+
syncOptions,
|
|
686
687
|
setParams,
|
|
687
688
|
source: "set",
|
|
688
689
|
type: "set",
|
|
@@ -690,6 +691,11 @@ async function doChangeRemote(changeInfo) {
|
|
|
690
691
|
retry: setParams,
|
|
691
692
|
revert: createRevertChanges(setParams.value$, setParams.changes)
|
|
692
693
|
};
|
|
694
|
+
} else if (!params.syncOptions) {
|
|
695
|
+
params = {
|
|
696
|
+
...params,
|
|
697
|
+
syncOptions
|
|
698
|
+
};
|
|
693
699
|
}
|
|
694
700
|
state$.error.set(error);
|
|
695
701
|
(_a2 = syncOptions.onError) == null ? void 0 : _a2.call(syncOptions, error, params);
|
|
@@ -1015,9 +1021,15 @@ function syncObservable(obs$, syncOptionsOrSynced) {
|
|
|
1015
1021
|
if (lastErrorHandled !== error) {
|
|
1016
1022
|
if (!params) {
|
|
1017
1023
|
params = {
|
|
1024
|
+
syncOptions,
|
|
1018
1025
|
source: "get",
|
|
1019
1026
|
type: "get",
|
|
1020
|
-
retry:
|
|
1027
|
+
retry: { retryNum: 0, cancelRetry: false }
|
|
1028
|
+
};
|
|
1029
|
+
} else if (!params.syncOptions) {
|
|
1030
|
+
params = {
|
|
1031
|
+
...params,
|
|
1032
|
+
syncOptions
|
|
1021
1033
|
};
|
|
1022
1034
|
}
|
|
1023
1035
|
syncState$.error.set(error);
|
|
@@ -1209,6 +1221,7 @@ function syncObservable(obs$, syncOptionsOrSynced) {
|
|
|
1209
1221
|
refresh: () => when(syncState$.isLoaded, callSync),
|
|
1210
1222
|
onError: (error) => onGetError(error, {
|
|
1211
1223
|
source: "subscribe",
|
|
1224
|
+
syncOptions,
|
|
1212
1225
|
subscribeParams,
|
|
1213
1226
|
type: "get",
|
|
1214
1227
|
retry: {}
|
|
@@ -1307,7 +1320,11 @@ function syncObservable(obs$, syncOptionsOrSynced) {
|
|
|
1307
1320
|
};
|
|
1308
1321
|
if (isPromise$1(got)) {
|
|
1309
1322
|
got.then(handle).catch((error) => {
|
|
1310
|
-
onGetError(
|
|
1323
|
+
onGetError(
|
|
1324
|
+
error,
|
|
1325
|
+
{ getParams, syncOptions, source: "get", type: "get", retry: getParams },
|
|
1326
|
+
true
|
|
1327
|
+
);
|
|
1311
1328
|
});
|
|
1312
1329
|
} else {
|
|
1313
1330
|
handle(got);
|
package/types/reactive-web.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
2
2
|
import type { IReactive, FCReactiveObject } from '@legendapp/state/react';
|
|
3
|
+
import type { JSX } from 'react';
|
|
3
4
|
|
|
4
5
|
declare module '@legendapp/state/react' {
|
|
5
6
|
// eslint-disable-next-line @typescript-eslint/no-empty-interface
|