From 0f98915909627771d2236d22837b404b436bac60 Mon Sep 17 00:00:00 2001 From: cudr Date: Sun, 3 Nov 2019 11:32:52 +0300 Subject: [PATCH 1/2] feat: strart refactoring types --- packages/bridge/src/apply/index.ts | 2 +- packages/bridge/src/convert/convert.spec.ts | 8 ++++---- packages/bridge/src/convert/insert.ts | 6 +++--- packages/bridge/src/cursor/index.ts | 2 +- packages/bridge/src/model/automerge.ts | 4 +++- packages/bridge/src/utils/testUtils.ts | 6 +++--- packages/bridge/src/utils/toSync.ts | 2 +- 7 files changed, 16 insertions(+), 14 deletions(-) diff --git a/packages/bridge/src/apply/index.ts b/packages/bridge/src/apply/index.ts index b4ea794..a99b026 100644 --- a/packages/bridge/src/apply/index.ts +++ b/packages/bridge/src/apply/index.ts @@ -8,7 +8,7 @@ import annotation from './annotation' const setSelection = doc => doc const setValue = doc => doc -const opType: any = { +const opType = { ...text, ...annotation, ...node, diff --git a/packages/bridge/src/convert/convert.spec.ts b/packages/bridge/src/convert/convert.spec.ts index 5960dd0..3408323 100644 --- a/packages/bridge/src/convert/convert.spec.ts +++ b/packages/bridge/src/convert/convert.spec.ts @@ -1,13 +1,13 @@ import * as Automerge from 'automerge' import { toSlateOp } from './index' -import { createDoc, cloneDoc, createBlockJSON, toJS } from '../utils' +import { createDoc, cloneDoc, createBlockJSON } from '../utils' describe('convert operations to slatejs model', () => { it('convert insert operations', () => { const doc1 = createDoc() const doc2 = cloneDoc(doc1) - const change = Automerge.change(doc1, 'change', (d: any) => { + const change = Automerge.change(doc1, 'change', d => { d.document.nodes.push(createBlockJSON('paragraph', 'hello!')) d.document.nodes[1].nodes[0].text = 'hello!' }) @@ -33,7 +33,7 @@ describe('convert operations to slatejs model', () => { }) it('convert remove operations', () => { - const doc1 = Automerge.change(createDoc(), 'change', (d: any) => { + const doc1 = Automerge.change(createDoc(), 'change', d => { d.document.nodes.push(createBlockJSON('paragraph', 'hello!')) d.document.nodes.push(createBlockJSON('paragraph', 'hello twice!')) d.document.nodes[1].nodes[0].text = 'hello!' @@ -41,7 +41,7 @@ describe('convert operations to slatejs model', () => { const doc2 = cloneDoc(doc1) - const change = Automerge.change(doc1, 'change', (d: any) => { + const change = Automerge.change(doc1, 'change', d => { delete d.document.nodes[1] delete d.document.nodes[0].nodes[0] }) diff --git a/packages/bridge/src/convert/insert.ts b/packages/bridge/src/convert/insert.ts index 2f923d8..5b5a8a7 100644 --- a/packages/bridge/src/convert/insert.ts +++ b/packages/bridge/src/convert/insert.ts @@ -12,7 +12,7 @@ const insertTextOp = ({ index, path, value }: Automerge.Diff) => () => ({ const insertNodeOp = ({ value, obj, index, path }: Automerge.Diff) => map => { const ops = [] - const inserate = ({ nodes, ...json }: any, path) => { + const iterate = ({ nodes, ...json }, path) => { const node = nodes ? { ...json, nodes: [] } : json if (node.object) { @@ -31,12 +31,12 @@ const insertNodeOp = ({ value, obj, index, path }: Automerge.Diff) => map => { } } - nodes && nodes.forEach((n, i) => inserate(n, [...path, i])) + nodes && nodes.forEach((n, i) => iterate(n, [...path, i])) } const source = map[value] || (map[obj] && toJS(map[obj])) - source && inserate(source, [...toSlatePath(path), index]) + source && iterate(source, [...toSlatePath(path), index]) return ops } diff --git a/packages/bridge/src/cursor/index.ts b/packages/bridge/src/cursor/index.ts index 878902d..9f048a9 100644 --- a/packages/bridge/src/cursor/index.ts +++ b/packages/bridge/src/cursor/index.ts @@ -51,7 +51,7 @@ export const removeCursor = (doc: SyncDoc, key: CursorKey) => { return doc } -export const cursorOpFilter = (ops: any, type: string): any => +export const cursorOpFilter = (ops, type: string) => ops.filter(op => { if (op.type === 'set_annotation') { return !( diff --git a/packages/bridge/src/model/automerge.ts b/packages/bridge/src/model/automerge.ts index 82f306a..219a4f0 100644 --- a/packages/bridge/src/model/automerge.ts +++ b/packages/bridge/src/model/automerge.ts @@ -1,3 +1,5 @@ +import { ValueJSON } from 'slate' + export type CursorKey = string -export type SyncDoc = any +export interface SyncDoc extends ValueJSON {} diff --git a/packages/bridge/src/utils/testUtils.ts b/packages/bridge/src/utils/testUtils.ts index ec522e1..3ae84d7 100644 --- a/packages/bridge/src/utils/testUtils.ts +++ b/packages/bridge/src/utils/testUtils.ts @@ -1,5 +1,5 @@ import * as Automerge from 'automerge' -import { ValueJSON, TextJSON, NodeJSON } from 'slate' +import { TextJSON } from 'slate' export const createTextJSON = (text: string = ''): TextJSON => ({ object: 'text', @@ -10,13 +10,13 @@ export const createTextJSON = (text: string = ''): TextJSON => ({ export const createBlockJSON = ( type: string = 'paragraph', text: string = '' -): NodeJSON => ({ +) => ({ object: 'block', type, nodes: [createTextJSON(text)] }) -export const createValueJSON = (): ValueJSON => ({ +export const createValueJSON = () => ({ document: { nodes: [createBlockJSON()] } diff --git a/packages/bridge/src/utils/toSync.ts b/packages/bridge/src/utils/toSync.ts index 9686604..a0f51f8 100644 --- a/packages/bridge/src/utils/toSync.ts +++ b/packages/bridge/src/utils/toSync.ts @@ -1,6 +1,6 @@ import * as Automerge from 'automerge' -const toSync = (node: any): any => { +const toSync = node => { if (!node) { return } From ad0aaf260755d0fcc0943df8291e28e72ada6e9a Mon Sep 17 00:00:00 2001 From: cudr Date: Sun, 10 Nov 2019 21:16:53 +0300 Subject: [PATCH 2/2] feat: handle annotations --- packages/bridge/src/apply/annotation.ts | 52 +++++++++++++++++++++---- packages/bridge/src/cursor/index.ts | 3 +- packages/example/src/Client.tsx | 4 +- 3 files changed, 46 insertions(+), 13 deletions(-) diff --git a/packages/bridge/src/apply/annotation.ts b/packages/bridge/src/apply/annotation.ts index b31b595..359d0ca 100644 --- a/packages/bridge/src/apply/annotation.ts +++ b/packages/bridge/src/apply/annotation.ts @@ -1,19 +1,55 @@ -import { Operation, SyncDoc } from '../model/index' +import { SyncDoc } from '../model/index' +import { toSync } from '../utils' +import { + AddAnnotationOperation, + RemoveAnnotationOperation, + SetAnnotationOperation +} from 'slate' -// TODO: handle annotation ops +export const addAnnotation = ( + doc: SyncDoc, + op: AddAnnotationOperation +): SyncDoc => { + if (!doc.annotations) { + doc['annotations'] = {} + } + + const annotation = op.annotation.toJSON() + + doc.annotations[annotation.key] = toSync(annotation) -export const addAnnotation = (doc: SyncDoc, op: Operation): SyncDoc => { - // console.log('addAnnotation!!!', op.toJS()) return doc } -export const removeAnnotation = (doc: SyncDoc, op: Operation): SyncDoc => { - // console.log('removeAnnotation!!!', op.toJS()) +export const removeAnnotation = ( + doc: SyncDoc, + op: RemoveAnnotationOperation +): SyncDoc => { + if (doc.annotations) { + delete doc.annotations[op.annotation.key] + } + return doc } -export const setAnnotation = (doc: SyncDoc, op: Operation): SyncDoc => { - // console.log('setAnnotation!!!', op.toJS()) +export const setAnnotation = ( + doc: SyncDoc, + op: SetAnnotationOperation +): SyncDoc => { + /** + * Looks like set_annotation option is broken, temporary disabled + */ + + // const { newProperties }: any = op.toJSON() + + // if (!doc.annotations || !newProperties) return doc + + // if (!doc.annotations[newProperties.key]) { + // return addAnnotation(doc, newProperties) + // } else { + // doc.annotations[newProperties.key] = { ...doc.annotations[newProperties.key], ...newProperties } + // } + return doc } diff --git a/packages/bridge/src/cursor/index.ts b/packages/bridge/src/cursor/index.ts index 9f048a9..fd191f6 100644 --- a/packages/bridge/src/cursor/index.ts +++ b/packages/bridge/src/cursor/index.ts @@ -1,5 +1,4 @@ -import { Operation, Selection } from 'slate' -import * as Immutable from 'immutable' +import { Selection } from 'slate' import merge from 'lodash/merge' import { toJS } from '../utils' diff --git a/packages/example/src/Client.tsx b/packages/example/src/Client.tsx index 6474476..4530d42 100644 --- a/packages/example/src/Client.tsx +++ b/packages/example/src/Client.tsx @@ -93,9 +93,7 @@ class Client extends Component { ) } - onChange = ({ value }: any) => { - this.setState({ value }) - } + onChange = ({ value }: any) => this.setState({ value }) onConnect = () => this.setState({ isOnline: true })