@adonis-agora/collaboration-client 0.6.1 → 0.7.0
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/dist/src/components/excalidraw_board.d.ts +2 -2
- package/dist/src/components/excalidraw_board.d.ts.map +1 -1
- package/dist/src/components/excalidraw_board.js +4 -6
- package/dist/src/components/excalidraw_board.js.map +1 -1
- package/dist/src/context.d.ts +15 -3
- package/dist/src/context.d.ts.map +1 -1
- package/dist/src/context.js +22 -8
- package/dist/src/context.js.map +1 -1
- package/dist/src/hooks/use_automerge_doc.d.ts +32 -0
- package/dist/src/hooks/use_automerge_doc.d.ts.map +1 -1
- package/dist/src/hooks/use_automerge_doc.js +137 -40
- package/dist/src/hooks/use_automerge_doc.js.map +1 -1
- package/dist/src/hooks/use_awareness.d.ts +30 -0
- package/dist/src/hooks/use_awareness.d.ts.map +1 -1
- package/dist/src/hooks/use_awareness.js +55 -14
- package/dist/src/hooks/use_awareness.js.map +1 -1
- package/dist/src/hooks/use_collab_doc.d.ts +17 -1
- package/dist/src/hooks/use_collab_doc.d.ts.map +1 -1
- package/dist/src/hooks/use_collab_doc.js +44 -19
- package/dist/src/hooks/use_collab_doc.js.map +1 -1
- package/dist/src/hooks/use_collab_editor.d.ts +5 -0
- package/dist/src/hooks/use_collab_editor.d.ts.map +1 -1
- package/dist/src/hooks/use_collab_editor.js +26 -17
- package/dist/src/hooks/use_collab_editor.js.map +1 -1
- package/dist/src/hooks/use_comments.d.ts +6 -1
- package/dist/src/hooks/use_comments.d.ts.map +1 -1
- package/dist/src/hooks/use_comments.js +4 -4
- package/dist/src/hooks/use_comments.js.map +1 -1
- package/dist/src/hooks/use_excalidraw_sync.d.ts +27 -6
- package/dist/src/hooks/use_excalidraw_sync.d.ts.map +1 -1
- package/dist/src/hooks/use_excalidraw_sync.js +56 -22
- package/dist/src/hooks/use_excalidraw_sync.js.map +1 -1
- package/dist/src/hooks/use_versions.js +2 -2
- package/dist/src/hooks/use_versions.js.map +1 -1
- package/dist/src/index.d.ts +4 -3
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/rest_client.d.ts +11 -2
- package/dist/src/rest_client.d.ts.map +1 -1
- package/dist/src/rest_client.js +11 -2
- package/dist/src/rest_client.js.map +1 -1
- package/dist/src/session.d.ts +112 -4
- package/dist/src/session.d.ts.map +1 -1
- package/dist/src/session.js +198 -16
- package/dist/src/session.js.map +1 -1
- package/dist/src/transports/hocuspocus.d.ts +3 -0
- package/dist/src/transports/hocuspocus.d.ts.map +1 -1
- package/dist/src/transports/hocuspocus.js +23 -2
- package/dist/src/transports/hocuspocus.js.map +1 -1
- package/dist/src/types.d.ts +13 -2
- package/dist/src/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use_awareness.js","sourceRoot":"","sources":["../../../src/hooks/use_awareness.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"use_awareness.js","sourceRoot":"","sources":["../../../src/hooks/use_awareness.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import * as Y from 'yjs';
|
|
2
|
+
import type { CollabDoc } from '../docs/types.js';
|
|
2
3
|
import type { CollabStatus } from '../types.js';
|
|
3
4
|
export interface UseCollabDocOptions {
|
|
4
5
|
docName: string;
|
|
@@ -6,14 +7,29 @@ export interface UseCollabDocOptions {
|
|
|
6
7
|
export interface UseCollabDocResult {
|
|
7
8
|
/** Y.Doc compartilhado (estável enquanto o provider viver). */
|
|
8
9
|
doc: Y.Doc;
|
|
10
|
+
/**
|
|
11
|
+
* O mesmo documento pela seam `CollabDoc` (`read`/`write`/`onUpdate`) —
|
|
12
|
+
* é o que `useExcalidrawSync` e os adapters de editor consomem.
|
|
13
|
+
*/
|
|
14
|
+
collabDoc: CollabDoc;
|
|
9
15
|
status: CollabStatus;
|
|
16
|
+
/**
|
|
17
|
+
* `true` quando o estado inicial do servidor já foi aplicado no doc.
|
|
18
|
+
* `status === 'connected'` só diz que o socket abriu — gate de edição
|
|
19
|
+
* costuma querer este aqui.
|
|
20
|
+
*/
|
|
21
|
+
synced: boolean;
|
|
10
22
|
error: Error | null;
|
|
11
23
|
}
|
|
12
24
|
/**
|
|
13
25
|
* Conecta ao documento colaborativo e devolve o Y.Doc + status.
|
|
14
26
|
*
|
|
27
|
+
* A sessão é contada por referência: montar segura, desmontar solta, e o
|
|
28
|
+
* último a sair fecha o socket sem destruir o `Y.Doc` — remontar (voltar na
|
|
29
|
+
* navegação, StrictMode) reconecta sobre o mesmo documento.
|
|
30
|
+
*
|
|
15
31
|
* ```tsx
|
|
16
|
-
* const { doc, status } = useCollabDoc('researches/42/writing')
|
|
32
|
+
* const { doc, status, synced } = useCollabDoc({ docName: 'researches/42/writing' })
|
|
17
33
|
* ```
|
|
18
34
|
*/
|
|
19
35
|
export declare function useCollabDoc(options: UseCollabDocOptions): UseCollabDocResult;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use_collab_doc.d.ts","sourceRoot":"","sources":["../../../src/hooks/use_collab_doc.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAEzB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,+DAA+D;IAC/D,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC;IACX,MAAM,EAAE,YAAY,CAAC;IACrB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;CACrB;
|
|
1
|
+
{"version":3,"file":"use_collab_doc.d.ts","sourceRoot":"","sources":["../../../src/hooks/use_collab_doc.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAEzB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAGlD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,+DAA+D;IAC/D,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC;IACX;;;OAGG;IACH,SAAS,EAAE,SAAS,CAAC;IACrB,MAAM,EAAE,YAAY,CAAC;IACrB;;;;OAIG;IACH,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;CACrB;AAeD;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,kBAAkB,CAsC7E"}
|
|
@@ -1,31 +1,56 @@
|
|
|
1
|
-
import { useEffect, useSyncExternalStore } from 'react';
|
|
1
|
+
import { useCallback, useEffect, useMemo, useSyncExternalStore } from 'react';
|
|
2
|
+
import * as Y from 'yjs';
|
|
2
3
|
import { getOrCreateSession, useCollaborationContext } from '../context.js';
|
|
4
|
+
import { YjsCollabDoc } from '../docs/yjs_doc.js';
|
|
5
|
+
const SERVER_SNAPSHOT = { status: 'connecting', error: null, synced: false };
|
|
6
|
+
/**
|
|
7
|
+
* Placeholder para SSR: no servidor não abrimos sessão nenhuma, mas o
|
|
8
|
+
* contrato devolve um `Y.Doc`. Um único doc vazio compartilhado evita alocar
|
|
9
|
+
* (e vazar) um documento por render de servidor.
|
|
10
|
+
*/
|
|
11
|
+
let serverDoc;
|
|
12
|
+
function getServerDoc() {
|
|
13
|
+
if (!serverDoc)
|
|
14
|
+
serverDoc = new Y.Doc();
|
|
15
|
+
return serverDoc;
|
|
16
|
+
}
|
|
3
17
|
/**
|
|
4
18
|
* Conecta ao documento colaborativo e devolve o Y.Doc + status.
|
|
5
19
|
*
|
|
20
|
+
* A sessão é contada por referência: montar segura, desmontar solta, e o
|
|
21
|
+
* último a sair fecha o socket sem destruir o `Y.Doc` — remontar (voltar na
|
|
22
|
+
* navegação, StrictMode) reconecta sobre o mesmo documento.
|
|
23
|
+
*
|
|
6
24
|
* ```tsx
|
|
7
|
-
* const { doc, status } = useCollabDoc('researches/42/writing')
|
|
25
|
+
* const { doc, status, synced } = useCollabDoc({ docName: 'researches/42/writing' })
|
|
8
26
|
* ```
|
|
9
27
|
*/
|
|
10
28
|
export function useCollabDoc(options) {
|
|
11
29
|
const { docName } = options;
|
|
12
30
|
const context = useCollaborationContext();
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
//
|
|
16
|
-
//
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
31
|
+
// Lazy e no-op no servidor: `getOrCreateSession` muta o Map do provider e
|
|
32
|
+
// constrói um Y.Doc. Efeitos não rodam no SSR, então chamar isso no corpo
|
|
33
|
+
// do render vazava uma sessão por render de servidor — além de ser um
|
|
34
|
+
// render impuro sob React concorrente.
|
|
35
|
+
const isBrowser = typeof window !== 'undefined';
|
|
36
|
+
const session = useMemo(() => (isBrowser ? getOrCreateSession(context, docName) : null), [context, docName, isBrowser]);
|
|
37
|
+
const subscribe = useCallback((onStoreChange) => session?.subscribe(onStoreChange) ?? (() => { }), [session]);
|
|
38
|
+
const getSnapshot = useCallback(() => session?.getSnapshot() ?? SERVER_SNAPSHOT, [session]);
|
|
39
|
+
const snapshot = useSyncExternalStore(subscribe, getSnapshot, () => SERVER_SNAPSHOT);
|
|
40
|
+
const doc = session?.doc ?? getServerDoc();
|
|
41
|
+
const collabDoc = useMemo(() => new YjsCollabDoc(doc), [doc]);
|
|
42
|
+
// Refcount, não destroy. Destruir o Y.Doc no unmount deixava o Hocuspocus
|
|
43
|
+
// Provider com callbacks enfileirados apontando pra um doc destruído
|
|
44
|
+
// (`Cannot read properties of undefined (reading 'startTime')` → React
|
|
45
|
+
// #185), e devolvia um cadáver de sessão na remontagem. `retain()` devolve
|
|
46
|
+
// o `release` correspondente; o último a soltar fecha o transporte.
|
|
47
|
+
useEffect(() => session?.retain(), [session]);
|
|
48
|
+
return {
|
|
49
|
+
doc,
|
|
50
|
+
collabDoc,
|
|
51
|
+
status: snapshot.status,
|
|
52
|
+
synced: snapshot.synced,
|
|
53
|
+
error: snapshot.error,
|
|
54
|
+
};
|
|
30
55
|
}
|
|
31
56
|
//# sourceMappingURL=use_collab_doc.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use_collab_doc.js","sourceRoot":"","sources":["../../../src/hooks/use_collab_doc.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"use_collab_doc.js","sourceRoot":"","sources":["../../../src/hooks/use_collab_doc.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAC9E,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AACzB,OAAO,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAE5E,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AA0BlD,MAAM,eAAe,GAAuB,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AAEjG;;;;GAIG;AACH,IAAI,SAA4B,CAAC;AACjC,SAAS,YAAY;IACnB,IAAI,CAAC,SAAS;QAAE,SAAS,GAAG,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC;IACxC,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,YAAY,CAAC,OAA4B;IACvD,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IAC5B,MAAM,OAAO,GAAG,uBAAuB,EAAE,CAAC;IAE1C,0EAA0E;IAC1E,0EAA0E;IAC1E,sEAAsE;IACtE,uCAAuC;IACvC,MAAM,SAAS,GAAG,OAAO,MAAM,KAAK,WAAW,CAAC;IAChD,MAAM,OAAO,GAAG,OAAO,CACrB,GAAG,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAC/D,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,CAC9B,CAAC;IAEF,MAAM,SAAS,GAAG,WAAW,CAC3B,CAAC,aAAyB,EAAE,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,EAC9E,CAAC,OAAO,CAAC,CACV,CAAC;IACF,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,eAAe,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAC5F,MAAM,QAAQ,GAAG,oBAAoB,CAAC,SAAS,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,CAAC;IAErF,MAAM,GAAG,GAAG,OAAO,EAAE,GAAG,IAAI,YAAY,EAAE,CAAC;IAC3C,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAE9D,0EAA0E;IAC1E,qEAAqE;IACrE,uEAAuE;IACvE,2EAA2E;IAC3E,oEAAoE;IACpE,SAAS,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAE9C,OAAO;QACL,GAAG;QACH,SAAS;QACT,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,KAAK,EAAE,QAAQ,CAAC,KAAK;KACtB,CAAC;AACJ,CAAC"}
|
|
@@ -18,6 +18,8 @@ export interface UseCollabEditorResult<S> {
|
|
|
18
18
|
/** Writes the next scene into the shared doc. */
|
|
19
19
|
update(next: S): void;
|
|
20
20
|
status: CollabStatus;
|
|
21
|
+
/** True once the server's initial state has been applied to the doc. */
|
|
22
|
+
synced: boolean;
|
|
21
23
|
peers: CollabPeer[];
|
|
22
24
|
}
|
|
23
25
|
/**
|
|
@@ -35,6 +37,9 @@ export interface UseCollabEditorResult<S> {
|
|
|
35
37
|
* adapter: createExcalidrawAdapter(),
|
|
36
38
|
* })
|
|
37
39
|
* ```
|
|
40
|
+
*
|
|
41
|
+
* Scene writes are whole-scene replacement (last-write-wins over the whole
|
|
42
|
+
* key), not per-element merging — see the Editors docs.
|
|
38
43
|
*/
|
|
39
44
|
export declare function useCollabEditor<S>(options: UseCollabEditorOptions<S>): UseCollabEditorResult<S>;
|
|
40
45
|
//# sourceMappingURL=use_collab_editor.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use_collab_editor.d.ts","sourceRoot":"","sources":["../../../src/hooks/use_collab_editor.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"use_collab_editor.d.ts","sourceRoot":"","sources":["../../../src/hooks/use_collab_editor.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAI5D,MAAM,WAAW,sBAAsB,CAAC,CAAC;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,mBAAmB,CAAC,CAAC,CAAC,CAAC;IAChC;;;;OAIG;IACH,GAAG,CAAC,EAAE,SAAS,CAAC;CACjB;AAED,MAAM,WAAW,qBAAqB,CAAC,CAAC;IACtC,oEAAoE;IACpE,KAAK,EAAE,CAAC,CAAC;IACT,iDAAiD;IACjD,MAAM,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,YAAY,CAAC;IACrB,wEAAwE;IACxE,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,UAAU,EAAE,CAAC;CACrB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,OAAO,EAAE,sBAAsB,CAAC,CAAC,CAAC,GAAG,qBAAqB,CAAC,CAAC,CAAC,CAwC/F"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { useCallback, useMemo, useRef, useSyncExternalStore } from 'react';
|
|
2
|
-
import { getOrCreateSession, useCollaborationContext } from '../context.js';
|
|
3
|
-
import { YjsCollabDoc } from '../docs/index.js';
|
|
4
2
|
import { useAwareness } from './use_awareness.js';
|
|
3
|
+
import { useCollabDoc } from './use_collab_doc.js';
|
|
5
4
|
/**
|
|
6
5
|
* Engine-aware, editor-aware view of a collaborative document.
|
|
7
6
|
*
|
|
@@ -17,30 +16,40 @@ import { useAwareness } from './use_awareness.js';
|
|
|
17
16
|
* adapter: createExcalidrawAdapter(),
|
|
18
17
|
* })
|
|
19
18
|
* ```
|
|
19
|
+
*
|
|
20
|
+
* Scene writes are whole-scene replacement (last-write-wins over the whole
|
|
21
|
+
* key), not per-element merging — see the Editors docs.
|
|
20
22
|
*/
|
|
21
23
|
export function useCollabEditor(options) {
|
|
22
24
|
const { docName, editorId, adapter, doc } = options;
|
|
23
|
-
const
|
|
24
|
-
const
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
//
|
|
28
|
-
const
|
|
29
|
-
return collabDoc.onUpdate(onStoreChange);
|
|
30
|
-
}, [collabDoc]);
|
|
31
|
-
// Adapter view + stable snapshot: scenes are freshly built objects, so we
|
|
32
|
-
// cache by serialized equality to keep useSyncExternalStore from looping.
|
|
25
|
+
const { collabDoc: sessionDoc, status, synced } = useCollabDoc({ docName });
|
|
26
|
+
const { peers } = useAwareness({ docName });
|
|
27
|
+
// Memoized: building the wrapper in the render body gave `subscribe` a new
|
|
28
|
+
// identity on every render, so useSyncExternalStore tore down and re-added
|
|
29
|
+
// the Y.Doc 'update' listener each time.
|
|
30
|
+
const collabDoc = useMemo(() => doc ?? sessionDoc, [doc, sessionDoc]);
|
|
33
31
|
const view = useMemo(() => adapter.create(collabDoc, editorId), [adapter, collabDoc, editorId]);
|
|
32
|
+
// Reactivity: any document update bumps a version and re-reads the adapter
|
|
33
|
+
// state. The scene is a freshly built object on every read, so the snapshot
|
|
34
|
+
// is cached by version — the old cache key was `JSON.stringify(scene)`,
|
|
35
|
+
// which serialized the whole board on every stroke just to decide whether
|
|
36
|
+
// anything changed.
|
|
37
|
+
const versionRef = useRef(0);
|
|
38
|
+
const subscribe = useCallback((onStoreChange) => collabDoc.onUpdate(() => {
|
|
39
|
+
versionRef.current += 1;
|
|
40
|
+
onStoreChange();
|
|
41
|
+
}), [collabDoc]);
|
|
34
42
|
const cacheRef = useRef(undefined);
|
|
35
43
|
const getSnapshot = useCallback(() => {
|
|
44
|
+
const cached = cacheRef.current;
|
|
45
|
+
if (cached && cached.version === versionRef.current && cached.view === view) {
|
|
46
|
+
return cached.value;
|
|
47
|
+
}
|
|
36
48
|
const next = view.state;
|
|
37
|
-
|
|
38
|
-
if (cacheRef.current?.key === key)
|
|
39
|
-
return cacheRef.current.value;
|
|
40
|
-
cacheRef.current = { key, value: next };
|
|
49
|
+
cacheRef.current = { version: versionRef.current, view, value: next };
|
|
41
50
|
return next;
|
|
42
51
|
}, [view]);
|
|
43
52
|
const state = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);
|
|
44
|
-
return { state, update: view.update, status, peers };
|
|
53
|
+
return { state, update: view.update, status, synced, peers };
|
|
45
54
|
}
|
|
46
55
|
//# sourceMappingURL=use_collab_editor.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use_collab_editor.js","sourceRoot":"","sources":["../../../src/hooks/use_collab_editor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"use_collab_editor.js","sourceRoot":"","sources":["../../../src/hooks/use_collab_editor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAI3E,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAyBnD;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,eAAe,CAAI,OAAkC;IACnE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC;IACpD,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;IAC5E,MAAM,EAAE,KAAK,EAAE,GAAG,YAAY,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;IAE5C,2EAA2E;IAC3E,2EAA2E;IAC3E,yCAAyC;IACzC,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,UAAU,EAAE,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC;IACtE,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;IAEhG,2EAA2E;IAC3E,4EAA4E;IAC5E,wEAAwE;IACxE,0EAA0E;IAC1E,oBAAoB;IACpB,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IAC7B,MAAM,SAAS,GAAG,WAAW,CAC3B,CAAC,aAAyB,EAAE,EAAE,CAC5B,SAAS,CAAC,QAAQ,CAAC,GAAG,EAAE;QACtB,UAAU,CAAC,OAAO,IAAI,CAAC,CAAC;QACxB,aAAa,EAAE,CAAC;IAClB,CAAC,CAAC,EACJ,CAAC,SAAS,CAAC,CACZ,CAAC;IAEF,MAAM,QAAQ,GAAG,MAAM,CAA2D,SAAS,CAAC,CAAC;IAC7F,MAAM,WAAW,GAAG,WAAW,CAAC,GAAM,EAAE;QACtC,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC;QAChC,IAAI,MAAM,IAAI,MAAM,CAAC,OAAO,KAAK,UAAU,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;YAC5E,OAAO,MAAM,CAAC,KAAK,CAAC;QACtB,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;QACxB,QAAQ,CAAC,OAAO,GAAG,EAAE,OAAO,EAAE,UAAU,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QACtE,OAAO,IAAI,CAAC;IACd,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAEX,MAAM,KAAK,GAAG,oBAAoB,CAAC,SAAS,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;IAExE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AAC/D,CAAC"}
|
|
@@ -9,7 +9,12 @@ export interface UseCommentsResult {
|
|
|
9
9
|
loading: boolean;
|
|
10
10
|
error: Error | null;
|
|
11
11
|
refresh(): Promise<void>;
|
|
12
|
-
|
|
12
|
+
/**
|
|
13
|
+
* The author is the authenticated caller — `handleCreateComment` sets
|
|
14
|
+
* `userId` from the session and discards whatever the body claimed, so this
|
|
15
|
+
* does not ask for one.
|
|
16
|
+
*/
|
|
17
|
+
create(input: Pick<CollabComment, 'space' | 'anchor' | 'body'> & {
|
|
13
18
|
authorName?: string | null;
|
|
14
19
|
}): Promise<CollabComment>;
|
|
15
20
|
resolve(commentId: string, resolved?: boolean): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use_comments.d.ts","sourceRoot":"","sources":["../../../src/hooks/use_comments.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,6CAA6C;IAC7C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,MAAM,CACJ,KAAK,EAAE,IAAI,CAAC,aAAa,EAAE,OAAO,GAAG,QAAQ,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"use_comments.d.ts","sourceRoot":"","sources":["../../../src/hooks/use_comments.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,6CAA6C;IAC7C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB;;;;OAIG;IACH,MAAM,CACJ,KAAK,EAAE,IAAI,CAAC,aAAa,EAAE,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC,GAAG;QACxD,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;KAC5B,GACA,OAAO,CAAC,aAAa,CAAC,CAAC;IAC1B,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9D,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1C;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,iBAAiB,CA0E1E"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { useCallback, useEffect, useRef, useState } from 'react';
|
|
2
|
-
import {
|
|
2
|
+
import { useCollaborationContext } from '../context.js';
|
|
3
3
|
import { createComment as apiCreateComment, deleteComment as apiDeleteComment, listComments, resolveComment, } from '../rest_client.js';
|
|
4
4
|
/**
|
|
5
5
|
* Comentários ancorados de um documento (REST — dados relacionais no Adonis).
|
|
@@ -12,9 +12,9 @@ export function useComments(options) {
|
|
|
12
12
|
const { docName, space } = options;
|
|
13
13
|
const context = useCollaborationContext();
|
|
14
14
|
const config = context.getConfig();
|
|
15
|
-
//
|
|
16
|
-
//
|
|
17
|
-
|
|
15
|
+
// Nada de abrir sessão aqui: comentários são REST puro e funcionam com o
|
|
16
|
+
// engine offline. Criar a sessão no corpo do render só mutava o Map do
|
|
17
|
+
// provider (e vazava um Y.Doc por render de servidor) sem nunca iniciá-la.
|
|
18
18
|
const [comments, setComments] = useState([]);
|
|
19
19
|
const [loading, setLoading] = useState(true);
|
|
20
20
|
const [error, setError] = useState(null);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use_comments.js","sourceRoot":"","sources":["../../../src/hooks/use_comments.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"use_comments.js","sourceRoot":"","sources":["../../../src/hooks/use_comments.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type * as Y from 'yjs';
|
|
1
2
|
import type { CollabDoc } from '../docs/types.js';
|
|
2
3
|
/**
|
|
3
4
|
* Minimal imperative API that Excalidraw exposes for programmatic control.
|
|
@@ -11,8 +12,12 @@ export interface ExcalidrawAPIHandle {
|
|
|
11
12
|
}): void;
|
|
12
13
|
}
|
|
13
14
|
export interface UseExcalidrawSyncOptions {
|
|
14
|
-
/**
|
|
15
|
-
|
|
15
|
+
/**
|
|
16
|
+
* Documento colaborativo. Aceita tanto o `Y.Doc` quanto o `collabDoc` que
|
|
17
|
+
* o `useCollabDoc` devolve — o wrapper `YjsCollabDoc` é aplicado aqui
|
|
18
|
+
* quando necessário. Pode ser `null` enquanto conecta.
|
|
19
|
+
*/
|
|
20
|
+
doc: CollabDoc | Y.Doc | null;
|
|
16
21
|
/** API imperativa do Excalidraw (`excalidrawAPI` do componente). */
|
|
17
22
|
excalidrawAPI: ExcalidrawAPIHandle | null;
|
|
18
23
|
/** Chave do editor no doc (default `'excalidraw'`). */
|
|
@@ -21,16 +26,32 @@ export interface UseExcalidrawSyncOptions {
|
|
|
21
26
|
/**
|
|
22
27
|
* Liga um documento colaborativo à API imperativa do Excalidraw.
|
|
23
28
|
*
|
|
24
|
-
* - **Desenho local** → grava os elements no
|
|
29
|
+
* - **Desenho local** → grava os elements no doc (replica via WebSocket).
|
|
25
30
|
* - **Mudança remota** → `updateScene` no canvas.
|
|
26
|
-
* - **Ao montar** → restaura o estado salvo do doc
|
|
31
|
+
* - **Ao montar** → restaura o estado salvo do doc (inclusive quando o
|
|
32
|
+
* estado salvo é uma lousa vazia).
|
|
27
33
|
*
|
|
28
34
|
* ```tsx
|
|
29
|
-
* const [api, setApi] = useState(null)
|
|
35
|
+
* const [api, setApi] = useState<ExcalidrawAPIHandle | null>(null)
|
|
30
36
|
* const { doc } = useCollabDoc({ docName: 'lousas/1' })
|
|
31
37
|
* useExcalidrawSync({ doc, excalidrawAPI: api })
|
|
32
|
-
*
|
|
38
|
+
*
|
|
39
|
+
* return <Excalidraw excalidrawAPI={setApi} />
|
|
33
40
|
* ```
|
|
41
|
+
*
|
|
42
|
+
* ## Last-write-wins, e o que isso custa
|
|
43
|
+
*
|
|
44
|
+
* A cena inteira mora numa única chave do documento (`Y.Map[editorId].value`),
|
|
45
|
+
* então cada `onChange` grava o array de elements completo. O CRDT converge,
|
|
46
|
+
* mas **sobre a cena como unidade**: duas pessoas mexendo em formas
|
|
47
|
+
* diferentes no mesmo instante produzem duas escritas de cena inteira e a
|
|
48
|
+
* última vence — o traço da outra some. Não há merge por elemento aqui.
|
|
49
|
+
*
|
|
50
|
+
* Na prática dá pra conviver: as edições aparecem, as pessoas trabalham em
|
|
51
|
+
* regiões diferentes e os cursores de presença mantêm distância. Se a
|
|
52
|
+
* concorrência por item importa de verdade, modele cada elemento como sua
|
|
53
|
+
* própria chave e escreva um adapter que faça isso (veja
|
|
54
|
+
* `CollabEditorAdapter`) — este hook não vai te dar isso.
|
|
34
55
|
*/
|
|
35
56
|
export declare function useExcalidrawSync({ doc, excalidrawAPI, editorId, }: UseExcalidrawSyncOptions): void;
|
|
36
57
|
//# sourceMappingURL=use_excalidraw_sync.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use_excalidraw_sync.d.ts","sourceRoot":"","sources":["../../../src/hooks/use_excalidraw_sync.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"use_excalidraw_sync.d.ts","sourceRoot":"","sources":["../../../src/hooks/use_excalidraw_sync.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,CAAC,MAAM,KAAK,CAAC;AAC9B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAIlD;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,EAAE,EAAE,CAAC,QAAQ,EAAE,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IACjF,WAAW,CAAC,KAAK,EAAE;QAAE,QAAQ,EAAE,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAA;KAAE,GAAG,IAAI,CAAC;CAC5E;AAED,MAAM,WAAW,wBAAwB;IACvC;;;;OAIG;IACH,GAAG,EAAE,SAAS,GAAG,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC;IAC9B,oEAAoE;IACpE,aAAa,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAC1C,uDAAuD;IACvD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAYD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,GAAG,EACH,aAAa,EACb,QAAuB,GACxB,EAAE,wBAAwB,QAsD1B"}
|
|
@@ -1,34 +1,66 @@
|
|
|
1
1
|
import { useEffect, useMemo, useRef } from 'react';
|
|
2
|
+
import { YjsCollabDoc } from '../docs/yjs_doc.js';
|
|
2
3
|
import { createExcalidrawAdapter } from '../editors/excalidraw.js';
|
|
4
|
+
/** `Y.Doc` não tem `read`/`write`/`onUpdate` — envolve quando for um. */
|
|
5
|
+
function isCollabDoc(doc) {
|
|
6
|
+
const candidate = doc;
|
|
7
|
+
return (typeof candidate.read === 'function' &&
|
|
8
|
+
typeof candidate.write === 'function' &&
|
|
9
|
+
typeof candidate.onUpdate === 'function');
|
|
10
|
+
}
|
|
3
11
|
/**
|
|
4
12
|
* Liga um documento colaborativo à API imperativa do Excalidraw.
|
|
5
13
|
*
|
|
6
|
-
* - **Desenho local** → grava os elements no
|
|
14
|
+
* - **Desenho local** → grava os elements no doc (replica via WebSocket).
|
|
7
15
|
* - **Mudança remota** → `updateScene` no canvas.
|
|
8
|
-
* - **Ao montar** → restaura o estado salvo do doc
|
|
16
|
+
* - **Ao montar** → restaura o estado salvo do doc (inclusive quando o
|
|
17
|
+
* estado salvo é uma lousa vazia).
|
|
9
18
|
*
|
|
10
19
|
* ```tsx
|
|
11
|
-
* const [api, setApi] = useState(null)
|
|
20
|
+
* const [api, setApi] = useState<ExcalidrawAPIHandle | null>(null)
|
|
12
21
|
* const { doc } = useCollabDoc({ docName: 'lousas/1' })
|
|
13
22
|
* useExcalidrawSync({ doc, excalidrawAPI: api })
|
|
14
|
-
*
|
|
23
|
+
*
|
|
24
|
+
* return <Excalidraw excalidrawAPI={setApi} />
|
|
15
25
|
* ```
|
|
26
|
+
*
|
|
27
|
+
* ## Last-write-wins, e o que isso custa
|
|
28
|
+
*
|
|
29
|
+
* A cena inteira mora numa única chave do documento (`Y.Map[editorId].value`),
|
|
30
|
+
* então cada `onChange` grava o array de elements completo. O CRDT converge,
|
|
31
|
+
* mas **sobre a cena como unidade**: duas pessoas mexendo em formas
|
|
32
|
+
* diferentes no mesmo instante produzem duas escritas de cena inteira e a
|
|
33
|
+
* última vence — o traço da outra some. Não há merge por elemento aqui.
|
|
34
|
+
*
|
|
35
|
+
* Na prática dá pra conviver: as edições aparecem, as pessoas trabalham em
|
|
36
|
+
* regiões diferentes e os cursores de presença mantêm distância. Se a
|
|
37
|
+
* concorrência por item importa de verdade, modele cada elemento como sua
|
|
38
|
+
* própria chave e escreva um adapter que faça isso (veja
|
|
39
|
+
* `CollabEditorAdapter`) — este hook não vai te dar isso.
|
|
16
40
|
*/
|
|
17
41
|
export function useExcalidrawSync({ doc, excalidrawAPI, editorId = 'excalidraw', }) {
|
|
18
42
|
const adapter = useMemo(() => createExcalidrawAdapter(), []);
|
|
19
|
-
const
|
|
43
|
+
const collabDoc = useMemo(() => {
|
|
44
|
+
if (!doc)
|
|
45
|
+
return null;
|
|
46
|
+
return isCollabDoc(doc) ? doc : new YjsCollabDoc(doc);
|
|
47
|
+
}, [doc]);
|
|
48
|
+
const view = useMemo(() => (collabDoc ? adapter.create(collabDoc, editorId) : null), [adapter, collabDoc, editorId]);
|
|
20
49
|
const localFlag = useRef(null);
|
|
21
50
|
// Ao montar, carrega o estado inicial do doc no canvas.
|
|
22
51
|
useEffect(() => {
|
|
23
|
-
if (!excalidrawAPI || !view)
|
|
52
|
+
if (!excalidrawAPI || !view || !collabDoc)
|
|
24
53
|
return;
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
54
|
+
// `elements.length > 0` confundia "documento ainda vazio" com "lousa
|
|
55
|
+
// apagada": depois de um select-all + delete, a cena salva é
|
|
56
|
+
// `{ elements: [] }` e o guard antigo pulava a restauração, então o
|
|
57
|
+
// reload trazia os traços de volta. O que importa é se a chave existe.
|
|
58
|
+
if (collabDoc.read(editorId) === undefined)
|
|
59
|
+
return;
|
|
60
|
+
excalidrawAPI.updateScene({
|
|
61
|
+
elements: view.state.elements,
|
|
62
|
+
});
|
|
63
|
+
}, [collabDoc, editorId, excalidrawAPI, view]);
|
|
32
64
|
// Desenho local → escreve no doc.
|
|
33
65
|
useEffect(() => {
|
|
34
66
|
if (!excalidrawAPI || !view)
|
|
@@ -45,19 +77,21 @@ export function useExcalidrawSync({ doc, excalidrawAPI, editorId = 'excalidraw',
|
|
|
45
77
|
}, [excalidrawAPI, view]);
|
|
46
78
|
// Mudança remota → atualiza o canvas.
|
|
47
79
|
useEffect(() => {
|
|
48
|
-
if (!
|
|
80
|
+
if (!collabDoc || !excalidrawAPI || !view)
|
|
49
81
|
return;
|
|
50
|
-
const unsub =
|
|
82
|
+
const unsub = collabDoc.onUpdate(() => {
|
|
51
83
|
if (localFlag.current || !excalidrawAPI)
|
|
52
84
|
return;
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
85
|
+
// Mesmo motivo do efeito de mount: um peer que apagou tudo manda
|
|
86
|
+
// `{ elements: [] }` e isso precisa chegar no canvas, senão apagar
|
|
87
|
+
// nunca propaga.
|
|
88
|
+
if (collabDoc.read(editorId) === undefined)
|
|
89
|
+
return;
|
|
90
|
+
excalidrawAPI.updateScene({
|
|
91
|
+
elements: view.state.elements,
|
|
92
|
+
});
|
|
59
93
|
});
|
|
60
94
|
return () => unsub();
|
|
61
|
-
}, [
|
|
95
|
+
}, [collabDoc, editorId, excalidrawAPI, view]);
|
|
62
96
|
}
|
|
63
97
|
//# sourceMappingURL=use_excalidraw_sync.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use_excalidraw_sync.js","sourceRoot":"","sources":["../../../src/hooks/use_excalidraw_sync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"use_excalidraw_sync.js","sourceRoot":"","sources":["../../../src/hooks/use_excalidraw_sync.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { useCallback, useEffect, useRef, useState } from 'react';
|
|
2
|
-
import {
|
|
2
|
+
import { useCollaborationContext } from '../context.js';
|
|
3
3
|
import { createVersion as apiCreateVersion, restoreVersion as apiRestoreVersion, listVersions, } from '../rest_client.js';
|
|
4
4
|
/**
|
|
5
5
|
* Version control de um documento (REST — snapshots ficam no Adonis).
|
|
@@ -12,7 +12,7 @@ export function useVersions(options) {
|
|
|
12
12
|
const { docName } = options;
|
|
13
13
|
const context = useCollaborationContext();
|
|
14
14
|
const config = context.getConfig();
|
|
15
|
-
|
|
15
|
+
// Versões são REST puro — sem sessão/Y.Doc criados no corpo do render.
|
|
16
16
|
const [versions, setVersions] = useState([]);
|
|
17
17
|
const [loading, setLoading] = useState(true);
|
|
18
18
|
const [error, setError] = useState(null);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use_versions.js","sourceRoot":"","sources":["../../../src/hooks/use_versions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"use_versions.js","sourceRoot":"","sources":["../../../src/hooks/use_versions.ts"],"names":[],"mappings":"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"}
|
package/dist/src/index.d.ts
CHANGED
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
export { CollaborationProvider, useCollaborationContext } from './context.js';
|
|
2
2
|
export type { CollaborationProviderProps } from './context.js';
|
|
3
3
|
export { DocSession } from './session.js';
|
|
4
|
+
export type { DocSessionSnapshot, DocSessionOptions } from './session.js';
|
|
4
5
|
export { CollabRestError, collabFetch, createComment, createVersion, deleteComment, fetchToken, listComments, listVersions, resolveComment, restoreVersion, } from './rest_client.js';
|
|
5
6
|
export { defaultTransportFactory } from './transports/index.js';
|
|
6
7
|
export { HocuspocusCollabTransport } from './transports/hocuspocus.js';
|
|
7
8
|
export { PartyKitCollabTransport } from './transports/partykit.js';
|
|
8
9
|
export { PartyServerCollabTransport } from './transports/partyserver.js';
|
|
9
10
|
export { useCollabDoc } from './hooks/use_collab_doc.js';
|
|
10
|
-
export type { UseCollabDocResult } from './hooks/use_collab_doc.js';
|
|
11
|
+
export type { UseCollabDocOptions, UseCollabDocResult } from './hooks/use_collab_doc.js';
|
|
11
12
|
export { useAwareness } from './hooks/use_awareness.js';
|
|
12
|
-
export type { UseAwarenessResult } from './hooks/use_awareness.js';
|
|
13
|
+
export type { CollabLocalUser, UseAwarenessOptions, UseAwarenessResult, } from './hooks/use_awareness.js';
|
|
13
14
|
export { useComments } from './hooks/use_comments.js';
|
|
14
15
|
export type { UseCommentsResult } from './hooks/use_comments.js';
|
|
15
16
|
export { useVersions } from './hooks/use_versions.js';
|
|
@@ -24,7 +25,7 @@ export type { ExcalidrawBoardProps } from './components/excalidraw_board.js';
|
|
|
24
25
|
export { createExcalidrawAdapter, createTldrawAdapter, createTextAdapter, } from './editors/index.js';
|
|
25
26
|
export type { CollabEditorAdapter, CollabEditorView, ExcalidrawScene, TldrawScene, } from './editors/index.js';
|
|
26
27
|
export { useCollabEditor } from './hooks/use_collab_editor.js';
|
|
27
|
-
export type { UseCollabEditorResult } from './hooks/use_collab_editor.js';
|
|
28
|
+
export type { UseCollabEditorOptions, UseCollabEditorResult, } from './hooks/use_collab_editor.js';
|
|
28
29
|
export { YjsCollabDoc, AutomergeCollabDoc } from './docs/index.js';
|
|
29
30
|
export type { CollabDoc, RichTextDoc, AutomergeDocHost } from './docs/index.js';
|
|
30
31
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/src/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAC9E,YAAY,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EACL,eAAe,EACf,WAAW,EACX,aAAa,EACb,aAAa,EACb,aAAa,EACb,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,cAAc,GACf,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AACvE,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AACzE,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,YAAY,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAC9E,YAAY,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,YAAY,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAC1E,OAAO,EACL,eAAe,EACf,WAAW,EACX,aAAa,EACb,aAAa,EACb,aAAa,EACb,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,cAAc,GACf,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AACvE,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AACzE,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,YAAY,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AACzF,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,YAAY,EACV,eAAe,EACf,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,YAAY,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,YAAY,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACjE,YAAY,EACV,aAAa,EACb,UAAU,EACV,YAAY,EACZ,eAAe,EACf,eAAe,EACf,aAAa,EACb,yBAAyB,EACzB,gBAAgB,GACjB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,YAAY,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAC1E,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,YAAY,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AACpG,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,YAAY,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AAC7E,OAAO,EACL,uBAAuB,EACvB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EACV,mBAAmB,EACnB,gBAAgB,EAChB,eAAe,EACf,WAAW,GACZ,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,YAAY,EACV,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACnE,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC"}
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAE9E,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAE9E,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,OAAO,EACL,eAAe,EACf,WAAW,EACX,aAAa,EACb,aAAa,EACb,aAAa,EACb,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,cAAc,GACf,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AACvE,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AACzE,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAMxD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEtD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAYtD,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAE/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAEnE,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAEnE,OAAO,EACL,uBAAuB,EACvB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAO5B,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAK/D,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC"}
|