UNPKG

delta-component

Version:

embeddable react component

113 lines (98 loc) 4.22 kB
'use strict'; const BaseClientDocument = require('./logic/baseClientDocument').BaseClientDocument; const HistoricalDocument = require('./logic/history/history').HistoricalDocument; class Document extends BaseClientDocument { /** * UI работает с этим классом. * * Это прокси к другим классам, в которых выполняется бизнес-логика. * * Испускает события: * * * permanentlyNotOperable - с этим объектом нельзя никгда больше работать * * lock - временно нельзя работать с объектом * * unlock - можно работать с объектом * * textChanged - изменился текст * * localSelectionChanged - изменилось выделение текста * * participantsChanged - участники изменили свое состояние * * Чтобы подписаться - нужно использовать * document.on('lock', (...args) => { * ... * }) * * @param documentString * @param treedoc * @param transport * @param currentPerson */ constructor(documentString, treedoc, transport, currentPerson) { super(documentString, treedoc, transport, currentPerson); } /** методы которые можно вызывать интерфейсу **/ insert(text) { /** * Вставить строку текста справа от текущей позиции курсора, сдвинуть курсор направо. * * Приводит к событию cursorsChanged, чтобы UI перерисовал чужие курсоры. * */ this.throwWhenLocked(); this.getSelection().toNullWidth(); // на деле этот вызов необязателен this._textState.makeDirty(); this.treedocClient.insert(text); } backspace(){ /** * Удалить howMany символов влево от текущей позиции курсора. * * Приводит к событию cursorsChanged, чтобы UI перерисовал чужие курсоры. */ this.throwWhenLocked(); const selectionWidth = this.getSelection().getWidth(); const howMany = selectionWidth > 0 ? selectionWidth : 1; this.getSelection().toNullWidth(); this._textState.makeDirty(); for(let i = 0; i < howMany; i++) this.treedocClient.backspace(); } delete() { this.throwWhenLocked(); try { this._delete(); } catch (e) { this.usageStats.send(`Unhandled exc ${e.stack}`); throw e; } } replace(deleteBeforeCursorCount, text = '') { /** * Заменить howMany символов влево строкой text и переместить курсор. * * Приводит к событию cursorsChanged, чтобы UI перерисовал чужие курсоры. * * Если нужно удалить несколько символов - используйте ее, передав string = ''. */ this.throwWhenLocked(); this._textState.makeDirty(); this.treedocClient.replace(deleteBeforeCursorCount, text); } close() { /** * Уведомить все остальные браузеры, что больше не будешь редактировать документ. */ // TODO: продумать что делать если больше одного окна ввода подписано на документ this.removeAllListeners(); this.transport.leaveDocument(this.documentString); } getHistory() { return new HistoricalDocument( this.documentString, this.treedoc, this.transport, this.viewersMap.currentUser ) } } module.exports = { Document, };