UNPKG

json-joy

Version:

Collection of libraries for building collaborative editing apps.

45 lines (44 loc) 1.5 kB
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); }; } }