Skip to content

Commit

Permalink
Merge pull request #49 from streamich/update
Browse files Browse the repository at this point in the history
Update dependencies
  • Loading branch information
streamich authored Jul 17, 2024
2 parents b9fe220 + 89b7924 commit ef2cf15
Show file tree
Hide file tree
Showing 5 changed files with 124 additions and 77 deletions.
5 changes: 2 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,7 @@
"crdt"
],
"dependencies": {
"collaborative-editor": "^1.0.1",
"fast-diff": "^1.3.0"
"collaborative-editor": "^2.2.0"
},
"peerDependencies": {
"json-joy": "*",
Expand All @@ -70,7 +69,7 @@
"eslint-plugin-react": "^7.33.2",
"eslint-plugin-storybook": "^0.6.15",
"jest": "^29.7.0",
"json-joy": "^11.9.0",
"json-joy": "^16.13.1",
"prettier": "^3.1.0",
"react": "^18.2.0",
"react-dom": "^18.2.0",
Expand Down
83 changes: 43 additions & 40 deletions src/InputEditor.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import type {SimpleChange, EditorFacade, Selection} from 'collaborative-editor';
import type {StrApi} from 'json-joy/es2020/json-crdt';
import type {StrApi} from 'json-joy/lib/json-crdt';

export class InputEditor implements EditorFacade {
public selection!: Selection;
public onchange?: (change: SimpleChange | void) => void;
public onchange?: (change: SimpleChange[] | void, verify?: boolean) => void;
public onselection?: () => void;

constructor(
Expand Down Expand Up @@ -44,74 +44,77 @@ export class InputEditor implements EditorFacade {
input.selectionDirection = direction === -1 ? 'backward' : direction === 1 ? 'forward' : 'none';
}

protected createChange(event: InputEvent): SimpleChange | undefined {
// console.log(event);
const {input} = this;
const {data, inputType, isComposing} = event;
if (isComposing) return;
switch (inputType) {
protected emitChange(event: InputEvent): void {
if (event.isComposing) return;
switch (event.inputType) {
case 'insertText': {
const data = event.data;
if (!data || data.length !== 1) break;
const {selectionStart, selectionEnd} = this.input;
if (selectionStart === null || selectionEnd === null) break;
if (selectionStart !== selectionEnd) break;
if (selectionStart <= 0) break;
const selection = this.selection;
if (selectionStart - data.length !== selection.start) break;
if (typeof selection.end !== 'number' || typeof selection.end !== 'number') break;
const remove = selection.end - selection.start;
const change: SimpleChange = [selection.start, remove, data];
this.onchange!([change]);
return;
}
case 'deleteContentBackward': {
const {selection} = this;
const {start, end} = selection;
if (typeof start !== 'number' || typeof end !== 'number') return;
if (start === end) return [start - 1, 1, ''];
return [start, end - start, ''];
const {start, end} = this.selection;
if (typeof start !== 'number' || typeof end !== 'number') break;
const change: SimpleChange = start === end ? [start - 1, 1, ''] : [start, end - start, ''];
this.onchange!([change]);
return;
}
case 'deleteContentForward': {
const {selection} = this;
const {start, end} = selection;
if (typeof start !== 'number' || typeof end !== 'number') return;
if (start === end) return [start, 1, ''];
return [start, end - start, ''];
const {start, end} = this.selection;
if (typeof start !== 'number' || typeof end !== 'number') break;
const change: SimpleChange = start === end ? [start, 1, ''] : [start, end - start, ''];
this.onchange!([change]);
return;
}
case 'deleteByCut': {
const {start, end} = this.selection;
if (typeof start !== 'number' || typeof end !== 'number') return;
if (start === end) return;
if (typeof start !== 'number' || typeof end !== 'number') break;
if (start === end) break;
const min = Math.min(start, end);
const max = Math.max(start, end);
const str = this.str;
const view = str.view();
const input = this.input;
const value = input.value;
if (view.length - value.length !== max - min) return;
return [min, max - min, ''];
if (view.length - value.length !== max - min) break;
const change: SimpleChange = [min, max - min, ''];
this.onchange!([change]);
return;
}
case 'insertFromPaste': {
const {start, end} = this.selection;
if (typeof start !== 'number' || typeof end !== 'number') return;
if (typeof start !== 'number' || typeof end !== 'number') break;
const min = Math.min(start, end);
const max = Math.max(start, end);
const str = this.str;
const view = str.view();
const input = this.input;
const value = input.value;
const newMax = Math.max(input.selectionStart ?? 0, input.selectionEnd ?? 0);
if (newMax <= min) return;
if (newMax <= min) break;
const remove = max - min;
const insert = value.slice(min, newMax);
if (value.length !== view.length - remove + insert.length) return;
return [min, remove, insert];
}
case 'insertText': {
if (!data || data.length !== 1) return;
const {selectionStart, selectionEnd} = input;
if (selectionStart === null || selectionEnd === null) return;
if (selectionStart !== selectionEnd) return;
if (selectionStart <= 0) return;
const selection = this.selection;
if (selectionStart - data.length !== selection.start) return;
if (typeof selection.end !== 'number' || typeof selection.end !== 'number') return;
const remove = selection.end - selection.start;
return [selection.start, remove, data];
const change: SimpleChange = [min, remove, insert];
this.onchange!([change]);
return;
}
}
return;
this.onchange!();
}

private readonly onInput = (event: Event) => {
const change = this.createChange(event as InputEvent);
this.onchange!(change);
this.emitChange(event as InputEvent);
};

private readonly onSelectionChange = () => {
Expand Down
2 changes: 1 addition & 1 deletion src/index.stories.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import * as React from 'react';
import {Model} from 'json-joy/es2020/json-crdt';
import {Model} from 'json-joy/lib/json-crdt';
import {bind} from '.';
import type {Meta, StoryObj} from '@storybook/react';

Expand Down
2 changes: 1 addition & 1 deletion src/index.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import {StrBinding} from 'collaborative-editor';
import {InputEditor} from './InputEditor';
import type {StrApi} from 'json-joy/es2020/json-crdt';
import type {StrApi} from 'json-joy/lib/json-crdt';

export const bind = (str: StrApi, input: HTMLInputElement | HTMLTextAreaElement, polling?: boolean): (() => void) => {
const editor = new InputEditor(str, input);
Expand Down
109 changes: 77 additions & 32 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -2160,6 +2160,38 @@ __metadata:
languageName: node
linkType: hard

"@jsonjoy.com/base64@npm:^1.1.1":
version: 1.1.2
resolution: "@jsonjoy.com/base64@npm:1.1.2"
peerDependencies:
tslib: 2
checksum: 10c0/88717945f66dc89bf58ce75624c99fe6a5c9a0c8614e26d03e406447b28abff80c69fb37dabe5aafef1862cf315071ae66e5c85f6018b437d95f8d13d235e6eb
languageName: node
linkType: hard

"@jsonjoy.com/json-pack@npm:^1.0.2":
version: 1.0.4
resolution: "@jsonjoy.com/json-pack@npm:1.0.4"
dependencies:
"@jsonjoy.com/base64": "npm:^1.1.1"
"@jsonjoy.com/util": "npm:^1.1.2"
hyperdyperid: "npm:^1.2.0"
thingies: "npm:^1.20.0"
peerDependencies:
tslib: 2
checksum: 10c0/c06e57c33d3c18ab31af163e04f77cb759f68386c41375d1e1bd6c28beb1a3cc82217cc3b26f4c94b7385ed28a61e59b01498cf4cec562fd9e464b17eab0cf16
languageName: node
linkType: hard

"@jsonjoy.com/util@npm:^1.1.0, @jsonjoy.com/util@npm:^1.1.2":
version: 1.2.0
resolution: "@jsonjoy.com/util@npm:1.2.0"
peerDependencies:
tslib: 2
checksum: 10c0/979b85076871ed1ce6961dfe7be725c8c413f50d09755e6e88184ba9b3682b59da20672b979eae74d3701fcfb094d5bba781dc7f53ffd45747f65026e699685e
languageName: node
linkType: hard

"@juggle/resize-observer@npm:^3.3.1":
version: 3.4.0
resolution: "@juggle/resize-observer@npm:3.4.0"
Expand All @@ -2179,13 +2211,6 @@ __metadata:
languageName: node
linkType: hard

"@multiformats/base-x@npm:^4.0.1":
version: 4.0.1
resolution: "@multiformats/base-x@npm:4.0.1"
checksum: 10c0/f6d16d2d7793ea371206fc17853a0932a7e697ddc739a6b63421a7ee090ee8ab28224c3c7e4401899d0a343bc95284a5f0aa7502edadfb5ad21967f9cbd6a9d2
languageName: node
linkType: hard

"@ndelangen/get-tarball@npm:^3.0.7":
version: 3.0.9
resolution: "@ndelangen/get-tarball@npm:3.0.9"
Expand Down Expand Up @@ -5915,15 +5940,15 @@ __metadata:
languageName: node
linkType: hard

"collaborative-editor@npm:^1.0.1":
version: 1.0.1
resolution: "collaborative-editor@npm:1.0.1"
"collaborative-editor@npm:^2.2.0":
version: 2.2.0
resolution: "collaborative-editor@npm:2.2.0"
dependencies:
fast-diff: "npm:^1.3.0"
peerDependencies:
json-joy: "*"
tslib: 2
checksum: 10c0/d51d11cc636a5ea06fb75f06c57f0f2ee9aa32411bff23371d0fe5512b3c7744dd48eaf6e1411f1ec5b997c7b0250c614fa7e06e6321a2cbb8fe3f69adcbdca1
checksum: 10c0/afadd52680918feca4c8281cf1b4b06e54f29abc13264dda46509be396ed0818b3ef08b252bd72da1c30e3b925f4782ade0edb4240b499efed72e4f14cb3631d
languageName: node
linkType: hard

Expand All @@ -5946,13 +5971,12 @@ __metadata:
"@types/react": "npm:^18.2.39"
"@typescript-eslint/eslint-plugin": "npm:^6.13.1"
"@typescript-eslint/parser": "npm:^6.13.1"
collaborative-editor: "npm:^1.0.1"
collaborative-editor: "npm:^2.2.0"
eslint: "npm:^8.54.0"
eslint-plugin-react: "npm:^7.33.2"
eslint-plugin-storybook: "npm:^0.6.15"
fast-diff: "npm:^1.3.0"
jest: "npm:^29.7.0"
json-joy: "npm:^11.9.0"
json-joy: "npm:^16.13.1"
prettier: "npm:^3.1.0"
react: "npm:^18.2.0"
react-dom: "npm:^18.2.0"
Expand Down Expand Up @@ -9534,21 +9558,22 @@ __metadata:
languageName: node
linkType: hard

"json-joy@npm:^11.9.0":
version: 11.43.0
resolution: "json-joy@npm:11.43.0"
"json-joy@npm:^16.13.1":
version: 16.13.1
resolution: "json-joy@npm:16.13.1"
dependencies:
"@jsonjoy.com/base64": "npm:^1.1.1"
"@jsonjoy.com/json-pack": "npm:^1.0.2"
"@jsonjoy.com/util": "npm:^1.1.0"
arg: "npm:^5.0.2"
hyperdyperid: "npm:^1.2.0"
multibase: "npm:^4.0.6"
thingies: "npm:^1.20.0"
sonic-forest: "npm:^1.0.2"
thingies: "npm:^2.0.0"
tree-dump: "npm:^1.0.1"
peerDependencies:
quill-delta: ^5
rxjs: 7
tslib: 2
peerDependenciesMeta:
quill-delta:
optional: true
rxjs:
optional: true
bin:
Expand All @@ -9560,7 +9585,7 @@ __metadata:
json-pointer: bin/json-pointer.js
json-pointer-test: bin/json-pointer-test.js
json-unpack: bin/json-unpack.js
checksum: 10c0/23a0005b8d929823e1c162e5adcb489b281498c16b80f939f4a53485bea0ed07a751f93d3c66d174bec31e13fb0cc26f4935a02a9421d53104f0d74d3789c9d7
checksum: 10c0/82dc502f288940dfbb97bebd1568b31f3f5e7cb9345f87d1a631113b49e902671198b1c1bfd7e8518fb8b0114a2a89f573b46fb1a2b829535c597e716f23fa36
languageName: node
linkType: hard

Expand Down Expand Up @@ -10239,15 +10264,6 @@ __metadata:
languageName: node
linkType: hard

"multibase@npm:^4.0.6":
version: 4.0.6
resolution: "multibase@npm:4.0.6"
dependencies:
"@multiformats/base-x": "npm:^4.0.1"
checksum: 10c0/1e931f2d018a195f7ea1d157782a6ab2eb3913674b79a9193e05ee2ded58383a373124ec9d84d20b12a2561a34659d2fe5a7e49e4ba493af5127b0009fdaf33d
languageName: node
linkType: hard

"nanoid@npm:^3.3.7":
version: 3.3.7
resolution: "nanoid@npm:3.3.7"
Expand Down Expand Up @@ -12096,6 +12112,17 @@ __metadata:
languageName: node
linkType: hard

"sonic-forest@npm:^1.0.2":
version: 1.0.3
resolution: "sonic-forest@npm:1.0.3"
dependencies:
tree-dump: "npm:^1.0.0"
peerDependencies:
tslib: 2
checksum: 10c0/b37d18b1195127ab07f499ec177548f01b671a7aeae6488d7da17288848c60e4a586cd7b010970699bf578d5bd502499cbf593e5be6d0bdfa3283e9b307b2ff2
languageName: node
linkType: hard

"source-map-js@npm:^1.2.0":
version: 1.2.0
resolution: "source-map-js@npm:1.2.0"
Expand Down Expand Up @@ -12637,6 +12664,15 @@ __metadata:
languageName: node
linkType: hard

"thingies@npm:^2.0.0":
version: 2.1.1
resolution: "thingies@npm:2.1.1"
peerDependencies:
tslib: ^2
checksum: 10c0/573a84a11248619b6f53d5226b90b3489b01cfc7f5fa6d37a79e91c3678e247ba981cf21760879ab8c5af58b0a225fa0b773387034c38e6e12061bb1ca1e33a6
languageName: node
linkType: hard

"through2@npm:^2.0.3":
version: 2.0.5
resolution: "through2@npm:2.0.5"
Expand Down Expand Up @@ -12698,6 +12734,15 @@ __metadata:
languageName: node
linkType: hard

"tree-dump@npm:^1.0.0, tree-dump@npm:^1.0.1":
version: 1.0.2
resolution: "tree-dump@npm:1.0.2"
peerDependencies:
tslib: 2
checksum: 10c0/d1d180764e9c691b28332dbd74226c6b6af361dfb1e134bb11e60e17cb11c215894adee50ffc578da5dcf546006693947be8b6665eb1269b56e2f534926f1c1f
languageName: node
linkType: hard

"ts-api-utils@npm:^1.0.1":
version: 1.3.0
resolution: "ts-api-utils@npm:1.3.0"
Expand Down

0 comments on commit ef2cf15

Please sign in to comment.