gristlabs_grist-core/app/client/lib/fromKoSave.ts
Paul Fitzpatrick 1654a2681f (core) move client code to core
Summary:
This moves all client code to core, and makes minimal fix-ups to
get grist and grist-core to compile correctly.  The client works
in core, but I'm leaving clean-up around the build and bundles to
follow-up.

Test Plan: existing tests pass; server-dev bundle looks sane

Reviewers: dsagal

Reviewed By: dsagal

Differential Revision: https://phab.getgrist.com/D2627
2020-10-02 13:24:21 -04:00

33 lines
1.2 KiB
TypeScript

/**
* Replicates some of grainjs's fromKo, except that the returned observables have a set() method
* which calls koObs.saveOnly(val) rather than koObs(val).
*/
import {IKnockoutObservable, KoWrapObs, Observable} from 'grainjs';
const wrappers: WeakMap<IKnockoutObservable<any>, Observable<any>> = new WeakMap();
/**
* Returns a Grain.js observable which mirrors a Knockout observable.
*
* Do not dispose this wrapper, as it is shared by all code using koObs, and its lifetime is tied
* to the lifetime of koObs. If unused, it consumes minimal resources, and should get garbage
* collected along with koObs.
*/
export function fromKoSave<T>(koObs: IKnockoutObservable<T>): Observable<T> {
return wrappers.get(koObs) || wrappers.set(koObs, new KoSaveWrapObs(koObs)).get(koObs)!;
}
export class KoSaveWrapObs<T> extends KoWrapObs<T> {
constructor(_koObs: IKnockoutObservable<T>) {
if (!('saveOnly' in _koObs)) {
throw new Error('fromKoSave needs a saveable observable');
}
super(_koObs);
}
public set(value: T): void {
// Hacky cast to get a private member. TODO: should make it protected instead.
(this as any)._koObs.saveOnly(value);
}
}