@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.
@@ -1,4 +1,5 @@
1
1
  import { FCReactiveObject } from '@legendapp/state/react';
2
+ import { JSX } from 'react';
2
3
 
3
4
  declare function enableReactComponents(): void;
4
5
  declare module '@legendapp/state/react' {
@@ -1,4 +1,5 @@
1
1
  import { FCReactiveObject } from '@legendapp/state/react';
2
+ import { JSX } from 'react';
2
3
 
3
4
  declare function enableReactComponents(): void;
4
5
  declare module '@legendapp/state/react' {
@@ -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
- isValid = !!(nodeListeners == null ? void 0 : nodeListeners.has(listener)) || !!(nodeListenersImmediate == null ? void 0 : nodeListenersImmediate.has(listener));
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
- isValid = !(nodeListeners == null ? void 0 : nodeListeners.size) && !(nodeListenersImmediate == null ? void 0 : nodeListenersImmediate.size);
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
- isValid = !!(nodeListeners == null ? void 0 : nodeListeners.has(listener)) || !!(nodeListenersImmediate == null ? void 0 : nodeListenersImmediate.has(listener));
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
- isValid = !(nodeListeners == null ? void 0 : nodeListeners.size) && !(nodeListenersImmediate == null ? void 0 : nodeListenersImmediate.size);
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@legendapp/state",
3
- "version": "3.0.0-beta.43",
3
+ "version": "3.0.0-beta.45",
4
4
  "description": "legend-state",
5
5
  "sideEffects": false,
6
6
  "private": false,
@@ -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;
@@ -1,4 +1,5 @@
1
1
  import { FCReactiveObject, configureReactive } from '@legendapp/state/react';
2
+ import { JSX } from 'react';
2
3
 
3
4
  declare function enableReactComponents_(config: typeof configureReactive): void;
4
5
 
@@ -1,4 +1,5 @@
1
1
  import { FCReactiveObject, configureReactive } from '@legendapp/state/react';
2
+ import { JSX } from 'react';
2
3
 
3
4
  declare function enableReactComponents_(config: typeof configureReactive): void;
4
5
 
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 keyof P = keyof P> {
81
+ interface BindKey<P, K extends KeysOfUnion<P> = KeysOfUnion<P>> {
80
82
  handler?: K;
81
- getValue?: P[K] extends infer T ? T extends (...args: any) => any ? (params: Parameters<T>[0]) => any : (e: any) => any : (e: any) => any;
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 keyof P = keyof P> = Partial<Record<K, BindKey<P>>>;
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 ReactifyProps<T, K extends keyof T> = T & {
113
- [P in K as `$${string & P}`]?: Selector<T[P]>;
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 keyof T>(component: React.FC<T>, keys: K[] | (keyof T)[], bindKeys?: BindKeys<T, K>): React.FC<ReactifyProps<T, K>>;
121
- declare function reactive<T extends object, K extends keyof T>(component: React.ForwardRefExoticComponent<T>, keys: K[] | (keyof T)[], bindKeys?: BindKeys<T, K>): React.ForwardRefExoticComponent<ReactifyProps<T, K>>;
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 keyof T>(component: React.FC<T>, keys: K[] | (keyof T)[], bindKeys?: BindKeys<T, K>): React.FC<ReactifyProps<T, K>>;
128
- declare function reactiveObserver<T extends object, K extends keyof T>(component: React.ForwardRefExoticComponent<T>, keys: K[] | (keyof T)[], bindKeys?: BindKeys<T, K>): React.ForwardRefExoticComponent<ReactifyProps<T, K>>;
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 keyof P = keyof P> {
81
+ interface BindKey<P, K extends KeysOfUnion<P> = KeysOfUnion<P>> {
80
82
  handler?: K;
81
- getValue?: P[K] extends infer T ? T extends (...args: any) => any ? (params: Parameters<T>[0]) => any : (e: any) => any : (e: any) => any;
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 keyof P = keyof P> = Partial<Record<K, BindKey<P>>>;
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 ReactifyProps<T, K extends keyof T> = T & {
113
- [P in K as `$${string & P}`]?: Selector<T[P]>;
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 keyof T>(component: React.FC<T>, keys: K[] | (keyof T)[], bindKeys?: BindKeys<T, K>): React.FC<ReactifyProps<T, K>>;
121
- declare function reactive<T extends object, K extends keyof T>(component: React.ForwardRefExoticComponent<T>, keys: K[] | (keyof T)[], bindKeys?: BindKeys<T, K>): React.ForwardRefExoticComponent<ReactifyProps<T, K>>;
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 keyof T>(component: React.FC<T>, keys: K[] | (keyof T)[], bindKeys?: BindKeys<T, K>): React.FC<ReactifyProps<T, K>>;
128
- declare function reactiveObserver<T extends object, K extends keyof T>(component: React.ForwardRefExoticComponent<T>, keys: K[] | (keyof T)[], bindKeys?: BindKeys<T, K>): React.ForwardRefExoticComponent<ReactifyProps<T, K>>;
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 {
@@ -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 updated = (fieldUpdatedAt ? data[i][fieldUpdatedAt] : 0) || (fieldCreatedAt ? data[i][fieldCreatedAt] : 0);
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
- newLastSync = Math.max(newLastSync, +new Date(updated));
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;
@@ -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 updated = (fieldUpdatedAt ? data[i][fieldUpdatedAt] : 0) || (fieldCreatedAt ? data[i][fieldCreatedAt] : 0);
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
- newLastSync = Math.max(newLastSync, +new Date(updated));
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;
@@ -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
@@ -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: params
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(error, { getParams, source: "get", type: "get", retry: getParams }, true);
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: params
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(error, { getParams, source: "get", type: "get", retry: getParams }, true);
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);
@@ -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