@legendapp/state 2.2.0-next.7 → 2.2.0-next.71
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 +4 -2
- package/babel.js.map +1 -1
- package/config/enable$get.d.ts +8 -0
- package/config/enable$get.js +24 -0
- package/config/enable$get.js.map +1 -0
- package/config/enable$get.mjs +21 -0
- package/config/enable$get.mjs.map +1 -0
- package/config/enableReactComponents.js.map +1 -1
- package/config/enableReactComponents.mjs.map +1 -1
- package/config/enableReactNativeComponents.js.map +1 -1
- package/config/enableReactNativeComponents.mjs.map +1 -1
- package/config/enableReactTracking.d.ts +0 -9
- package/config/enableReactTracking.js.map +1 -1
- package/config/enableReactTracking.mjs.map +1 -1
- package/config/enableReactUse.d.ts +1 -1
- package/config/enableReactUse.js +1 -0
- package/config/enableReactUse.js.map +1 -1
- package/config/enableReactUse.mjs +1 -0
- package/config/enableReactUse.mjs.map +1 -1
- package/config/enable_peek.d.ts +8 -0
- package/config/{enableDirectPeek.js → enable_peek.js} +6 -3
- package/config/enable_peek.js.map +1 -0
- package/config/{enableDirectPeek.mjs → enable_peek.mjs} +5 -3
- package/config/enable_peek.mjs.map +1 -0
- package/helpers/fetch.d.ts +4 -3
- package/helpers/fetch.js.map +1 -1
- package/helpers/fetch.mjs.map +1 -1
- package/helpers/pageHash.js.map +1 -1
- package/helpers/pageHash.mjs.map +1 -1
- package/helpers/pageHashParams.js.map +1 -1
- package/helpers/pageHashParams.mjs.map +1 -1
- package/helpers/time.d.ts +2 -2
- package/helpers/time.js.map +1 -1
- package/helpers/time.mjs.map +1 -1
- package/history.js +2 -2
- package/history.js.map +1 -1
- package/history.mjs +3 -3
- package/history.mjs.map +1 -1
- package/index.d.ts +30 -9
- package/index.js +877 -661
- package/index.js.map +1 -1
- package/index.mjs +874 -658
- package/index.mjs.map +1 -1
- package/package.json +22 -25
- package/persist-plugins/async-storage.d.ts +3 -3
- package/persist-plugins/async-storage.js +8 -7
- package/persist-plugins/async-storage.js.map +1 -1
- package/persist-plugins/async-storage.mjs +9 -8
- package/persist-plugins/async-storage.mjs.map +1 -1
- package/persist-plugins/fetch.js.map +1 -1
- package/persist-plugins/fetch.mjs.map +1 -1
- package/persist-plugins/firebase.d.ts +1 -1
- package/persist-plugins/firebase.js +12 -11
- package/persist-plugins/firebase.js.map +1 -1
- package/persist-plugins/firebase.mjs +13 -12
- package/persist-plugins/firebase.mjs.map +1 -1
- package/persist-plugins/indexeddb.d.ts +10 -10
- package/persist-plugins/indexeddb.js +2 -2
- package/persist-plugins/indexeddb.js.map +1 -1
- package/persist-plugins/indexeddb.mjs +2 -2
- package/persist-plugins/indexeddb.mjs.map +1 -1
- package/persist-plugins/local-storage.d.ts +3 -4
- package/persist-plugins/local-storage.js +19 -7
- package/persist-plugins/local-storage.js.map +1 -1
- package/persist-plugins/local-storage.mjs +20 -9
- package/persist-plugins/local-storage.mjs.map +1 -1
- package/persist-plugins/mmkv.d.ts +8 -8
- package/persist-plugins/mmkv.js +5 -4
- package/persist-plugins/mmkv.js.map +1 -1
- package/persist-plugins/mmkv.mjs +6 -5
- package/persist-plugins/mmkv.mjs.map +1 -1
- package/persist-plugins/query.js.map +1 -1
- package/persist-plugins/query.mjs.map +1 -1
- package/persist.d.ts +2 -14
- package/persist.js +1250 -268
- package/persist.js.map +1 -1
- package/persist.mjs +1250 -269
- package/persist.mjs.map +1 -1
- package/react-hooks/createObservableHook.js +1 -1
- package/react-hooks/createObservableHook.js.map +1 -1
- package/react-hooks/createObservableHook.mjs +1 -1
- package/react-hooks/createObservableHook.mjs.map +1 -1
- package/react-hooks/useFetch.d.ts +4 -3
- package/react-hooks/useFetch.js.map +1 -1
- package/react-hooks/useFetch.mjs.map +1 -1
- package/react-hooks/useHover.js.map +1 -1
- package/react-hooks/useHover.mjs.map +1 -1
- package/react-hooks/useMeasure.js.map +1 -1
- package/react-hooks/useMeasure.mjs.map +1 -1
- package/react-hooks/useObservableNextRouter.js.map +1 -1
- package/react-hooks/useObservableNextRouter.mjs.map +1 -1
- package/react-hooks/useObservableQuery.js.map +1 -1
- package/react-hooks/useObservableQuery.mjs.map +1 -1
- package/react-hooks/usePersistedObservable.d.ts +5 -3
- package/react-hooks/usePersistedObservable.js +5 -2
- package/react-hooks/usePersistedObservable.js.map +1 -1
- package/react-hooks/usePersistedObservable.mjs +5 -2
- package/react-hooks/usePersistedObservable.mjs.map +1 -1
- package/react.js +61 -75
- package/react.js.map +1 -1
- package/react.mjs +61 -75
- package/react.mjs.map +1 -1
- package/src/ObservableObject.ts +1184 -0
- package/src/ObservablePrimitive.ts +62 -0
- package/src/babel/index.ts +70 -0
- package/src/batching.ts +372 -0
- package/src/computed.ts +16 -0
- package/src/config/enable$get.ts +30 -0
- package/src/config/enableReactComponents.ts +26 -0
- package/src/config/enableReactNativeComponents.ts +102 -0
- package/src/config/enableReactTracking.ts +60 -0
- package/src/config/enableReactUse.ts +23 -0
- package/src/config/enable_peek.ts +31 -0
- package/src/config.ts +47 -0
- package/src/createObservable.ts +46 -0
- package/src/event.ts +26 -0
- package/src/globals.ts +224 -0
- package/src/helpers/fetch.ts +26 -0
- package/src/helpers/pageHash.ts +41 -0
- package/src/helpers/pageHashParams.ts +55 -0
- package/src/helpers/time.ts +30 -0
- package/src/helpers.ts +221 -0
- package/src/history/trackHistory.ts +29 -0
- package/src/is.ts +56 -0
- package/src/linked.ts +6 -0
- package/src/observable.ts +32 -0
- package/src/observableInterfaces.ts +165 -0
- package/src/observableTypes.ts +221 -0
- package/src/observe.ts +89 -0
- package/src/onChange.ts +136 -0
- package/src/persist/configureObservablePersistence.ts +7 -0
- package/src/persist/fieldTransformer.ts +149 -0
- package/src/persist/observablePersistRemoteFunctionsAdapter.ts +39 -0
- package/src/persist/persistObservable.ts +1029 -0
- package/src/persist-plugins/async-storage.ts +102 -0
- package/src/persist-plugins/fetch.ts +33 -0
- package/src/persist-plugins/firebase.ts +1050 -0
- package/src/persist-plugins/indexeddb.ts +433 -0
- package/src/persist-plugins/local-storage.ts +90 -0
- package/src/persist-plugins/mmkv.ts +90 -0
- package/src/persist-plugins/query.ts +133 -0
- package/src/persistTypes.ts +226 -0
- package/src/proxy.ts +28 -0
- package/src/react/Computed.tsx +7 -0
- package/src/react/For.tsx +116 -0
- package/src/react/Memo.tsx +4 -0
- package/src/react/Reactive.tsx +53 -0
- package/src/react/Show.tsx +33 -0
- package/src/react/Switch.tsx +43 -0
- package/src/react/react-globals.ts +3 -0
- package/src/react/{reactInterfaces.d.ts → reactInterfaces.ts} +15 -7
- package/src/react/reactive-observer.tsx +210 -0
- package/src/react/useComputed.ts +36 -0
- package/src/react/useEffectOnce.ts +41 -0
- package/src/react/useIsMounted.ts +16 -0
- package/src/react/useMount.ts +15 -0
- package/src/react/useObservable.ts +24 -0
- package/src/react/useObservableReducer.ts +52 -0
- package/src/react/useObservableState.ts +30 -0
- package/src/react/useObserve.ts +54 -0
- package/src/react/useObserveEffect.ts +40 -0
- package/src/react/usePauseProvider.tsx +13 -0
- package/src/react/useSelector.ts +167 -0
- package/src/react/useUnmount.ts +8 -0
- package/src/react/useWhen.ts +9 -0
- package/src/react-hooks/createObservableHook.ts +53 -0
- package/src/react-hooks/useFetch.ts +16 -0
- package/src/react-hooks/useHover.ts +40 -0
- package/src/react-hooks/useMeasure.ts +48 -0
- package/src/react-hooks/useObservableNextRouter.ts +137 -0
- package/src/react-hooks/useObservableQuery.ts +205 -0
- package/src/react-hooks/usePersistedObservable.ts +24 -0
- package/src/retry.ts +69 -0
- package/src/setupTracking.ts +26 -0
- package/src/sync/activateSyncedNode.ts +146 -0
- package/src/sync/configureObservableSync.ts +7 -0
- package/src/sync/syncHelpers.ts +15 -0
- package/src/sync/syncObservable.ts +989 -0
- package/src/sync/syncObservableAdapter.ts +30 -0
- package/src/sync/synced.ts +20 -0
- package/src/sync-plugins/fetch.ts +42 -0
- package/src/syncTypes.ts +163 -0
- package/src/trace/traceHelpers.ts +11 -0
- package/src/trace/useTraceListeners.ts +34 -0
- package/src/trace/useTraceUpdates.ts +24 -0
- package/src/trace/useVerifyNotTracking.ts +33 -0
- package/src/trace/useVerifyOneRender.ts +10 -0
- package/src/trackSelector.ts +52 -0
- package/src/tracking.ts +43 -0
- package/src/types/babel.d.ts +12 -0
- package/src/when.ts +70 -0
- package/sync-plugins/fetch.d.ts +11 -0
- package/sync-plugins/fetch.js +24 -0
- package/sync-plugins/fetch.js.map +1 -0
- package/sync-plugins/fetch.mjs +22 -0
- package/sync-plugins/fetch.mjs.map +1 -0
- package/sync.d.ts +8 -0
- package/sync.js +919 -0
- package/sync.js.map +1 -0
- package/sync.mjs +912 -0
- package/sync.mjs.map +1 -0
- package/trace.js +13 -10
- package/trace.js.map +1 -1
- package/trace.mjs +11 -8
- package/trace.mjs.map +1 -1
- package/types/babel.d.ts +3 -3
- package/config/enableDirectAccess.d.ts +0 -7
- package/config/enableDirectAccess.js +0 -25
- package/config/enableDirectAccess.js.map +0 -1
- package/config/enableDirectAccess.mjs +0 -23
- package/config/enableDirectAccess.mjs.map +0 -1
- package/config/enableDirectPeek.d.ts +0 -7
- package/config/enableDirectPeek.js.map +0 -1
- package/config/enableDirectPeek.mjs.map +0 -1
- package/config/enableReactDirectRender.d.ts +0 -2
- package/config/enableReactDirectRender.js +0 -78
- package/config/enableReactDirectRender.js.map +0 -1
- package/config/enableReactDirectRender.mjs +0 -75
- package/config/enableReactDirectRender.mjs.map +0 -1
- package/src/ObservableObject.d.ts +0 -14
- package/src/ObservablePrimitive.d.ts +0 -7
- package/src/babel/index.d.ts +0 -17
- package/src/batching.d.ts +0 -6
- package/src/computed.d.ts +0 -4
- package/src/config/enableDirectAccess.d.ts +0 -7
- package/src/config/enableDirectPeek.d.ts +0 -7
- package/src/config/enableReactComponents.d.ts +0 -7
- package/src/config/enableReactDirectRender.d.ts +0 -2
- package/src/config/enableReactNativeComponents.d.ts +0 -20
- package/src/config/enableReactTracking.d.ts +0 -15
- package/src/config/enableReactUse.d.ts +0 -7
- package/src/config.d.ts +0 -8
- package/src/createObservable.d.ts +0 -2
- package/src/event.d.ts +0 -2
- package/src/globals.d.ts +0 -32
- package/src/helpers/fetch.d.ts +0 -6
- package/src/helpers/pageHash.d.ts +0 -7
- package/src/helpers/pageHashParams.d.ts +0 -7
- package/src/helpers/time.d.ts +0 -3
- package/src/helpers.d.ts +0 -13
- package/src/history/trackHistory.d.ts +0 -4
- package/src/is.d.ts +0 -10
- package/src/observable.d.ts +0 -16
- package/src/observableInterfaces.d.ts +0 -456
- package/src/observe.d.ts +0 -6
- package/src/onChange.d.ts +0 -7
- package/src/persist/configureObservablePersistence.d.ts +0 -3
- package/src/persist/fieldTransformer.d.ts +0 -8
- package/src/persist/observablePersistRemoteFunctionsAdapter.d.ts +0 -2
- package/src/persist/persistActivateNode.d.ts +0 -1
- package/src/persist/persistHelpers.d.ts +0 -1
- package/src/persist/persistObservable.d.ts +0 -25
- package/src/persist-plugins/async-storage.d.ts +0 -14
- package/src/persist-plugins/fetch.d.ts +0 -10
- package/src/persist-plugins/firebase.d.ts +0 -51
- package/src/persist-plugins/indexeddb.d.ts +0 -25
- package/src/persist-plugins/local-storage.d.ts +0 -21
- package/src/persist-plugins/mmkv.d.ts +0 -14
- package/src/persist-plugins/query.d.ts +0 -18
- package/src/proxy.d.ts +0 -5
- package/src/react/Computed.d.ts +0 -5
- package/src/react/For.d.ts +0 -15
- package/src/react/Memo.d.ts +0 -3
- package/src/react/Reactive.d.ts +0 -9
- package/src/react/Show.d.ts +0 -18
- package/src/react/Switch.d.ts +0 -14
- package/src/react/react-globals.d.ts +0 -3
- package/src/react/reactive-observer.d.ts +0 -14
- package/src/react/useComputed.d.ts +0 -5
- package/src/react/useEffectOnce.d.ts +0 -1
- package/src/react/useIsMounted.d.ts +0 -2
- package/src/react/useMount.d.ts +0 -2
- package/src/react/useObservable.d.ts +0 -9
- package/src/react/useObservableReducer.d.ts +0 -7
- package/src/react/useObservableState.d.ts +0 -2
- package/src/react/useObserve.d.ts +0 -4
- package/src/react/useObserveEffect.d.ts +0 -4
- package/src/react/usePauseProvider.d.ts +0 -8
- package/src/react/useSelector.d.ts +0 -3
- package/src/react/useUnmount.d.ts +0 -2
- package/src/react/useWhen.d.ts +0 -3
- package/src/react-hooks/createObservableHook.d.ts +0 -2
- package/src/react-hooks/useFetch.d.ts +0 -6
- package/src/react-hooks/useHover.d.ts +0 -3
- package/src/react-hooks/useMeasure.d.ts +0 -6
- package/src/react-hooks/useObservableNextRouter.d.ts +0 -33
- package/src/react-hooks/useObservableQuery.d.ts +0 -6
- package/src/react-hooks/usePersistedObservable.d.ts +0 -11
- package/src/retry.d.ts +0 -9
- package/src/setupTracking.d.ts +0 -2
- package/src/trace/traceHelpers.d.ts +0 -2
- package/src/trace/useTraceListeners.d.ts +0 -1
- package/src/trace/useTraceUpdates.d.ts +0 -1
- package/src/trace/useVerifyNotTracking.d.ts +0 -1
- package/src/trace/useVerifyOneRender.d.ts +0 -1
- package/src/trackSelector.d.ts +0 -7
- package/src/tracking.d.ts +0 -13
- package/src/when.d.ts +0 -3
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { Observable, ObservableParam, LegacyPersistOptions, observable } from '@legendapp/state';
|
|
2
|
+
import { persistObservable } from '@legendapp/state/persist';
|
|
3
|
+
import { useMemo } from 'react';
|
|
4
|
+
|
|
5
|
+
// TODO: Deprecate this
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* A React hook that creates a new observable and can optionally listen or persist its state.
|
|
9
|
+
*
|
|
10
|
+
* @param initialValue The initial value of the observable or a function that returns the initial value
|
|
11
|
+
* @param options Persistence options for the observable
|
|
12
|
+
*
|
|
13
|
+
* @see https://www.legendapp.com/dev/state/react/#useObservable
|
|
14
|
+
*/
|
|
15
|
+
export function usePersistedObservable<T>(params: {
|
|
16
|
+
options: LegacyPersistOptions<T>;
|
|
17
|
+
initialValue?: T | (() => T) | (() => Promise<T>);
|
|
18
|
+
}): Observable<T> {
|
|
19
|
+
// Create the observable from the default value
|
|
20
|
+
return useMemo(() => {
|
|
21
|
+
const obs$ = observable<T>(params.initialValue as any);
|
|
22
|
+
persistObservable<T>(obs$ as ObservableParam<T>, params.options);
|
|
23
|
+
}, []) as any;
|
|
24
|
+
}
|
package/src/retry.ts
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { whenReady } from './when';
|
|
2
|
+
import type { NodeValue, RetryOptions } from './observableInterfaces';
|
|
3
|
+
import { isPromise } from './is';
|
|
4
|
+
|
|
5
|
+
function calculateRetryDelay(retryOptions: RetryOptions, attemptNum: number): number | null {
|
|
6
|
+
const { backoff, delay = 1000, infinite, times = 3, maxDelay = 30000 } = retryOptions;
|
|
7
|
+
if (infinite || attemptNum < times) {
|
|
8
|
+
const delayTime = Math.min(delay * (backoff === 'constant' ? 1 : 2 ** attemptNum), maxDelay);
|
|
9
|
+
return delayTime;
|
|
10
|
+
}
|
|
11
|
+
return null;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
function createRetryTimeout(retryOptions: RetryOptions, attemptNum: number, fn: () => void) {
|
|
15
|
+
const delayTime = calculateRetryDelay(retryOptions, attemptNum);
|
|
16
|
+
if (delayTime) {
|
|
17
|
+
return setTimeout(fn, delayTime);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export function runWithRetry<T>(
|
|
22
|
+
node: NodeValue,
|
|
23
|
+
state: { attemptNum: number },
|
|
24
|
+
fn: (e: { cancel?: boolean }) => T | Promise<T>,
|
|
25
|
+
): T | Promise<T> {
|
|
26
|
+
const { retry, waitFor } = node.activationState!;
|
|
27
|
+
|
|
28
|
+
const e = { cancel: false };
|
|
29
|
+
let value: any = undefined;
|
|
30
|
+
if (waitFor) {
|
|
31
|
+
value = whenReady(waitFor, () => {
|
|
32
|
+
node.activationState!.waitFor = undefined;
|
|
33
|
+
return fn(e);
|
|
34
|
+
});
|
|
35
|
+
} else {
|
|
36
|
+
value = fn(e);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
if (isPromise(value) && retry) {
|
|
40
|
+
let timeoutRetry: any;
|
|
41
|
+
return new Promise<any>((resolve) => {
|
|
42
|
+
const run = () => {
|
|
43
|
+
(value as Promise<any>)
|
|
44
|
+
.then((val: any) => {
|
|
45
|
+
node.activationState!.persistedRetry = false;
|
|
46
|
+
resolve(val);
|
|
47
|
+
})
|
|
48
|
+
.catch(() => {
|
|
49
|
+
state.attemptNum++;
|
|
50
|
+
if (timeoutRetry) {
|
|
51
|
+
clearTimeout(timeoutRetry);
|
|
52
|
+
}
|
|
53
|
+
if (!e.cancel) {
|
|
54
|
+
timeoutRetry = createRetryTimeout(retry, state.attemptNum, () => {
|
|
55
|
+
value = fn(e);
|
|
56
|
+
run();
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
})
|
|
60
|
+
.finally(() => {
|
|
61
|
+
node.activationState!.persistedRetry = false;
|
|
62
|
+
});
|
|
63
|
+
};
|
|
64
|
+
run();
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
return value;
|
|
69
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { ListenerFn, NodeValue, TrackingNode } from './observableInterfaces';
|
|
2
|
+
import { onChange } from './onChange';
|
|
3
|
+
|
|
4
|
+
export function setupTracking(
|
|
5
|
+
nodes: Map<NodeValue, TrackingNode> | undefined,
|
|
6
|
+
update: ListenerFn,
|
|
7
|
+
noArgs?: boolean,
|
|
8
|
+
immediate?: boolean,
|
|
9
|
+
) {
|
|
10
|
+
let listeners: (() => void)[] | undefined = [];
|
|
11
|
+
|
|
12
|
+
// Listen to tracked nodes
|
|
13
|
+
nodes?.forEach((tracked) => {
|
|
14
|
+
const { node, track } = tracked;
|
|
15
|
+
listeners!.push(onChange(node, update, { trackingType: track, immediate, noArgs }));
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
return () => {
|
|
19
|
+
if (listeners) {
|
|
20
|
+
for (let i = 0; i < listeners.length; i++) {
|
|
21
|
+
listeners[i]();
|
|
22
|
+
}
|
|
23
|
+
listeners = undefined;
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
GetMode,
|
|
3
|
+
NodeValue,
|
|
4
|
+
Observable,
|
|
5
|
+
ObservableOnChangeParams,
|
|
6
|
+
ObservablePersistState,
|
|
7
|
+
ObservableSyncFunctions,
|
|
8
|
+
ObservableSyncGetParams,
|
|
9
|
+
ObservableSyncSetParams,
|
|
10
|
+
SyncedGetParams,
|
|
11
|
+
SyncedSetParams,
|
|
12
|
+
UpdateFn,
|
|
13
|
+
} from '@legendapp/state';
|
|
14
|
+
import { internal, isFunction, isPromise, mergeIntoObservable, when, whenReady } from '@legendapp/state';
|
|
15
|
+
import { syncObservable } from './syncObservable';
|
|
16
|
+
const { getProxy, globalState, runWithRetry, symbolLinked, setNodeValue, getNodeValue } = internal;
|
|
17
|
+
|
|
18
|
+
export function enableActivateSyncedNode() {
|
|
19
|
+
globalState.activateSyncedNode = function activateSyncedNode(node: NodeValue, newValue: any) {
|
|
20
|
+
const obs$ = getProxy(node);
|
|
21
|
+
if (node.activationState) {
|
|
22
|
+
// If it is a Synced
|
|
23
|
+
const { get, initial, set, subscribe } = node.activationState!;
|
|
24
|
+
|
|
25
|
+
let onChange: UpdateFn | undefined = undefined;
|
|
26
|
+
const pluginRemote: ObservableSyncFunctions = {};
|
|
27
|
+
let promiseReturn: any = undefined;
|
|
28
|
+
|
|
29
|
+
// Not sure why this disable is needed, but it's needed to make the linter happy
|
|
30
|
+
// eslint-disable-next-line prefer-const
|
|
31
|
+
let syncState: Observable<ObservablePersistState>;
|
|
32
|
+
const refresh = () => syncState?.sync();
|
|
33
|
+
|
|
34
|
+
if (get) {
|
|
35
|
+
pluginRemote.get = (params: ObservableSyncGetParams<any>) => {
|
|
36
|
+
onChange = params.onChange;
|
|
37
|
+
const updateLastSync = (lastSync: number) => (params.lastSync = lastSync);
|
|
38
|
+
const setMode = (mode: GetMode) => (params.mode = mode);
|
|
39
|
+
|
|
40
|
+
const existingValue = getNodeValue(node);
|
|
41
|
+
const value = runWithRetry(node, { attemptNum: 0 }, () => {
|
|
42
|
+
return get!({
|
|
43
|
+
value:
|
|
44
|
+
isFunction(existingValue) || existingValue?.[symbolLinked] ? undefined : existingValue,
|
|
45
|
+
lastSync: params.lastSync!,
|
|
46
|
+
updateLastSync,
|
|
47
|
+
setMode,
|
|
48
|
+
refresh,
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
promiseReturn = value;
|
|
53
|
+
|
|
54
|
+
return value;
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
if (set) {
|
|
58
|
+
// TODO: Work out these types better
|
|
59
|
+
pluginRemote.set = async (params: ObservableSyncSetParams<any>) => {
|
|
60
|
+
if (node.state?.isLoaded.get()) {
|
|
61
|
+
const retryAttempts = { attemptNum: 0 };
|
|
62
|
+
return runWithRetry(node, retryAttempts, async (retryEvent) => {
|
|
63
|
+
let changes = {};
|
|
64
|
+
let maxModified = 0;
|
|
65
|
+
if (!node.state!.isLoaded.peek()) {
|
|
66
|
+
await whenReady(node.state!.isLoaded);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const cancelRetry = () => {
|
|
70
|
+
retryEvent.cancel = true;
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
await set({
|
|
74
|
+
...(params as unknown as SyncedSetParams<any>),
|
|
75
|
+
node,
|
|
76
|
+
update: (params) => {
|
|
77
|
+
const { value, lastSync } = params;
|
|
78
|
+
maxModified = Math.max(lastSync || 0, maxModified);
|
|
79
|
+
changes = mergeIntoObservable(changes, value);
|
|
80
|
+
},
|
|
81
|
+
retryNum: retryAttempts.attemptNum,
|
|
82
|
+
cancelRetry,
|
|
83
|
+
refresh,
|
|
84
|
+
fromSubscribe: false,
|
|
85
|
+
});
|
|
86
|
+
return { changes, lastSync: maxModified || undefined };
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
const nodeVal = getNodeValue(node);
|
|
93
|
+
if (promiseReturn !== undefined) {
|
|
94
|
+
newValue = promiseReturn;
|
|
95
|
+
} else if (nodeVal !== undefined && !isFunction(nodeVal)) {
|
|
96
|
+
newValue = nodeVal;
|
|
97
|
+
} else {
|
|
98
|
+
newValue = initial;
|
|
99
|
+
}
|
|
100
|
+
setNodeValue(node, promiseReturn ? undefined : newValue);
|
|
101
|
+
|
|
102
|
+
// @ts-expect-error TODO fix these types
|
|
103
|
+
syncState = syncObservable(obs$, { ...node.activationState, ...pluginRemote });
|
|
104
|
+
|
|
105
|
+
if (subscribe) {
|
|
106
|
+
when(promiseReturn || true, () => {
|
|
107
|
+
subscribe({
|
|
108
|
+
node,
|
|
109
|
+
update: (params: ObservableOnChangeParams) => {
|
|
110
|
+
if (!onChange) {
|
|
111
|
+
// TODO: Make this message better
|
|
112
|
+
console.log('[legend-state] Cannot update immediately before the first return');
|
|
113
|
+
} else {
|
|
114
|
+
onChange(params);
|
|
115
|
+
}
|
|
116
|
+
},
|
|
117
|
+
refresh,
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
return { update: onChange!, value: newValue };
|
|
123
|
+
} else {
|
|
124
|
+
// If it is not a Synced
|
|
125
|
+
|
|
126
|
+
let update: UpdateFn | undefined = undefined;
|
|
127
|
+
const get = async (params: SyncedGetParams) => {
|
|
128
|
+
update = params.refresh;
|
|
129
|
+
if (isPromise(newValue)) {
|
|
130
|
+
try {
|
|
131
|
+
newValue = await newValue;
|
|
132
|
+
} catch {
|
|
133
|
+
// TODO Once we have global retry settings this should retry
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return newValue;
|
|
137
|
+
};
|
|
138
|
+
|
|
139
|
+
syncObservable(obs$, {
|
|
140
|
+
get,
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
return { update: update!, value: newValue };
|
|
144
|
+
}
|
|
145
|
+
};
|
|
146
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { SyncedOptionsGlobal } from '@legendapp/state';
|
|
2
|
+
|
|
3
|
+
export const observableSyncConfiguration: SyncedOptionsGlobal = {};
|
|
4
|
+
|
|
5
|
+
export function configureObservableSync(options?: SyncedOptionsGlobal) {
|
|
6
|
+
Object.assign(observableSyncConfiguration, options);
|
|
7
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { isObject } from '@legendapp/state';
|
|
2
|
+
|
|
3
|
+
export function removeNullUndefined<T extends Record<string, any>>(val: T) {
|
|
4
|
+
if (val) {
|
|
5
|
+
Object.keys(val).forEach((key) => {
|
|
6
|
+
const v = val[key];
|
|
7
|
+
if (v === null || v === undefined) {
|
|
8
|
+
delete val[key];
|
|
9
|
+
} else if (isObject(v)) {
|
|
10
|
+
removeNullUndefined(v);
|
|
11
|
+
}
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
return val;
|
|
15
|
+
}
|