UNPKG

json-joy

Version:

Collection of libraries for building collaborative editing apps.

89 lines 3.15 kB
import { BehaviorSubject } from 'rxjs'; import { SavedFormatting } from '../../state/formattings'; import { Slice } from '../../../../../json-crdt-extensions/peritext/slice/Slice'; import { subject } from '../../../../util/rx'; import { toSchema } from '../../../../../json-crdt/schema/toSchema'; import { JsonCrdtDiff } from '../../../../../json-crdt-diff/JsonCrdtDiff'; import { Model } from '../../../../../json-crdt/model'; export class FormattingManageState { state; inline; selected$ = new BehaviorSubject(null); view$ = new BehaviorSubject('view'); editing$ = new BehaviorSubject(undefined); constructor(state, inline) { this.state = state; this.inline = inline; } getFormattings$(inline = this.inline) { const state = this.state; return subject(state.surface.render$, () => { const slices = inline?.p1.layers; const res = []; if (!slices) return res; const registry = state.txt.editor.getRegistry(); for (const slice of slices) { const tag = slice.type(); if (typeof tag !== 'number' && typeof tag !== 'string') continue; const behavior = registry.get(tag); if (!behavior) continue; const isConfigurable = !!behavior.schema; if (!isConfigurable) continue; if (!(slice instanceof Slice)) continue; res.push(new SavedFormatting(behavior, slice, state)); } return res; }); } select = (formatting) => { this.selected$.next(formatting); }; switchToViewPanel = () => { this.view$.next('view'); this.editing$.next(void 0); }; switchToEditPanel = () => { const selected = this.selected$.getValue(); if (!selected) return; this.view$.next('edit'); const formatting = new SavedShadowFormatting(selected); this.editing$.next(formatting); }; returnFromEditPanelAndSave = () => { const shadowFormatting = this.editing$.getValue(); if (!shadowFormatting) return; const view = shadowFormatting.conf().view(); const formatting = shadowFormatting.saved; const data = formatting.conf(); if (!data) return; const model = data.api.model; const patch = new JsonCrdtDiff(model).diff(data.node, view); if (patch.ops.length) model.applyPatch(patch); this.switchToViewPanel(); this.state.surface.rerender(); }; } export class SavedShadowFormatting extends SavedFormatting { saved; _model; constructor(saved) { super(saved.behavior, saved.range, saved.state); this.saved = saved; const nodeApi = saved.conf(); const schema = nodeApi ? toSchema(nodeApi.node) : void 0; this._model = Model.create(schema); } conf() { return this._model.api.obj([]); } } //# sourceMappingURL=state.js.map