react-obsidian 2.31.0-alpha.7 → 2.31.0-alpha.8
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/dist/src/observable/cold/ColdMediatorObservable.d.ts +1 -0
- package/dist/src/observable/cold/ColdMediatorObservable.d.ts.map +1 -1
- package/dist/src/observable/cold/ColdMediatorObservable.js +4 -1
- package/dist/src/observable/cold/ColdMediatorObservable.js.map +1 -1
- package/dist/src/observable/cold/useColdObservers.d.ts.map +1 -1
- package/dist/src/observable/cold/useColdObservers.js +23 -6
- package/dist/src/observable/cold/useColdObservers.js.map +1 -1
- package/dist/src/observable/useObserver.d.ts.map +1 -1
- package/dist/src/observable/useObserver.js +6 -1
- package/dist/src/observable/useObserver.js.map +1 -1
- package/dist/src/observable/useObservers.d.ts.map +1 -1
- package/dist/src/observable/useObservers.js +19 -9
- package/dist/src/observable/useObservers.js.map +1 -1
- package/package.json +1 -1
- package/src/observable/cold/ColdMediatorObservable.ts +5 -1
- package/src/observable/cold/useColdObservers.ts +44 -7
- package/src/observable/useObserver.ts +10 -1
- package/src/observable/useObservers.ts +43 -14
|
@@ -7,6 +7,7 @@ export declare class ColdMediatorObservable<T extends object> extends MediatorOb
|
|
|
7
7
|
set value(_: T);
|
|
8
8
|
get value(): T;
|
|
9
9
|
setValue(key: keyof T, value: any): void;
|
|
10
|
+
private shouldUpdateTrackedProperty;
|
|
10
11
|
addSource<S>(source: Observable<S>, onNext: OnNext<S>): this;
|
|
11
12
|
}
|
|
12
13
|
declare class PropertyAccessTrackingProxy<T extends object> implements ProxyHandler<T> {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ColdMediatorObservable.d.ts","sourceRoot":"","sources":["../../../../src/observable/cold/ColdMediatorObservable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAGlC,qBAAa,sBAAsB,CAAC,CAAC,SAAS,MAAM,CAAE,SAAQ,kBAAkB,CAAC,CAAC,CAAC;IAC7D,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAhC,GAAG,EAAE,CAAC,EAAmB,OAAO,iCAAuC;IAInF,IAAa,KAAK,CAAC,CAAC,EAAE,CAAC,EAEtB;IAED,IAAa,KAAK,IAAI,CAAC,CAEtB;IAED,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,GAAG;
|
|
1
|
+
{"version":3,"file":"ColdMediatorObservable.d.ts","sourceRoot":"","sources":["../../../../src/observable/cold/ColdMediatorObservable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAGlC,qBAAa,sBAAsB,CAAC,CAAC,SAAS,MAAM,CAAE,SAAQ,kBAAkB,CAAC,CAAC,CAAC;IAC7D,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAhC,GAAG,EAAE,CAAC,EAAmB,OAAO,iCAAuC;IAInF,IAAa,KAAK,CAAC,CAAC,EAAE,CAAC,EAEtB;IAED,IAAa,KAAK,IAAI,CAAC,CAEtB;IAED,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,GAAG;IAQjC,OAAO,CAAC,2BAA2B;IAI1B,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CAI/D;AAED,cAAM,2BAA2B,CAAC,CAAC,SAAS,MAAM,CAAE,YAAW,YAAY,CAAC,CAAC,CAAC;IAC5E,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAsB;IACzD,OAAO,CAAC,iBAAiB,CAAS;IAElC,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,QAAQ,EAAE,GAAG;IAOhD,mBAAmB,CAAC,GAAG,EAAE,MAAM,CAAC;IAIzB,eAAe;IAIf,cAAc;CAGtB"}
|
|
@@ -15,12 +15,15 @@ class ColdMediatorObservable extends MediatorObservable_1.MediatorObservable {
|
|
|
15
15
|
return super.value;
|
|
16
16
|
}
|
|
17
17
|
setValue(key, value) {
|
|
18
|
-
if (this.
|
|
18
|
+
if (this.shouldUpdateTrackedProperty(key, value)) {
|
|
19
19
|
this.handler.suspendTracking();
|
|
20
20
|
super.value = { ...this.value, [key]: value };
|
|
21
21
|
this.handler.resumeTracking();
|
|
22
22
|
}
|
|
23
23
|
}
|
|
24
|
+
shouldUpdateTrackedProperty(key, value) {
|
|
25
|
+
return this.handler.hasAccessedProperty(key) && !Object.is(this.value[key], value);
|
|
26
|
+
}
|
|
24
27
|
addSource(source, onNext) {
|
|
25
28
|
source.subscribe(onNext);
|
|
26
29
|
return this;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ColdMediatorObservable.js","sourceRoot":"","sources":["../../../../src/observable/cold/ColdMediatorObservable.ts"],"names":[],"mappings":";;;AACA,uEAAoE;AAEpE,iDAA4C;AAE5C,MAAa,sBAAyC,SAAQ,uCAAqB;IACjF,YAAY,GAAM,EAAmB,UAAU,IAAI,2BAA2B,EAAK;QACjF,KAAK,CAAC,IAAI,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;QADI,YAAO,GAAP,OAAO,CAAuC;IAEnF,CAAC;IAED,IAAa,KAAK,CAAC,CAAI;QACrB,MAAM,IAAI,KAAK,CAAC,8EAA8E,CAAC,CAAC;IAClG,CAAC;IAED,IAAa,KAAK;QAChB,OAAO,KAAK,CAAC,KAAK,CAAC;IACrB,CAAC;IAED,QAAQ,CAAC,GAAY,EAAE,KAAU;QAC/B,IAAI,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"ColdMediatorObservable.js","sourceRoot":"","sources":["../../../../src/observable/cold/ColdMediatorObservable.ts"],"names":[],"mappings":";;;AACA,uEAAoE;AAEpE,iDAA4C;AAE5C,MAAa,sBAAyC,SAAQ,uCAAqB;IACjF,YAAY,GAAM,EAAmB,UAAU,IAAI,2BAA2B,EAAK;QACjF,KAAK,CAAC,IAAI,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;QADI,YAAO,GAAP,OAAO,CAAuC;IAEnF,CAAC;IAED,IAAa,KAAK,CAAC,CAAI;QACrB,MAAM,IAAI,KAAK,CAAC,8EAA8E,CAAC,CAAC;IAClG,CAAC;IAED,IAAa,KAAK;QAChB,OAAO,KAAK,CAAC,KAAK,CAAC;IACrB,CAAC;IAED,QAAQ,CAAC,GAAY,EAAE,KAAU;QAC/B,IAAI,IAAI,CAAC,2BAA2B,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC;YACjD,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;YAC/B,KAAK,CAAC,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC;YAC9C,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;QAChC,CAAC;IACH,CAAC;IAEO,2BAA2B,CAAC,GAAY,EAAE,KAAU;QAC1D,OAAO,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;IACrF,CAAC;IAEQ,SAAS,CAAI,MAAqB,EAAE,MAAiB;QAC5D,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AA7BD,wDA6BC;AAED,MAAM,2BAA2B;IAAjC;QACmB,uBAAkB,GAAG,IAAI,GAAG,EAAW,CAAC;QACjD,sBAAiB,GAAG,KAAK,CAAC;IAoBpC,CAAC;IAlBC,GAAG,CAAC,MAAS,EAAE,CAAkB,EAAE,QAAa;QAC9C,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC5B,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAY,CAAC,CAAC;QAC5C,CAAC;QACD,OAAO,iBAAO,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;IAC1C,CAAC;IAED,mBAAmB,CAAC,GAAY;QAC9B,OAAO,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC1C,CAAC;IAEM,eAAe;QACpB,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAChC,CAAC;IAEM,cAAc;QACnB,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;IACjC,CAAC;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useColdObservers.d.ts","sourceRoot":"","sources":["../../../../src/observable/cold/useColdObservers.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"useColdObservers.d.ts","sourceRoot":"","sources":["../../../../src/observable/cold/useColdObservers.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAG1C,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,WAAW,EAAE,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,CAmBnG"}
|
|
@@ -8,13 +8,30 @@ function useColdObservables(observables) {
|
|
|
8
8
|
const [mediator] = (0, react_1.useState)(() => new ColdMediatorObservable_1.ColdMediatorObservable((0, mapObservablesToValues_1.mapObservablesToValues)(observables)));
|
|
9
9
|
const [values, setValues] = (0, react_1.useState)(() => mediator.value);
|
|
10
10
|
(0, react_1.useEffect)(() => {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
11
|
+
const unsubscribers = subscribeMediatorToObservables(observables, mediator);
|
|
12
|
+
const unsubscribeFromMediator = mediator.subscribe(setValues);
|
|
13
|
+
reconcileStateWithMediatorAfterResume(setValues, mediator);
|
|
14
|
+
syncMediatorWithObservableValues(observables, mediator);
|
|
15
|
+
return () => {
|
|
16
|
+
unsubscribers.forEach((unsubscribe) => unsubscribe());
|
|
17
|
+
unsubscribeFromMediator();
|
|
18
|
+
};
|
|
17
19
|
}, []);
|
|
18
20
|
return values;
|
|
19
21
|
}
|
|
22
|
+
function subscribeMediatorToObservables(observables, mediator) {
|
|
23
|
+
return Object.keys(observables).map((key) => {
|
|
24
|
+
return observables[key].subscribe(((value) => mediator.setValue(key, value)));
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
function syncMediatorWithObservableValues(observables, mediator) {
|
|
28
|
+
Object.keys(observables).forEach((key) => {
|
|
29
|
+
mediator.setValue(key, observables[key].value);
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
function reconcileStateWithMediatorAfterResume(setValues, mediator) {
|
|
33
|
+
setValues((currentValues) => (Object.is(currentValues, mediator.value)
|
|
34
|
+
? currentValues
|
|
35
|
+
: mediator.value));
|
|
36
|
+
}
|
|
20
37
|
//# sourceMappingURL=useColdObservers.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useColdObservers.js","sourceRoot":"","sources":["../../../../src/observable/cold/useColdObservers.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"useColdObservers.js","sourceRoot":"","sources":["../../../../src/observable/cold/useColdObservers.ts"],"names":[],"mappings":";;AAUA,gDAmBC;AA7BD,iCAKe;AACf,qEAAkE;AAElE,sEAAmE;AAEnE,SAAgB,kBAAkB,CAAgC,WAAc;IAC9E,MAAM,CAAC,QAAQ,CAAC,GAAG,IAAA,gBAAQ,EACzB,GAAG,EAAE,CAAC,IAAI,+CAAsB,CAAI,IAAA,+CAAsB,EAAC,WAAW,CAAM,CAAC,CAC9E,CAAC;IACF,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,IAAA,gBAAQ,EAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,KAA0B,CAAC,CAAC;IAEhF,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,MAAM,aAAa,GAAG,8BAA8B,CAAI,WAAW,EAAE,QAAQ,CAAC,CAAC;QAC/E,MAAM,uBAAuB,GAAG,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAC9D,qCAAqC,CAAI,SAAS,EAAE,QAAQ,CAAC,CAAC;QAC9D,gCAAgC,CAAI,WAAW,EAAE,QAAQ,CAAC,CAAC;QAE3D,OAAO,GAAG,EAAE;YACV,aAAa,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;YACtD,uBAAuB,EAAE,CAAC;QAC5B,CAAC,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,8BAA8B,CACrC,WAAc,EACd,QAAmC;IAEnC,OAAO,MAAM,CAAC,IAAI,CAAC,WAAiB,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QAChD,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAoB,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IAC/F,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,gCAAgC,CACvC,WAAc,EACd,QAAmC;IAElC,MAAM,CAAC,IAAI,CAAC,WAAiB,CAAoB,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;QACjE,QAAQ,CAAC,QAAQ,CAAC,GAAG,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,qCAAqC,CAC5C,SAAsD,EACtD,QAAmC;IAEnC,SAAS,CAAC,CAAC,aAAa,EAAE,EAAE,CAAC,CAC3B,MAAM,CAAC,EAAE,CAAC,aAAa,EAAE,QAAQ,CAAC,KAA0B,CAAC;QAC3D,CAAC,CAAC,aAAa;QACf,CAAC,CAAC,QAAQ,CAAC,KAA0B,CACxC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useObserver.d.ts","sourceRoot":"","sources":["../../../src/observable/useObserver.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"useObserver.d.ts","sourceRoot":"","sources":["../../../src/observable/useObserver.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,KAAK,qBAAqB,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;AAEtE,wBAAgB,WAAW,CAAC,CAAC,EAAE,qBAAqB,EAAE,qBAAqB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,CAAC,CAiBtG"}
|
|
@@ -11,10 +11,15 @@ function useObserver(observableOrGenerator) {
|
|
|
11
11
|
observable.value = next;
|
|
12
12
|
}, [observable]);
|
|
13
13
|
(0, react_1.useEffect)(() => {
|
|
14
|
-
|
|
14
|
+
const unsubscribe = observable.subscribe(setValue);
|
|
15
|
+
reconcileStateWithObservableAfterResume(setValue, observable);
|
|
16
|
+
return unsubscribe;
|
|
15
17
|
}, [observable]);
|
|
16
18
|
return [value, onNext];
|
|
17
19
|
}
|
|
20
|
+
function reconcileStateWithObservableAfterResume(setValue, observable) {
|
|
21
|
+
setValue((currentValue) => (Object.is(currentValue, observable.value) ? currentValue : observable.value));
|
|
22
|
+
}
|
|
18
23
|
function getOrGenerateObservable(observableOrGenerator) {
|
|
19
24
|
return observableOrGenerator instanceof Observable_1.Observable ? observableOrGenerator : observableOrGenerator();
|
|
20
25
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useObserver.js","sourceRoot":"","sources":["../../../src/observable/useObserver.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"useObserver.js","sourceRoot":"","sources":["../../../src/observable/useObserver.ts"],"names":[],"mappings":";;AAYA,kCAiBC;AA7BD,sCAAsC;AACtC,iCAMe;AACf,6CAA0C;AAI1C,SAAgB,WAAW,CAAI,qBAA+C;IAC5E,MAAM,UAAU,GAAG,IAAA,eAAO,EACxB,GAAG,EAAE,CAAC,uBAAuB,CAAC,qBAAqB,CAAC,EACpD,EAAE,CACH,CAAC;IACF,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,IAAA,gBAAQ,EAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IACrD,MAAM,MAAM,GAAG,IAAA,mBAAW,EAAC,CAAC,IAAO,EAAE,EAAE;QACrC,UAAU,CAAC,KAAK,GAAG,IAAI,CAAC;IAC1B,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;IAEjB,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,MAAM,WAAW,GAAG,UAAU,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACnD,uCAAuC,CAAI,QAAQ,EAAE,UAAU,CAAC,CAAC;QACjE,OAAO,WAAW,CAAC;IACrB,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;IAEjB,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;AACzB,CAAC;AAED,SAAS,uCAAuC,CAAI,QAAuB,EAAE,UAA2B;IACtG,QAAQ,CAAC,CAAC,YAAe,EAAE,EAAE,CAAC,CAC5B,MAAM,CAAC,EAAE,CAAC,YAAY,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAC5E,CAAC,CAAC;AACL,CAAC;AAED,SAAS,uBAAuB,CAAC,qBAAiD;IAChF,OAAO,qBAAqB,YAAY,uBAAU,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,qBAAqB,EAAE,CAAC;AACvG,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useObservers.d.ts","sourceRoot":"","sources":["../../../src/observable/useObservers.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"useObservers.d.ts","sourceRoot":"","sources":["../../../src/observable/useObservers.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAGzC,wBAAgB,YAAY,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,WAAW,EAAE,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,CAc7F"}
|
|
@@ -2,22 +2,32 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.useObservers = useObservers;
|
|
4
4
|
const react_1 = require("react");
|
|
5
|
-
const MediatorObservable_1 = require("./mediator/MediatorObservable");
|
|
6
5
|
const mapObservablesToValues_1 = require("./mapObservablesToValues");
|
|
7
6
|
function useObservers(observables) {
|
|
8
7
|
const [values, setValues] = (0, react_1.useState)(() => (0, mapObservablesToValues_1.mapObservablesToValues)(observables));
|
|
9
8
|
(0, react_1.useEffect)(() => {
|
|
10
|
-
const
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
mediator.addSource(observables[key], onNext);
|
|
15
|
-
unsubscribers.push(() => {
|
|
16
|
-
observables[key].unsubscribe(onNext);
|
|
17
|
-
});
|
|
9
|
+
const unsubscribers = Object.keys(observables).map((key) => {
|
|
10
|
+
return observables[key].subscribe(((value) => {
|
|
11
|
+
updateObservedValueIfChanged(setValues, key, value);
|
|
12
|
+
}));
|
|
18
13
|
});
|
|
14
|
+
reconcileStateAfterResume(setValues, observables);
|
|
19
15
|
return () => unsubscribers.forEach(unsubscribe => unsubscribe());
|
|
20
16
|
}, []);
|
|
21
17
|
return values;
|
|
22
18
|
}
|
|
19
|
+
function updateObservedValueIfChanged(setValues, key, value) {
|
|
20
|
+
setValues((currentValues) => (Object.is(currentValues[key], value)
|
|
21
|
+
? currentValues
|
|
22
|
+
: { ...currentValues, [key]: value }));
|
|
23
|
+
}
|
|
24
|
+
function reconcileStateAfterResume(setValues, observables) {
|
|
25
|
+
setValues((currentValues) => {
|
|
26
|
+
const nextValues = (0, mapObservablesToValues_1.mapObservablesToValues)(observables);
|
|
27
|
+
return haveObservedValuesChanged(currentValues, nextValues) ? nextValues : currentValues;
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
function haveObservedValuesChanged(currentValues, nextValues) {
|
|
31
|
+
return Object.keys(nextValues).some((key) => (!Object.is(currentValues[key], nextValues[key])));
|
|
32
|
+
}
|
|
23
33
|
//# sourceMappingURL=useObservers.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useObservers.js","sourceRoot":"","sources":["../../../src/observable/useObservers.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"useObservers.js","sourceRoot":"","sources":["../../../src/observable/useObservers.ts"],"names":[],"mappings":";;AASA,oCAcC;AAvBD,iCAKe;AAEf,qEAAkE;AAElE,SAAgB,YAAY,CAAgC,WAAc;IACxE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,IAAA,gBAAQ,EAAC,GAAG,EAAE,CAAC,IAAA,+CAAsB,EAAC,WAAW,CAAC,CAAC,CAAC;IAEhF,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,WAAiB,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;YAC/D,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAoB,EAAE,EAAE;gBACxD,4BAA4B,CAAI,SAAS,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;YACzD,CAAC,CAAC,CAAC,CAAC;QACR,CAAC,CAAC,CAAC;QACH,yBAAyB,CAAI,SAAS,EAAE,WAAW,CAAC,CAAC;QACrD,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;IACnE,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,4BAA4B,CACnC,SAAsD,EACtD,GAAW,EACX,KAAgB;IAEhB,SAAS,CAAC,CAAC,aAAa,EAAE,EAAE,CAAC,CAC3B,MAAM,CAAC,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC;QAClC,CAAC,CAAC,aAAa;QACf,CAAC,CAAC,EAAE,GAAG,aAAa,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CACvC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,yBAAyB,CAChC,SAAsD,EACtD,WAAc;IAEd,SAAS,CAAC,CAAC,aAAa,EAAE,EAAE;QAC1B,MAAM,UAAU,GAAG,IAAA,+CAAsB,EAAC,WAAW,CAAC,CAAC;QACvD,OAAO,yBAAyB,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC;IAC3F,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,yBAAyB,CAChC,aAAgC,EAChC,UAA6B;IAE7B,OAAQ,MAAM,CAAC,IAAI,CAAC,UAAgB,CAAoB,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CACrE,CAAC,MAAM,CAAC,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAChD,CAAC,CAAC;AACL,CAAC"}
|
package/package.json
CHANGED
|
@@ -17,13 +17,17 @@ export class ColdMediatorObservable<T extends object> extends MediatorObservable
|
|
|
17
17
|
}
|
|
18
18
|
|
|
19
19
|
setValue(key: keyof T, value: any) {
|
|
20
|
-
if (this.
|
|
20
|
+
if (this.shouldUpdateTrackedProperty(key, value)) {
|
|
21
21
|
this.handler.suspendTracking();
|
|
22
22
|
super.value = { ...this.value, [key]: value };
|
|
23
23
|
this.handler.resumeTracking();
|
|
24
24
|
}
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
+
private shouldUpdateTrackedProperty(key: keyof T, value: any) {
|
|
28
|
+
return this.handler.hasAccessedProperty(key) && !Object.is(this.value[key], value);
|
|
29
|
+
}
|
|
30
|
+
|
|
27
31
|
override addSource<S>(source: Observable<S>, onNext: OnNext<S>) {
|
|
28
32
|
source.subscribe(onNext);
|
|
29
33
|
return this;
|
|
@@ -1,4 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
useEffect,
|
|
3
|
+
useState,
|
|
4
|
+
type Dispatch,
|
|
5
|
+
type SetStateAction,
|
|
6
|
+
} from 'react';
|
|
2
7
|
import { ColdMediatorObservable } from './ColdMediatorObservable';
|
|
3
8
|
import { ObservedValues } from '../types';
|
|
4
9
|
import { mapObservablesToValues } from '../mapObservablesToValues';
|
|
@@ -10,14 +15,46 @@ export function useColdObservables<T extends Record<string, any>>(observables: T
|
|
|
10
15
|
const [values, setValues] = useState(() => mediator.value as ObservedValues<T>);
|
|
11
16
|
|
|
12
17
|
useEffect(() => {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
});
|
|
18
|
+
const unsubscribers = subscribeMediatorToObservables<T>(observables, mediator);
|
|
19
|
+
const unsubscribeFromMediator = mediator.subscribe(setValues);
|
|
20
|
+
reconcileStateWithMediatorAfterResume<T>(setValues, mediator);
|
|
21
|
+
syncMediatorWithObservableValues<T>(observables, mediator);
|
|
18
22
|
|
|
19
|
-
return
|
|
23
|
+
return () => {
|
|
24
|
+
unsubscribers.forEach((unsubscribe) => unsubscribe());
|
|
25
|
+
unsubscribeFromMediator();
|
|
26
|
+
};
|
|
20
27
|
}, []);
|
|
21
28
|
|
|
22
29
|
return values;
|
|
23
30
|
}
|
|
31
|
+
|
|
32
|
+
function subscribeMediatorToObservables<T extends Record<string, any>>(
|
|
33
|
+
observables: T,
|
|
34
|
+
mediator: ColdMediatorObservable<T>,
|
|
35
|
+
) {
|
|
36
|
+
return Object.keys(observables as {}).map((key) => {
|
|
37
|
+
return observables[key].subscribe(((value: T[typeof key]) => mediator.setValue(key, value)));
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function syncMediatorWithObservableValues<T extends Record<string, any>>(
|
|
42
|
+
observables: T,
|
|
43
|
+
mediator: ColdMediatorObservable<T>,
|
|
44
|
+
) {
|
|
45
|
+
(Object.keys(observables as {}) as Array<keyof T>).forEach((key) => {
|
|
46
|
+
mediator.setValue(key, observables[key].value);
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function reconcileStateWithMediatorAfterResume<T extends Record<string, any>>(
|
|
51
|
+
setValues: Dispatch<SetStateAction<ObservedValues<T>>>,
|
|
52
|
+
mediator: ColdMediatorObservable<T>,
|
|
53
|
+
) {
|
|
54
|
+
setValues((currentValues) => (
|
|
55
|
+
Object.is(currentValues, mediator.value as ObservedValues<T>)
|
|
56
|
+
? currentValues
|
|
57
|
+
: mediator.value as ObservedValues<T>
|
|
58
|
+
));
|
|
59
|
+
}
|
|
60
|
+
|
|
@@ -4,6 +4,7 @@ import {
|
|
|
4
4
|
useEffect,
|
|
5
5
|
useMemo,
|
|
6
6
|
useState,
|
|
7
|
+
type Dispatch,
|
|
7
8
|
} from 'react';
|
|
8
9
|
import { Observable } from './Observable';
|
|
9
10
|
|
|
@@ -20,12 +21,20 @@ export function useObserver<T>(observableOrGenerator: ObservableOrGenerator<T>):
|
|
|
20
21
|
}, [observable]);
|
|
21
22
|
|
|
22
23
|
useEffect(() => {
|
|
23
|
-
|
|
24
|
+
const unsubscribe = observable.subscribe(setValue);
|
|
25
|
+
reconcileStateWithObservableAfterResume<T>(setValue, observable);
|
|
26
|
+
return unsubscribe;
|
|
24
27
|
}, [observable]);
|
|
25
28
|
|
|
26
29
|
return [value, onNext];
|
|
27
30
|
}
|
|
28
31
|
|
|
32
|
+
function reconcileStateWithObservableAfterResume<T>(setValue: Dispatch<any>, observable: Observable<any>) {
|
|
33
|
+
setValue((currentValue: T) => (
|
|
34
|
+
Object.is(currentValue, observable.value) ? currentValue : observable.value
|
|
35
|
+
));
|
|
36
|
+
}
|
|
37
|
+
|
|
29
38
|
function getOrGenerateObservable(observableOrGenerator: ObservableOrGenerator<any>) {
|
|
30
39
|
return observableOrGenerator instanceof Observable ? observableOrGenerator : observableOrGenerator();
|
|
31
40
|
}
|
|
@@ -1,26 +1,55 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import {
|
|
2
|
+
useEffect,
|
|
3
|
+
useState,
|
|
4
|
+
type Dispatch,
|
|
5
|
+
type SetStateAction,
|
|
6
|
+
} from 'react';
|
|
7
|
+
import { ObservedValues } from './types';
|
|
4
8
|
import { mapObservablesToValues } from './mapObservablesToValues';
|
|
5
9
|
|
|
6
10
|
export function useObservers<T extends Record<string, any>>(observables: T): ObservedValues<T> {
|
|
7
11
|
const [values, setValues] = useState(() => mapObservablesToValues(observables));
|
|
8
12
|
|
|
9
13
|
useEffect(() => {
|
|
10
|
-
const
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
const onNext = (value: any) => setValues({ ...values, [key]: value });
|
|
15
|
-
mediator.addSource(observables[key], onNext);
|
|
16
|
-
|
|
17
|
-
unsubscribers.push(() => {
|
|
18
|
-
observables[key].unsubscribe(onNext);
|
|
19
|
-
});
|
|
14
|
+
const unsubscribers = Object.keys(observables as {}).map((key) => {
|
|
15
|
+
return observables[key].subscribe(((value: T[typeof key]) => {
|
|
16
|
+
updateObservedValueIfChanged<T>(setValues, key, value);
|
|
17
|
+
}));
|
|
20
18
|
});
|
|
21
|
-
|
|
19
|
+
reconcileStateAfterResume<T>(setValues, observables);
|
|
22
20
|
return () => unsubscribers.forEach(unsubscribe => unsubscribe());
|
|
23
21
|
}, []);
|
|
24
22
|
|
|
25
23
|
return values;
|
|
26
24
|
}
|
|
25
|
+
|
|
26
|
+
function updateObservedValueIfChanged<T extends Record<string, any>>(
|
|
27
|
+
setValues: Dispatch<SetStateAction<ObservedValues<T>>>,
|
|
28
|
+
key: string,
|
|
29
|
+
value: T[string],
|
|
30
|
+
) {
|
|
31
|
+
setValues((currentValues) => (
|
|
32
|
+
Object.is(currentValues[key], value)
|
|
33
|
+
? currentValues
|
|
34
|
+
: { ...currentValues, [key]: value }
|
|
35
|
+
));
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function reconcileStateAfterResume<T extends Record<string, any>>(
|
|
39
|
+
setValues: Dispatch<SetStateAction<ObservedValues<T>>>,
|
|
40
|
+
observables: T,
|
|
41
|
+
) {
|
|
42
|
+
setValues((currentValues) => {
|
|
43
|
+
const nextValues = mapObservablesToValues(observables);
|
|
44
|
+
return haveObservedValuesChanged(currentValues, nextValues) ? nextValues : currentValues;
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function haveObservedValuesChanged<T extends Record<string, any>>(
|
|
49
|
+
currentValues: ObservedValues<T>,
|
|
50
|
+
nextValues: ObservedValues<T>,
|
|
51
|
+
) {
|
|
52
|
+
return (Object.keys(nextValues as {}) as Array<keyof T>).some((key) => (
|
|
53
|
+
!Object.is(currentValues[key], nextValues[key])
|
|
54
|
+
));
|
|
55
|
+
}
|