@syncedstore/yjs-reactive-bindings
Version:
A bridge between Reactive programming libraries (reactive, Vue or MobX) and Yjs
41 lines (34 loc) • 854 B
text/typescript
import { Atom, createAtom } from "../observableProvider";
import * as Y from "yjs";
const textsObserved = new WeakSet<Y.Text>();
export function observeText(value: Y.Text) {
if (textsObserved.has(value)) {
// already patched
return value;
}
textsObserved.add(value);
let atom: Atom | undefined;
const handler = (_changes: Y.YTextEvent) => {
atom!.reportChanged();
};
atom = createAtom(
"text",
() => {
value.observe(handler);
},
() => {
value.unobserve(handler);
}
);
function patch(method: string) {
const originalFunction = value[method];
value[method] = function () {
atom!.reportObserved(this._implicitObserver);
const ret = Reflect.apply(originalFunction, this, arguments);
return ret;
};
}
patch("toString");
patch("toJSON");
return value;
}