@rgby/collab-core 1.0.1
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/README.md +60 -0
- package/dist/collab-provider.d.ts +561 -0
- package/dist/collab-provider.d.ts.map +1 -0
- package/dist/collab-provider.js +1389 -0
- package/dist/collab-provider.js.map +1 -0
- package/dist/extensions/collaboration-cursor.d.ts +87 -0
- package/dist/extensions/collaboration-cursor.d.ts.map +1 -0
- package/dist/extensions/collaboration-cursor.js +82 -0
- package/dist/extensions/collaboration-cursor.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/services/sw-manager.d.ts +62 -0
- package/dist/services/sw-manager.d.ts.map +1 -0
- package/dist/services/sw-manager.js +207 -0
- package/dist/services/sw-manager.js.map +1 -0
- package/dist/test-deps.d.ts +15 -0
- package/dist/test-deps.d.ts.map +1 -0
- package/dist/test-deps.js +21 -0
- package/dist/test-deps.js.map +1 -0
- package/dist/upload-queue.d.ts +82 -0
- package/dist/upload-queue.d.ts.map +1 -0
- package/dist/upload-queue.js +273 -0
- package/dist/upload-queue.js.map +1 -0
- package/dist/useCollab.d.ts +216 -0
- package/dist/useCollab.d.ts.map +1 -0
- package/dist/useCollab.js +583 -0
- package/dist/useCollab.js.map +1 -0
- package/package.json +93 -0
- package/src/collab-provider.ts +1871 -0
- package/src/extensions/collaboration-cursor.ts +188 -0
- package/src/index.ts +6 -0
- package/src/services/sw-manager.ts +255 -0
- package/src/test-deps.ts +34 -0
- package/src/upload-queue.ts +337 -0
|
@@ -0,0 +1,583 @@
|
|
|
1
|
+
// @ts-nocheck
|
|
2
|
+
import { inject, provide, ref, reactive, computed, onMounted, onBeforeUnmount, shallowRef, watch, markRaw, nextTick } from 'vue';
|
|
3
|
+
import * as Y from 'yjs';
|
|
4
|
+
import { CollabClient, CollabProvider } from "./collab-provider.js";
|
|
5
|
+
// ----------------------------------------------------------------------
|
|
6
|
+
// 1. Setup & Context
|
|
7
|
+
// ----------------------------------------------------------------------
|
|
8
|
+
export const CollabClientKey = Symbol.for('CollabClient');
|
|
9
|
+
export function provideCollabClient(optionsOrInstance) {
|
|
10
|
+
const client = optionsOrInstance instanceof CollabClient
|
|
11
|
+
? optionsOrInstance
|
|
12
|
+
: new CollabClient(optionsOrInstance);
|
|
13
|
+
provide(CollabClientKey, client);
|
|
14
|
+
return client;
|
|
15
|
+
}
|
|
16
|
+
export function useCollabClient() {
|
|
17
|
+
const client = inject(CollabClientKey);
|
|
18
|
+
if (!client)
|
|
19
|
+
throw new Error('CollabClient not provided. Call provideCollabClient() at the root.');
|
|
20
|
+
return client;
|
|
21
|
+
}
|
|
22
|
+
export function useDocument(spaceId, documentId) {
|
|
23
|
+
const client = useCollabClient();
|
|
24
|
+
// Y.Doc should not be deeply reactive in Vue, so we use shallowRef + markRaw
|
|
25
|
+
const doc = shallowRef(markRaw(new Y.Doc()));
|
|
26
|
+
const provider = shallowRef(null);
|
|
27
|
+
const undoManager = shallowRef(null);
|
|
28
|
+
const status = ref('disconnected');
|
|
29
|
+
const synced = ref(false);
|
|
30
|
+
const persistenceReady = ref(false);
|
|
31
|
+
// Track scope for UndoManager to allow filtering (e.g., only undo text, not layout)
|
|
32
|
+
const trackedTypes = new Set();
|
|
33
|
+
const connect = async () => {
|
|
34
|
+
if (provider.value)
|
|
35
|
+
return;
|
|
36
|
+
const p = await client.getProvider(spaceId, documentId, {
|
|
37
|
+
document: doc.value
|
|
38
|
+
});
|
|
39
|
+
// Wait for persistence to load before syncing
|
|
40
|
+
await p.waitForPersistence();
|
|
41
|
+
persistenceReady.value = p.isPersistenceReady();
|
|
42
|
+
// Event Listeners
|
|
43
|
+
const updateStatus = () => { status.value = p.status; };
|
|
44
|
+
const updateSynced = () => { synced.value = p.synced; };
|
|
45
|
+
p.on('status', updateStatus);
|
|
46
|
+
p.on('synced', updateSynced);
|
|
47
|
+
p.on('disconnect', updateStatus);
|
|
48
|
+
provider.value = markRaw(p);
|
|
49
|
+
// Initialize UndoManager
|
|
50
|
+
// We defer this slightly to allow composables to register their types if needed
|
|
51
|
+
nextTick(() => {
|
|
52
|
+
undoManager.value = new Y.UndoManager(trackedTypes.size > 0 ? Array.from(trackedTypes) : doc.value.share.values(), {
|
|
53
|
+
doc: doc.value,
|
|
54
|
+
captureTransaction: (tr) => tr.origin !== undoManager.value
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
};
|
|
58
|
+
const disconnect = () => {
|
|
59
|
+
provider.value?.destroy();
|
|
60
|
+
provider.value = null;
|
|
61
|
+
undoManager.value?.destroy();
|
|
62
|
+
undoManager.value = null;
|
|
63
|
+
status.value = 'disconnected';
|
|
64
|
+
synced.value = false;
|
|
65
|
+
};
|
|
66
|
+
onMounted(connect);
|
|
67
|
+
onBeforeUnmount(() => {
|
|
68
|
+
disconnect();
|
|
69
|
+
doc.value.destroy();
|
|
70
|
+
});
|
|
71
|
+
const transact = (callback) => {
|
|
72
|
+
doc.value.transact(callback, client);
|
|
73
|
+
};
|
|
74
|
+
const undo = () => undoManager.value?.undo();
|
|
75
|
+
const redo = () => undoManager.value?.redo();
|
|
76
|
+
const clearLocalData = async () => {
|
|
77
|
+
if (provider.value) {
|
|
78
|
+
await provider.value.clearLocalData();
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
return {
|
|
82
|
+
doc,
|
|
83
|
+
provider,
|
|
84
|
+
status,
|
|
85
|
+
synced,
|
|
86
|
+
persistenceReady,
|
|
87
|
+
undoManager,
|
|
88
|
+
connect,
|
|
89
|
+
disconnect,
|
|
90
|
+
transact,
|
|
91
|
+
undo,
|
|
92
|
+
redo,
|
|
93
|
+
clearLocalData
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
// ----------------------------------------------------------------------
|
|
97
|
+
// 3. Factory: useSyncedMap
|
|
98
|
+
// Reactive wrapper for Y.Map
|
|
99
|
+
// ----------------------------------------------------------------------
|
|
100
|
+
export function useSyncedMap(doc, mapName) {
|
|
101
|
+
// We use reactive so properties are directly accessible in templates
|
|
102
|
+
const state = reactive({});
|
|
103
|
+
let _ymap = null;
|
|
104
|
+
const init = (newDoc) => {
|
|
105
|
+
if (_ymap)
|
|
106
|
+
_ymap.unobserve(observer);
|
|
107
|
+
_ymap = newDoc.getMap(mapName);
|
|
108
|
+
// Initial Hydration: clear old keys, set new ones
|
|
109
|
+
for (const key in state)
|
|
110
|
+
delete state[key];
|
|
111
|
+
_ymap.forEach((value, key) => {
|
|
112
|
+
state[key] = value;
|
|
113
|
+
});
|
|
114
|
+
_ymap.observe(observer);
|
|
115
|
+
};
|
|
116
|
+
const observer = (event) => {
|
|
117
|
+
event.keysChanged.forEach(key => {
|
|
118
|
+
if (_ymap.has(key)) {
|
|
119
|
+
state[key] = _ymap.get(key);
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
delete state[key];
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
};
|
|
126
|
+
watch(doc, (newDoc) => { if (newDoc)
|
|
127
|
+
init(newDoc); }, { immediate: true });
|
|
128
|
+
onBeforeUnmount(() => {
|
|
129
|
+
if (_ymap)
|
|
130
|
+
_ymap.unobserve(observer);
|
|
131
|
+
});
|
|
132
|
+
// Mutators
|
|
133
|
+
const set = (key, value) => _ymap?.set(key, value);
|
|
134
|
+
const remove = (key) => _ymap?.delete(key);
|
|
135
|
+
const clear = () => _ymap?.clear();
|
|
136
|
+
const get = (key) => _ymap?.get(key);
|
|
137
|
+
return {
|
|
138
|
+
data: state,
|
|
139
|
+
set,
|
|
140
|
+
remove,
|
|
141
|
+
clear,
|
|
142
|
+
get,
|
|
143
|
+
yMap: computed(() => _ymap)
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
// ----------------------------------------------------------------------
|
|
147
|
+
// 4. Factory: useSyncedArray
|
|
148
|
+
// Reactive wrapper for Y.Array using Deltas for fine-grained DOM updates
|
|
149
|
+
// ----------------------------------------------------------------------
|
|
150
|
+
export function useSyncedArray(doc, arrayName) {
|
|
151
|
+
const list = ref([]);
|
|
152
|
+
let _yarray = null;
|
|
153
|
+
const init = (newDoc) => {
|
|
154
|
+
if (_yarray)
|
|
155
|
+
_yarray.unobserve(observer);
|
|
156
|
+
_yarray = newDoc.getArray(arrayName);
|
|
157
|
+
// Initial full copy
|
|
158
|
+
list.value = _yarray.toArray();
|
|
159
|
+
_yarray.observe(observer);
|
|
160
|
+
};
|
|
161
|
+
const observer = (event) => {
|
|
162
|
+
let index = 0;
|
|
163
|
+
event.delta.forEach((op) => {
|
|
164
|
+
if (op.retain) {
|
|
165
|
+
index += op.retain;
|
|
166
|
+
}
|
|
167
|
+
else if (op.insert) {
|
|
168
|
+
const items = op.insert;
|
|
169
|
+
list.value.splice(index, 0, ...items);
|
|
170
|
+
index += items.length;
|
|
171
|
+
}
|
|
172
|
+
else if (op.delete) {
|
|
173
|
+
list.value.splice(index, op.delete);
|
|
174
|
+
}
|
|
175
|
+
});
|
|
176
|
+
};
|
|
177
|
+
watch(doc, (newDoc) => { if (newDoc)
|
|
178
|
+
init(newDoc); }, { immediate: true });
|
|
179
|
+
onBeforeUnmount(() => {
|
|
180
|
+
if (_yarray)
|
|
181
|
+
_yarray.unobserve(observer);
|
|
182
|
+
});
|
|
183
|
+
// Mutators
|
|
184
|
+
const push = (item) => _yarray?.push([item]);
|
|
185
|
+
const unshift = (item) => _yarray?.insert(0, [item]);
|
|
186
|
+
const insert = (index, items) => _yarray?.insert(index, items);
|
|
187
|
+
const deleteAt = (index, length = 1) => _yarray?.delete(index, length);
|
|
188
|
+
/**
|
|
189
|
+
* Replaces an item at index. Useful for updating object properties in an array
|
|
190
|
+
* since Y.Array doesn't track deep object property changes automatically.
|
|
191
|
+
*/
|
|
192
|
+
const replace = (index, item) => {
|
|
193
|
+
if (!_yarray)
|
|
194
|
+
return;
|
|
195
|
+
doc.value.transact(() => {
|
|
196
|
+
_yarray.delete(index, 1);
|
|
197
|
+
_yarray.insert(index, [item]);
|
|
198
|
+
});
|
|
199
|
+
};
|
|
200
|
+
return {
|
|
201
|
+
list,
|
|
202
|
+
push,
|
|
203
|
+
unshift,
|
|
204
|
+
insert,
|
|
205
|
+
deleteAt,
|
|
206
|
+
replace,
|
|
207
|
+
yArray: computed(() => _yarray)
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
// ----------------------------------------------------------------------
|
|
211
|
+
// 5. Factory: useSyncedText
|
|
212
|
+
// Reactive wrapper for Y.Text
|
|
213
|
+
// ----------------------------------------------------------------------
|
|
214
|
+
export function useSyncedText(doc, textName) {
|
|
215
|
+
const text = ref('');
|
|
216
|
+
let _ytext = null;
|
|
217
|
+
const init = (newDoc) => {
|
|
218
|
+
if (_ytext)
|
|
219
|
+
_ytext.unobserve(observer);
|
|
220
|
+
_ytext = newDoc.getText(textName);
|
|
221
|
+
text.value = _ytext.toString();
|
|
222
|
+
_ytext.observe(observer);
|
|
223
|
+
};
|
|
224
|
+
const observer = (event) => {
|
|
225
|
+
// For strings, we usually just want the current value.
|
|
226
|
+
// Applying strict deltas to a Javascript string is O(N) anyway.
|
|
227
|
+
text.value = _ytext.toString();
|
|
228
|
+
};
|
|
229
|
+
watch(doc, (newDoc) => { if (newDoc)
|
|
230
|
+
init(newDoc); }, { immediate: true });
|
|
231
|
+
onBeforeUnmount(() => {
|
|
232
|
+
if (_ytext)
|
|
233
|
+
_ytext.unobserve(observer);
|
|
234
|
+
});
|
|
235
|
+
const insert = (index, content, attributes) => _ytext?.insert(index, content, attributes);
|
|
236
|
+
const deleteText = (index, length) => _ytext?.delete(index, length);
|
|
237
|
+
const format = (index, length, attributes) => _ytext?.format(index, length, attributes);
|
|
238
|
+
return {
|
|
239
|
+
text, // Read-only reactive string
|
|
240
|
+
insert,
|
|
241
|
+
delete: deleteText,
|
|
242
|
+
format,
|
|
243
|
+
yText: computed(() => _ytext)
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
// ----------------------------------------------------------------------
|
|
247
|
+
// 6. Factory: useSyncedXml
|
|
248
|
+
// Exposes Y.XmlFragment (for Tiptap/ProseMirror/Quill)
|
|
249
|
+
// ----------------------------------------------------------------------
|
|
250
|
+
export function useSyncedXml(doc, xmlName) {
|
|
251
|
+
const _yxml = shallowRef(null);
|
|
252
|
+
watch(doc, (newDoc) => {
|
|
253
|
+
if (newDoc) {
|
|
254
|
+
_yxml.value = newDoc.getXmlFragment(xmlName);
|
|
255
|
+
}
|
|
256
|
+
}, { immediate: true });
|
|
257
|
+
return {
|
|
258
|
+
yXml: _yxml // Pass this to Tiptap's Collaboration extension
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
export function useAwareness(provider) {
|
|
262
|
+
const states = ref([]);
|
|
263
|
+
const currentUser = ref(null);
|
|
264
|
+
const update = () => {
|
|
265
|
+
if (!provider.value)
|
|
266
|
+
return;
|
|
267
|
+
const awareness = provider.value.awareness;
|
|
268
|
+
states.value = Array.from(awareness.getStates().entries()).map(([id, state]) => ({
|
|
269
|
+
clientId: id,
|
|
270
|
+
...state
|
|
271
|
+
}));
|
|
272
|
+
const local = awareness.getLocalState();
|
|
273
|
+
if (local) {
|
|
274
|
+
currentUser.value = { clientId: awareness.clientID, ...local };
|
|
275
|
+
}
|
|
276
|
+
};
|
|
277
|
+
watch(provider, (p, oldP) => {
|
|
278
|
+
if (oldP)
|
|
279
|
+
oldP.awareness.off('change', update);
|
|
280
|
+
if (p) {
|
|
281
|
+
p.awareness.on('change', update);
|
|
282
|
+
update(); // Initial fetch
|
|
283
|
+
}
|
|
284
|
+
}, { immediate: true });
|
|
285
|
+
const setLocalState = (state) => {
|
|
286
|
+
if (!provider.value)
|
|
287
|
+
return;
|
|
288
|
+
const current = provider.value.awareness.getLocalState() || {};
|
|
289
|
+
provider.value.awareness.setLocalState({ ...current, ...state });
|
|
290
|
+
};
|
|
291
|
+
return {
|
|
292
|
+
states,
|
|
293
|
+
currentUser,
|
|
294
|
+
setLocalState
|
|
295
|
+
};
|
|
296
|
+
}
|
|
297
|
+
// ----------------------------------------------------------------------
|
|
298
|
+
// 8. Utility: useLiveComments
|
|
299
|
+
// Hybrid REST + Websocket comments
|
|
300
|
+
// ----------------------------------------------------------------------
|
|
301
|
+
export function useLiveComments(provider, spaceId, documentId) {
|
|
302
|
+
const client = useCollabClient();
|
|
303
|
+
const threads = ref([]); // Replace `any` with your CommentThread interface
|
|
304
|
+
const loading = ref(false);
|
|
305
|
+
const fetchComments = async () => {
|
|
306
|
+
loading.value = true;
|
|
307
|
+
try {
|
|
308
|
+
const res = await client.comments.list(spaceId, documentId);
|
|
309
|
+
threads.value = res.threads;
|
|
310
|
+
}
|
|
311
|
+
catch (e) {
|
|
312
|
+
console.error(e);
|
|
313
|
+
}
|
|
314
|
+
finally {
|
|
315
|
+
loading.value = false;
|
|
316
|
+
}
|
|
317
|
+
};
|
|
318
|
+
watch(provider, (p) => {
|
|
319
|
+
if (!p)
|
|
320
|
+
return;
|
|
321
|
+
// Watch for broadcasted events
|
|
322
|
+
const cleanup = p.onComment((event) => {
|
|
323
|
+
// Simple strategy: refetch on any change from others
|
|
324
|
+
// (You can implement optimistic updates here for 'create' events)
|
|
325
|
+
if (['create', 'update', 'delete', 'resolve'].includes(event.action)) {
|
|
326
|
+
fetchComments();
|
|
327
|
+
}
|
|
328
|
+
});
|
|
329
|
+
fetchComments();
|
|
330
|
+
return () => cleanup();
|
|
331
|
+
}, { immediate: true });
|
|
332
|
+
const createComment = async (content, anchor, parentId) => {
|
|
333
|
+
const comment = await client.comments.create(spaceId, documentId, { content, anchor, parentId });
|
|
334
|
+
provider.value?.sendComment('create', comment);
|
|
335
|
+
// Optimistic local update
|
|
336
|
+
if (parentId) {
|
|
337
|
+
const thread = threads.value.find(t => t.id === parentId);
|
|
338
|
+
if (thread)
|
|
339
|
+
thread.replies.push(comment);
|
|
340
|
+
}
|
|
341
|
+
else {
|
|
342
|
+
threads.value.push({ ...comment, replies: [] });
|
|
343
|
+
}
|
|
344
|
+
};
|
|
345
|
+
return { threads, loading, createComment, refresh: fetchComments };
|
|
346
|
+
}
|
|
347
|
+
export function useAuth(providedClient) {
|
|
348
|
+
const client = providedClient || useCollabClient();
|
|
349
|
+
const session = ref(null);
|
|
350
|
+
// Access private authManager
|
|
351
|
+
const authManager = client.authManager;
|
|
352
|
+
if (!authManager) {
|
|
353
|
+
throw new Error('useAuth() requires CollabClient to be initialized with managed auth mode');
|
|
354
|
+
}
|
|
355
|
+
// Get initial session immediately
|
|
356
|
+
session.value = authManager.getSession();
|
|
357
|
+
// Subscribe to auth changes
|
|
358
|
+
const unsubscribe = authManager.subscribe((newSession) => {
|
|
359
|
+
session.value = newSession;
|
|
360
|
+
});
|
|
361
|
+
onBeforeUnmount(() => {
|
|
362
|
+
unsubscribe();
|
|
363
|
+
});
|
|
364
|
+
return {
|
|
365
|
+
session: computed(() => session.value),
|
|
366
|
+
user: computed(() => session.value?.user ?? null),
|
|
367
|
+
isAuthenticated: computed(() => session.value !== null),
|
|
368
|
+
login: (email, password) => client.login(email, password),
|
|
369
|
+
signup: (email, password, name) => client.signup(email, password, name),
|
|
370
|
+
logout: () => client.logout()
|
|
371
|
+
};
|
|
372
|
+
}
|
|
373
|
+
export function useTiptapEditor(options) {
|
|
374
|
+
const client = useCollabClient();
|
|
375
|
+
// Normalize refs
|
|
376
|
+
const spaceId = computed(() => {
|
|
377
|
+
const val = options.spaceId;
|
|
378
|
+
return typeof val === 'string' ? val : val.value;
|
|
379
|
+
});
|
|
380
|
+
const documentId = computed(() => {
|
|
381
|
+
const val = options.documentId;
|
|
382
|
+
return typeof val === 'string' ? val : val.value;
|
|
383
|
+
});
|
|
384
|
+
const editor = shallowRef(null);
|
|
385
|
+
const doc = shallowRef(markRaw(new Y.Doc()));
|
|
386
|
+
const provider = shallowRef(null);
|
|
387
|
+
const status = ref('disconnected');
|
|
388
|
+
const synced = ref(false);
|
|
389
|
+
const persistenceReady = ref(false);
|
|
390
|
+
const loading = ref(false);
|
|
391
|
+
const error = ref('');
|
|
392
|
+
// Generate unique tab ID for multi-tab awareness
|
|
393
|
+
const generateTabId = () => {
|
|
394
|
+
return `tab-${Math.random().toString(36).substring(2, 9)}-${Date.now()}`;
|
|
395
|
+
};
|
|
396
|
+
// Random color for cursor
|
|
397
|
+
const generateColor = () => {
|
|
398
|
+
const colors = [
|
|
399
|
+
'#958DF1', '#F98181', '#FBBC88', '#FAF594', '#70CFF8',
|
|
400
|
+
'#94FADB', '#B9F18D', '#C3E2C2', '#EAECCC', '#AFC8AD'
|
|
401
|
+
];
|
|
402
|
+
return colors[Math.floor(Math.random() * colors.length)];
|
|
403
|
+
};
|
|
404
|
+
const connect = async () => {
|
|
405
|
+
if (provider.value)
|
|
406
|
+
return;
|
|
407
|
+
loading.value = true;
|
|
408
|
+
error.value = '';
|
|
409
|
+
try {
|
|
410
|
+
// Dynamically import TipTap extensions first (needed for server extensions)
|
|
411
|
+
const [tiptapCore, { Collaboration }, { CollaborationCursor }] = await Promise.all([
|
|
412
|
+
import('@tiptap/core'),
|
|
413
|
+
import('@tiptap/extension-collaboration'),
|
|
414
|
+
import('./extensions/collaboration-cursor.js')
|
|
415
|
+
]);
|
|
416
|
+
const { Editor: TiptapEditor } = tiptapCore;
|
|
417
|
+
// Fetch server extensions, providing @tiptap/core for scripts that import it
|
|
418
|
+
const serverExtensions = await client.getExtensions({
|
|
419
|
+
'@tiptap/core': tiptapCore
|
|
420
|
+
});
|
|
421
|
+
// Get provider
|
|
422
|
+
const p = await client.getProvider(spaceId.value, documentId.value, {
|
|
423
|
+
document: doc.value
|
|
424
|
+
});
|
|
425
|
+
// Wait for persistence to load
|
|
426
|
+
await p.waitForPersistence();
|
|
427
|
+
persistenceReady.value = p.isPersistenceReady();
|
|
428
|
+
// Event listeners
|
|
429
|
+
const updateStatus = () => { status.value = p.status; };
|
|
430
|
+
const updateSynced = () => { synced.value = p.synced; };
|
|
431
|
+
p.on('status', updateStatus);
|
|
432
|
+
p.on('synced', updateSynced);
|
|
433
|
+
p.on('disconnect', updateStatus);
|
|
434
|
+
provider.value = markRaw(p);
|
|
435
|
+
// StarterKit is optional - consumer can provide their own extensions
|
|
436
|
+
let StarterKit = null;
|
|
437
|
+
try {
|
|
438
|
+
StarterKit = (await import('@tiptap/starter-kit')).default;
|
|
439
|
+
}
|
|
440
|
+
catch {
|
|
441
|
+
// StarterKit not installed - user should provide extensions via options
|
|
442
|
+
}
|
|
443
|
+
const fragment = doc.value.getXmlFragment('default');
|
|
444
|
+
const tabId = generateTabId();
|
|
445
|
+
const userName = options.user?.name ?? 'Anonymous';
|
|
446
|
+
const userColor = options.user?.color ?? generateColor();
|
|
447
|
+
// Create editor
|
|
448
|
+
const baseExtensions = StarterKit
|
|
449
|
+
? [StarterKit.configure({ undoRedo: false })]
|
|
450
|
+
: [];
|
|
451
|
+
const editorInstance = new TiptapEditor({
|
|
452
|
+
extensions: [
|
|
453
|
+
...baseExtensions,
|
|
454
|
+
Collaboration.configure({
|
|
455
|
+
document: doc.value,
|
|
456
|
+
field: 'default'
|
|
457
|
+
}),
|
|
458
|
+
CollaborationCursor.configure({
|
|
459
|
+
provider: provider.value,
|
|
460
|
+
user: {
|
|
461
|
+
name: userName,
|
|
462
|
+
color: userColor,
|
|
463
|
+
clientId: tabId
|
|
464
|
+
}
|
|
465
|
+
}),
|
|
466
|
+
...serverExtensions,
|
|
467
|
+
...(options.extensions ?? [])
|
|
468
|
+
],
|
|
469
|
+
...options.editorOptions
|
|
470
|
+
});
|
|
471
|
+
editor.value = markRaw(editorInstance);
|
|
472
|
+
loading.value = false;
|
|
473
|
+
if (options.onReady) {
|
|
474
|
+
options.onReady(editorInstance);
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
catch (e) {
|
|
478
|
+
error.value = e.message || 'Failed to initialize editor';
|
|
479
|
+
loading.value = false;
|
|
480
|
+
console.error('[useTiptapEditor] Error:', e);
|
|
481
|
+
}
|
|
482
|
+
};
|
|
483
|
+
const disconnect = () => {
|
|
484
|
+
provider.value?.destroy();
|
|
485
|
+
provider.value = null;
|
|
486
|
+
status.value = 'disconnected';
|
|
487
|
+
synced.value = false;
|
|
488
|
+
};
|
|
489
|
+
const destroy = () => {
|
|
490
|
+
editor.value?.destroy();
|
|
491
|
+
editor.value = null;
|
|
492
|
+
disconnect();
|
|
493
|
+
doc.value.destroy();
|
|
494
|
+
doc.value = markRaw(new Y.Doc());
|
|
495
|
+
};
|
|
496
|
+
const clearLocalData = async () => {
|
|
497
|
+
if (provider.value) {
|
|
498
|
+
await provider.value.clearLocalData();
|
|
499
|
+
}
|
|
500
|
+
};
|
|
501
|
+
// Watch for changes to spaceId/documentId and reconnect
|
|
502
|
+
watch([spaceId, documentId], async ([newSpaceId, newDocId], [oldSpaceId, oldDocId]) => {
|
|
503
|
+
if (!newSpaceId || !newDocId) {
|
|
504
|
+
destroy();
|
|
505
|
+
return;
|
|
506
|
+
}
|
|
507
|
+
// If changed, reconnect
|
|
508
|
+
if (newSpaceId !== oldSpaceId || newDocId !== oldDocId) {
|
|
509
|
+
destroy();
|
|
510
|
+
await connect();
|
|
511
|
+
}
|
|
512
|
+
});
|
|
513
|
+
// Auto-connect if enabled
|
|
514
|
+
if (options.autoConnect !== false) {
|
|
515
|
+
onMounted(async () => {
|
|
516
|
+
if (spaceId.value && documentId.value) {
|
|
517
|
+
await connect();
|
|
518
|
+
}
|
|
519
|
+
});
|
|
520
|
+
}
|
|
521
|
+
onBeforeUnmount(() => {
|
|
522
|
+
destroy();
|
|
523
|
+
});
|
|
524
|
+
return {
|
|
525
|
+
editor,
|
|
526
|
+
doc,
|
|
527
|
+
provider,
|
|
528
|
+
status,
|
|
529
|
+
synced,
|
|
530
|
+
persistenceReady,
|
|
531
|
+
loading,
|
|
532
|
+
error,
|
|
533
|
+
connect,
|
|
534
|
+
disconnect,
|
|
535
|
+
destroy,
|
|
536
|
+
clearLocalData
|
|
537
|
+
};
|
|
538
|
+
}
|
|
539
|
+
// ----------------------------------------------------------------------
|
|
540
|
+
// 11. Master Composable: useCollaborativeDocument
|
|
541
|
+
// ----------------------------------------------------------------------
|
|
542
|
+
export function useCollaborativeDocument(spaceId, documentId) {
|
|
543
|
+
// 1. Initialize Connection
|
|
544
|
+
const { doc, provider, status, synced, undoManager, connect, disconnect, transact, undo, redo } = useDocument(spaceId, documentId);
|
|
545
|
+
// 2. Initialize Utils
|
|
546
|
+
const awareness = useAwareness(provider);
|
|
547
|
+
const comments = useLiveComments(provider, spaceId, documentId);
|
|
548
|
+
// 3. Create Factories (closured around 'doc')
|
|
549
|
+
// We return functions that generate the composables so the user can name them
|
|
550
|
+
const useMap = (name) => useSyncedMap(doc, name);
|
|
551
|
+
const useArray = (name) => useSyncedArray(doc, name);
|
|
552
|
+
const useText = (name) => useSyncedText(doc, name);
|
|
553
|
+
const useXml = (name) => useSyncedXml(doc, name);
|
|
554
|
+
return {
|
|
555
|
+
// Connection & Core
|
|
556
|
+
doc,
|
|
557
|
+
provider,
|
|
558
|
+
status,
|
|
559
|
+
synced,
|
|
560
|
+
connect,
|
|
561
|
+
disconnect,
|
|
562
|
+
// History
|
|
563
|
+
undo,
|
|
564
|
+
redo,
|
|
565
|
+
transact,
|
|
566
|
+
canUndo: computed(() => undoManager.value?.undoStack.length ?? 0 > 0),
|
|
567
|
+
canRedo: computed(() => undoManager.value?.redoStack.length ?? 0 > 0),
|
|
568
|
+
// Presence
|
|
569
|
+
users: awareness.states,
|
|
570
|
+
me: awareness.currentUser,
|
|
571
|
+
updatePresence: awareness.setLocalState,
|
|
572
|
+
// Comments
|
|
573
|
+
comments: comments.threads,
|
|
574
|
+
loadingComments: comments.loading,
|
|
575
|
+
createComment: comments.createComment,
|
|
576
|
+
// Factories
|
|
577
|
+
useMap,
|
|
578
|
+
useArray,
|
|
579
|
+
useText,
|
|
580
|
+
useXml
|
|
581
|
+
};
|
|
582
|
+
}
|
|
583
|
+
//# sourceMappingURL=useCollab.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useCollab.js","sourceRoot":"","sources":["../src/useCollab.ts"],"names":[],"mappings":"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"}
|