@live-change/wysiwyg-frontend 0.1.4 → 0.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/front/src/DocumentEditor.vue +50 -9
- package/front/src/NavBar.vue +1 -1
- package/package.json +21 -28
- package/server/init.js +1 -0
- package/server/services.config.js +2 -1
|
@@ -59,12 +59,11 @@
|
|
|
59
59
|
content: props.initialContent,
|
|
60
60
|
version: 0
|
|
61
61
|
}
|
|
62
|
-
|
|
63
|
-
await api.command(['prosemirror', 'createDocument'], documentData)
|
|
62
|
+
documentData = await api.command(['prosemirror', 'createDocumentIfNotExists'], documentData)
|
|
64
63
|
}
|
|
65
64
|
|
|
66
65
|
const extensions = getExtensions(props.config)
|
|
67
|
-
console.log("CONFIG", props.config, 'EXTENSIONS', extensions)
|
|
66
|
+
//console.log("CONFIG", props.config, 'EXTENSIONS', extensions)
|
|
68
67
|
const editor = useEditor({
|
|
69
68
|
content: documentData.content,
|
|
70
69
|
extensions: [
|
|
@@ -80,22 +79,64 @@
|
|
|
80
79
|
}
|
|
81
80
|
})
|
|
82
81
|
|
|
83
|
-
|
|
82
|
+
let sentSteps = []
|
|
83
|
+
let sentVersion = 0
|
|
84
|
+
|
|
85
|
+
const sleep = (ms) => new Promise(resolve => setTimeout(resolve, ms))
|
|
86
|
+
|
|
87
|
+
async function save() {
|
|
84
88
|
const state = editor.value.reactiveState.value
|
|
85
89
|
const sendable = sendableSteps(state)
|
|
86
90
|
if(sendable) {
|
|
91
|
+
let version = sendable.version
|
|
92
|
+
let firstOriginalStepIndex = 0
|
|
93
|
+
let resynchronization = false
|
|
87
94
|
console.log("SENDABLE STEPS", sendable)
|
|
88
|
-
const serializedSteps = sendable.steps.map(step => step.toJSON())
|
|
95
|
+
const serializedSteps = sendable.steps.map((step, index) => ({ version: version + index, step: step.toJSON() }))
|
|
89
96
|
console.log("SERIALIZED STEPS", serializedSteps)
|
|
90
|
-
|
|
97
|
+
if(sendable.version <= sentVersion) { // found resend, check for duplicated steps
|
|
98
|
+
for(let i = 0; i < serializedSteps.length; i++) {
|
|
99
|
+
const step = serializedSteps[i]
|
|
100
|
+
const sentStep = sentSteps.find(({ version }) => version == step.version)
|
|
101
|
+
if(sentStep) {
|
|
102
|
+
console.log('FOUND SENT STEP WITH THE SAME VERSION', sentStep, '==', step)
|
|
103
|
+
if(JSON.stringify(sentStep) != JSON.stringify(step)) {
|
|
104
|
+
resynchronization = true
|
|
105
|
+
break
|
|
106
|
+
}
|
|
107
|
+
firstOriginalStepIndex = i + 1
|
|
108
|
+
} else break
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
serializedSteps.splice(0, firstOriginalStepIndex)
|
|
112
|
+
if(resynchronization && sentSteps.length > 0) {
|
|
113
|
+
console.log("RESYNCHRONIZATION!")
|
|
114
|
+
const firstVersion = serializedSteps[0].version
|
|
115
|
+
sentSteps = sentSteps.filter(({ version }) => version < firstVersion)
|
|
116
|
+
}
|
|
117
|
+
if(serializedSteps.length == 0) {
|
|
118
|
+
console.log("NOTHING TO SEND")
|
|
119
|
+
return
|
|
120
|
+
}
|
|
121
|
+
sentVersion = serializedSteps[0].version
|
|
122
|
+
sentSteps = sentSteps.concat(serializedSteps)
|
|
123
|
+
if(sentSteps.length > 200) sentSteps = sentSteps.slice(-100)
|
|
124
|
+
const data = {
|
|
91
125
|
document, type: props.type,
|
|
92
|
-
version:
|
|
93
|
-
|
|
126
|
+
version: sentVersion, steps: serializedSteps.map(({ step }) => step), window: api.windowId,
|
|
127
|
+
continuation: firstOriginalStepIndex > 0
|
|
128
|
+
}
|
|
129
|
+
console.log("SEND DATA", data)
|
|
130
|
+
//await sleep(1000)
|
|
131
|
+
await api.command(['prosemirror', 'doSteps'], data)
|
|
94
132
|
}
|
|
95
133
|
}
|
|
96
|
-
|
|
97
134
|
const saveDebounced = useDebounceFn(save, 100)
|
|
98
135
|
|
|
136
|
+
api.source.on('connect', () => {
|
|
137
|
+
save()
|
|
138
|
+
})
|
|
139
|
+
|
|
99
140
|
if(typeof window != 'undefined') {
|
|
100
141
|
const stepsReader = inboxReader(
|
|
101
142
|
(rawPosition, bucketSize) => {
|
package/front/src/NavBar.vue
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@live-change/wysiwyg-frontend",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.6",
|
|
4
4
|
"scripts": {
|
|
5
5
|
"memDev": "lcli memDev --enableSessions --initScript ./init.js --dbAccess",
|
|
6
6
|
"localDevInit": "rm tmp.db; lcli localDev --enableSessions --initScript ./init.js",
|
|
@@ -21,17 +21,17 @@
|
|
|
21
21
|
},
|
|
22
22
|
"dependencies": {
|
|
23
23
|
"@fortawesome/fontawesome-free": "^6.1.1",
|
|
24
|
-
"@live-change/cli": "0.6.
|
|
25
|
-
"@live-change/dao": "0.5.
|
|
26
|
-
"@live-change/dao-vue3": "0.4
|
|
27
|
-
"@live-change/dao-websocket": "0.4
|
|
28
|
-
"@live-change/framework": "0.6.
|
|
29
|
-
"@live-change/password-authentication-service": "0.2.
|
|
30
|
-
"@live-change/prosemirror-service": "0.2.
|
|
31
|
-
"@live-change/secret-code-service": "0.2.
|
|
32
|
-
"@live-change/secret-link-service": "0.2.
|
|
33
|
-
"@live-change/session-service": "0.2.
|
|
34
|
-
"@live-change/vue3-components": "0.2.
|
|
24
|
+
"@live-change/cli": "0.6.12",
|
|
25
|
+
"@live-change/dao": "0.5.4",
|
|
26
|
+
"@live-change/dao-vue3": "0.5.4",
|
|
27
|
+
"@live-change/dao-websocket": "0.5.4",
|
|
28
|
+
"@live-change/framework": "0.6.12",
|
|
29
|
+
"@live-change/password-authentication-service": "0.2.49",
|
|
30
|
+
"@live-change/prosemirror-service": "0.2.49",
|
|
31
|
+
"@live-change/secret-code-service": "0.2.49",
|
|
32
|
+
"@live-change/secret-link-service": "0.2.49",
|
|
33
|
+
"@live-change/session-service": "0.2.49",
|
|
34
|
+
"@live-change/vue3-components": "0.2.14",
|
|
35
35
|
"@live-change/vue3-ssr": "0.2.14",
|
|
36
36
|
"@tiptap/extension-blockquote": "^2.0.0-beta.29",
|
|
37
37
|
"@tiptap/extension-bold": "^2.0.0-beta.28",
|
|
@@ -54,10 +54,7 @@
|
|
|
54
54
|
"@tiptap/extension-text": "^2.0.0-beta.17",
|
|
55
55
|
"@tiptap/extension-underline": "2.0.0-beta.23",
|
|
56
56
|
"@tiptap/vue-3": "2.0.0-beta.91",
|
|
57
|
-
"@
|
|
58
|
-
"@vitejs/plugin-vue-jsx": "^1.3.10",
|
|
59
|
-
"@vue/compiler-sfc": "^3.2.33",
|
|
60
|
-
"@vueuse/core": "^8.3.1",
|
|
57
|
+
"@vueuse/core": "^9.1.0",
|
|
61
58
|
"codeceptjs-assert": "^0.0.5",
|
|
62
59
|
"compression": "^1.7.4",
|
|
63
60
|
"cross-env": "^7.0.3",
|
|
@@ -71,26 +68,22 @@
|
|
|
71
68
|
"serialize-javascript": "^6.0.0",
|
|
72
69
|
"serve-static": "^1.15.0",
|
|
73
70
|
"v-shared-element": "3.1.0",
|
|
74
|
-
"vite": "^2.9.6",
|
|
75
|
-
"vite-plugin-compression": "0.5.1",
|
|
76
|
-
"vite-plugin-vue-images": "^0.6.1",
|
|
77
|
-
"vue": "^3.2.33",
|
|
78
71
|
"vue-meta": "^3.0.0-alpha.9",
|
|
79
|
-
"vue-router": "^4.
|
|
72
|
+
"vue-router": "^4.1.3",
|
|
80
73
|
"vue3-scroll-border": "0.1.2"
|
|
81
74
|
},
|
|
82
75
|
"devDependencies": {
|
|
83
|
-
"@live-change/codeceptjs-helper": "0.6.
|
|
84
|
-
"@wdio/selenium-standalone-service": "^7.
|
|
85
|
-
"codeceptjs": "^3.3.
|
|
76
|
+
"@live-change/codeceptjs-helper": "0.6.12",
|
|
77
|
+
"@wdio/selenium-standalone-service": "^7.20.8",
|
|
78
|
+
"codeceptjs": "^3.3.4",
|
|
86
79
|
"generate-password": "1.7.0",
|
|
87
|
-
"playwright": "^1.
|
|
80
|
+
"playwright": "^1.24.2",
|
|
88
81
|
"random-profile-generator": "^2.3.0",
|
|
89
|
-
"txtgen": "^3.0.
|
|
90
|
-
"webdriverio": "^7.
|
|
82
|
+
"txtgen": "^3.0.2",
|
|
83
|
+
"webdriverio": "^7.20.9"
|
|
91
84
|
},
|
|
92
85
|
"author": "",
|
|
93
86
|
"license": "ISC",
|
|
94
87
|
"description": "",
|
|
95
|
-
"gitHead": "
|
|
88
|
+
"gitHead": "4a0231098fcfea3c1e32aa29e8f232e43981ee7f"
|
|
96
89
|
}
|
package/server/init.js
CHANGED