json-joy
Version:
Collection of libraries for building collaborative editing apps.
45 lines • 1.53 kB
JavaScript
import { ValueSyncStore } from '../../../util/events/sync-store';
export class CursorState {
ctx;
/** Current score. */
score = new ValueSyncStore(0);
/** By how much the score changed. */
scoreDelta = new ValueSyncStore(0);
/** The last score that was shown to the user. */
lastVisScore = new ValueSyncStore(0);
constructor(ctx) {
this.ctx = ctx;
}
/** -------------------------------------------------- {@link UiLifeCycles} */
start() {
const dom = this.ctx.dom;
let lastNow = 0;
const onChange = (event) => {
const now = Date.now();
const timeDiff = now - lastNow;
let delta = 0;
switch (event.detail.ev?.type) {
case 'delete':
case 'insert':
case 'format':
case 'marker': {
delta = timeDiff < 30 ? 10 : timeDiff < 70 ? 5 : timeDiff < 150 ? 2 : timeDiff <= 1000 ? 1 : -1;
break;
}
default: {
delta = timeDiff <= 1000 ? 0 : -1;
break;
}
}
if (delta)
this.score.next(delta >= 0 ? this.score.value + delta : 0);
this.scoreDelta.next(delta);
lastNow = now;
};
dom.et.addEventListener('change', onChange);
return () => {
dom.et.removeEventListener('change', onChange);
};
}
}
//# sourceMappingURL=state.js.map