@adonis-agora/collaboration-client 0.5.0 → 0.6.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 +29 -0
- package/dist/src/components/excalidraw_board.d.ts.map +1 -0
- package/dist/src/components/excalidraw_board.js +47 -0
- package/dist/src/components/excalidraw_board.js.map +1 -0
- package/dist/src/hooks/use_collab_doc.d.ts.map +1 -1
- package/dist/src/hooks/use_collab_doc.js +9 -3
- package/dist/src/hooks/use_collab_doc.js.map +1 -1
- package/dist/src/hooks/use_excalidraw_sync.d.ts +36 -0
- package/dist/src/hooks/use_excalidraw_sync.d.ts.map +1 -0
- package/dist/src/hooks/use_excalidraw_sync.js +63 -0
- package/dist/src/hooks/use_excalidraw_sync.js.map +1 -0
- package/dist/src/index.d.ts +4 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +2 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/session.d.ts.map +1 -1
- package/dist/src/session.js +14 -0
- package/dist/src/session.js.map +1 -1
- package/package.json +3 -2
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import '@excalidraw/excalidraw/index.css';
|
|
2
|
+
export interface ExcalidrawBoardProps {
|
|
3
|
+
/** Nome do doc Yjs (ex.: `whiteboards/:id/canvas`). */
|
|
4
|
+
docName: string;
|
|
5
|
+
/** Modo somente leitura. */
|
|
6
|
+
readOnly?: boolean;
|
|
7
|
+
/** Código do idioma (default `'pt-BR'`). */
|
|
8
|
+
langCode?: string;
|
|
9
|
+
/** Base URL do servidor (ex.: `https://api.app`). */
|
|
10
|
+
baseUrl: string;
|
|
11
|
+
/** Retorna cabeçalhos de auth (ex.: `() => ({ cookie })`). */
|
|
12
|
+
getHeaders: () => Record<string, string>;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Componente pronto para edição colaborativa de lousa Excalidraw.
|
|
16
|
+
*
|
|
17
|
+
* Faz tudo: conecta ao doc Yjs, sincroniza desenho ↔ WebSocket, restaura
|
|
18
|
+
* estado salvo ao recarregar.
|
|
19
|
+
*
|
|
20
|
+
* ```tsx
|
|
21
|
+
* <ExcalidrawBoard
|
|
22
|
+
* docName="whiteboards/meu-id/canvas"
|
|
23
|
+
* baseUrl="https://api.app"
|
|
24
|
+
* getHeaders={() => ({ cookie: document.cookie })}
|
|
25
|
+
* />
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
export declare function ExcalidrawBoard({ docName, readOnly, langCode, baseUrl, getHeaders, }: ExcalidrawBoardProps): import("react/jsx-runtime").JSX.Element;
|
|
29
|
+
//# sourceMappingURL=excalidraw_board.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"excalidraw_board.d.ts","sourceRoot":"","sources":["../../../src/components/excalidraw_board.tsx"],"names":[],"mappings":"AAMA,OAAO,kCAAkC,CAAC;AAmD1C,MAAM,WAAW,oBAAoB;IACnC,uDAAuD;IACvD,OAAO,EAAE,MAAM,CAAC;IAChB,4BAA4B;IAC5B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,4CAA4C;IAC5C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qDAAqD;IACrD,OAAO,EAAE,MAAM,CAAC;IAChB,8DAA8D;IAC9D,UAAU,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC1C;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,eAAe,CAAC,EAC9B,OAAO,EACP,QAAgB,EAChB,QAAkB,EAClB,OAAO,EACP,UAAU,GACX,EAAE,oBAAoB,2CAWtB"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useMemo, useState, Suspense, lazy } from 'react';
|
|
3
|
+
import { CollaborationProvider, useCollabDoc } from '../index.js';
|
|
4
|
+
import { useExcalidrawSync } from '../hooks/use_excalidraw_sync.js';
|
|
5
|
+
import { YjsCollabDoc } from '../docs/index.js';
|
|
6
|
+
// CSS do Excalidraw — bundler (Vite) resolve para o pacote instalado no app.
|
|
7
|
+
import '@excalidraw/excalidraw/index.css';
|
|
8
|
+
const ExcalidrawLazy = lazy(async () => {
|
|
9
|
+
const mod = await import('@excalidraw/excalidraw');
|
|
10
|
+
return { default: mod.Excalidraw };
|
|
11
|
+
});
|
|
12
|
+
function BoardLoading() {
|
|
13
|
+
return (_jsx("div", { className: "flex h-full w-full items-center justify-center bg-stone-50", children: _jsx("p", { className: "text-sm text-muted-foreground", children: "Carregando lousa\u2026" }) }));
|
|
14
|
+
}
|
|
15
|
+
function ExcalidrawBoardInner({ docName, readOnly = false, langCode = 'pt-BR', }) {
|
|
16
|
+
const { doc } = useCollabDoc({ docName });
|
|
17
|
+
const collabDoc = useMemo(() => (doc ? new YjsCollabDoc(doc) : null), [doc]);
|
|
18
|
+
const [api, setApi] = useState(null);
|
|
19
|
+
const [mounted, setMounted] = useState(false);
|
|
20
|
+
useEffect(() => setMounted(true), []);
|
|
21
|
+
useExcalidrawSync({ doc: collabDoc, excalidrawAPI: api, editorId: docName });
|
|
22
|
+
if (!mounted || !collabDoc)
|
|
23
|
+
return _jsx(BoardLoading, {});
|
|
24
|
+
return (_jsx("div", { className: "relative h-full w-full overflow-hidden bg-stone-50", children: _jsx(Suspense, { fallback: _jsx(BoardLoading, {}), children: _jsx(ExcalidrawLazy, { excalidrawAPI: setApi, langCode: langCode, viewModeEnabled: readOnly, initialData: { appState: { viewBackgroundColor: '#fafaf9' } } }) }) }));
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Componente pronto para edição colaborativa de lousa Excalidraw.
|
|
28
|
+
*
|
|
29
|
+
* Faz tudo: conecta ao doc Yjs, sincroniza desenho ↔ WebSocket, restaura
|
|
30
|
+
* estado salvo ao recarregar.
|
|
31
|
+
*
|
|
32
|
+
* ```tsx
|
|
33
|
+
* <ExcalidrawBoard
|
|
34
|
+
* docName="whiteboards/meu-id/canvas"
|
|
35
|
+
* baseUrl="https://api.app"
|
|
36
|
+
* getHeaders={() => ({ cookie: document.cookie })}
|
|
37
|
+
* />
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
export function ExcalidrawBoard({ docName, readOnly = false, langCode = 'pt-BR', baseUrl, getHeaders, }) {
|
|
41
|
+
const [mounted, setMounted] = useState(false);
|
|
42
|
+
useEffect(() => setMounted(true), []);
|
|
43
|
+
if (!mounted)
|
|
44
|
+
return _jsx(BoardLoading, {});
|
|
45
|
+
return (_jsx(CollaborationProvider, { baseUrl: baseUrl, getHeaders: getHeaders, children: _jsx(ExcalidrawBoardInner, { docName: docName, readOnly: readOnly, langCode: langCode }) }));
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=excalidraw_board.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"excalidraw_board.js","sourceRoot":"","sources":["../../../src/components/excalidraw_board.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,6EAA6E;AAC7E,OAAO,kCAAkC,CAAC;AAE1C,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE;IACrC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAC;IACnD,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC;AACrC,CAAC,CAAC,CAAC;AAEH,SAAS,YAAY;IACnB,OAAO,CACL,cAAK,SAAS,EAAC,4DAA4D,YACzE,YAAG,SAAS,EAAC,+BAA+B,uCAAsB,GAC9D,CACP,CAAC;AACJ,CAAC;AAQD,SAAS,oBAAoB,CAAC,EAC5B,OAAO,EACP,QAAQ,GAAG,KAAK,EAChB,QAAQ,GAAG,OAAO,GACQ;IAC1B,MAAM,EAAE,GAAG,EAAE,GAAG,YAAY,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;IAC1C,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7E,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,QAAQ,CAAU,IAAI,CAAC,CAAC;IAC9C,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE9C,SAAS,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IAEtC,iBAAiB,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,aAAa,EAAE,GAAY,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;IAEtF,IAAI,CAAC,OAAO,IAAI,CAAC,SAAS;QAAE,OAAO,KAAC,YAAY,KAAG,CAAC;IAEpD,OAAO,CACL,cAAK,SAAS,EAAC,oDAAoD,YACjE,KAAC,QAAQ,IAAC,QAAQ,EAAE,KAAC,YAAY,KAAG,YAClC,KAAC,cAAc,IACb,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,QAAQ,EAClB,eAAe,EAAE,QAAQ,EACzB,WAAW,EAAE,EAAE,QAAQ,EAAE,EAAE,mBAAmB,EAAE,SAAS,EAAE,EAAE,GAC7D,GACO,GACP,CACP,CAAC;AACJ,CAAC;AAeD;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,eAAe,CAAC,EAC9B,OAAO,EACP,QAAQ,GAAG,KAAK,EAChB,QAAQ,GAAG,OAAO,EAClB,OAAO,EACP,UAAU,GACW;IACrB,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9C,SAAS,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IAEtC,IAAI,CAAC,OAAO;QAAE,OAAO,KAAC,YAAY,KAAG,CAAC;IAEtC,OAAO,CACL,KAAC,qBAAqB,IAAC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,YAC7D,KAAC,oBAAoB,IAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,GAAI,GAC5D,CACzB,CAAC;AACJ,CAAC"}
|
|
@@ -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;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,kBAAkB,
|
|
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;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,kBAAkB,CA2B7E"}
|
|
@@ -12,12 +12,18 @@ export function useCollabDoc(options) {
|
|
|
12
12
|
const context = useCollaborationContext();
|
|
13
13
|
const session = getOrCreateSession(context, docName);
|
|
14
14
|
const status = useSyncExternalStore((onStoreChange) => session.subscribe(onStoreChange), () => session.getStatus(), () => 'connecting');
|
|
15
|
-
// Garante start
|
|
16
|
-
//
|
|
15
|
+
// Garante start no mount. No cleanup destruímos a sessão: o Hocuspocus
|
|
16
|
+
// Provider enfileira callbacks (requestIdleCallback, setTimeout) que
|
|
17
|
+
// tentam acessar o Y.Doc e o awareness — se o componente re-monta (React
|
|
18
|
+
// 18 StrictMode, navegação), o `doc` antigo pode estar destruído e o
|
|
19
|
+
// callback quebra com `Cannot read properties of undefined (reading
|
|
20
|
+
// 'startTime')`, que dispara o re-render loop do Tiptap Collaboration
|
|
21
|
+
// (React #185). Destruir a sessão garante que timers e listeners são
|
|
22
|
+
// limpos junto com o doc.
|
|
17
23
|
useEffect(() => {
|
|
18
24
|
void session.start();
|
|
19
25
|
return () => {
|
|
20
|
-
|
|
26
|
+
session.destroy();
|
|
21
27
|
};
|
|
22
28
|
}, [session]);
|
|
23
29
|
return { doc: session.doc, status, error: session.error };
|
|
@@ -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;AAExD,OAAO,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAc5E;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAC,OAA4B;IACvD,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IAC5B,MAAM,OAAO,GAAG,uBAAuB,EAAE,CAAC;IAC1C,MAAM,OAAO,GAAG,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAErD,MAAM,MAAM,GAAG,oBAAoB,CACjC,CAAC,aAAa,EAAE,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,aAAa,CAAC,EACnD,GAAG,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,EACzB,GAAG,EAAE,CAAC,YAA4B,CACnC,CAAC;IAEF,sEAAsE;IACtE,
|
|
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;AAExD,OAAO,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAc5E;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAC,OAA4B;IACvD,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IAC5B,MAAM,OAAO,GAAG,uBAAuB,EAAE,CAAC;IAC1C,MAAM,OAAO,GAAG,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAErD,MAAM,MAAM,GAAG,oBAAoB,CACjC,CAAC,aAAa,EAAE,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,aAAa,CAAC,EACnD,GAAG,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,EACzB,GAAG,EAAE,CAAC,YAA4B,CACnC,CAAC;IAEF,uEAAuE;IACvE,qEAAqE;IACrE,yEAAyE;IACzE,qEAAqE;IACrE,oEAAoE;IACpE,sEAAsE;IACtE,qEAAqE;IACrE,0BAA0B;IAC1B,SAAS,CAAC,GAAG,EAAE;QACb,KAAK,OAAO,CAAC,KAAK,EAAE,CAAC;QACrB,OAAO,GAAG,EAAE;YACV,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEd,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC;AAC5D,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { CollabDoc } from '../docs/types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Minimal imperative API that Excalidraw exposes for programmatic control.
|
|
4
|
+
* We avoid a hard dependency on `@excalidraw/excalidraw` types — the app
|
|
5
|
+
* passes the real `ExcalidrawImperativeAPI` from its own install.
|
|
6
|
+
*/
|
|
7
|
+
export interface ExcalidrawAPIHandle {
|
|
8
|
+
onChange(cb: (elements: readonly Record<string, unknown>[]) => void): () => void;
|
|
9
|
+
updateScene(scene: {
|
|
10
|
+
elements: readonly Record<string, unknown>[];
|
|
11
|
+
}): void;
|
|
12
|
+
}
|
|
13
|
+
export interface UseExcalidrawSyncOptions {
|
|
14
|
+
/** Documento colaborativo (do `useCollabDoc`). Pode ser `null` enquanto conecta. */
|
|
15
|
+
doc: CollabDoc | null;
|
|
16
|
+
/** API imperativa do Excalidraw (`excalidrawAPI` do componente). */
|
|
17
|
+
excalidrawAPI: ExcalidrawAPIHandle | null;
|
|
18
|
+
/** Chave do editor no doc (default `'excalidraw'`). */
|
|
19
|
+
editorId?: string;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Liga um documento colaborativo à API imperativa do Excalidraw.
|
|
23
|
+
*
|
|
24
|
+
* - **Desenho local** → grava os elements no Y.Doc (replica via WebSocket).
|
|
25
|
+
* - **Mudança remota** → `updateScene` no canvas.
|
|
26
|
+
* - **Ao montar** → restaura o estado salvo do doc.
|
|
27
|
+
*
|
|
28
|
+
* ```tsx
|
|
29
|
+
* const [api, setApi] = useState(null)
|
|
30
|
+
* const { doc } = useCollabDoc({ docName: 'lousas/1' })
|
|
31
|
+
* useExcalidrawSync({ doc, excalidrawAPI: api })
|
|
32
|
+
* <Excalidraw excalidrawAPI={setApi} />
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export declare function useExcalidrawSync({ doc, excalidrawAPI, editorId, }: UseExcalidrawSyncOptions): void;
|
|
36
|
+
//# sourceMappingURL=use_excalidraw_sync.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use_excalidraw_sync.d.ts","sourceRoot":"","sources":["../../../src/hooks/use_excalidraw_sync.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAElD;;;;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,oFAAoF;IACpF,GAAG,EAAE,SAAS,GAAG,IAAI,CAAC;IACtB,oEAAoE;IACpE,aAAa,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAC1C,uDAAuD;IACvD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,GAAG,EACH,aAAa,EACb,QAAuB,GACxB,EAAE,wBAAwB,QA4C1B"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { useEffect, useMemo, useRef } from 'react';
|
|
2
|
+
import { createExcalidrawAdapter } from '../editors/excalidraw.js';
|
|
3
|
+
/**
|
|
4
|
+
* Liga um documento colaborativo à API imperativa do Excalidraw.
|
|
5
|
+
*
|
|
6
|
+
* - **Desenho local** → grava os elements no Y.Doc (replica via WebSocket).
|
|
7
|
+
* - **Mudança remota** → `updateScene` no canvas.
|
|
8
|
+
* - **Ao montar** → restaura o estado salvo do doc.
|
|
9
|
+
*
|
|
10
|
+
* ```tsx
|
|
11
|
+
* const [api, setApi] = useState(null)
|
|
12
|
+
* const { doc } = useCollabDoc({ docName: 'lousas/1' })
|
|
13
|
+
* useExcalidrawSync({ doc, excalidrawAPI: api })
|
|
14
|
+
* <Excalidraw excalidrawAPI={setApi} />
|
|
15
|
+
* ```
|
|
16
|
+
*/
|
|
17
|
+
export function useExcalidrawSync({ doc, excalidrawAPI, editorId = 'excalidraw', }) {
|
|
18
|
+
const adapter = useMemo(() => createExcalidrawAdapter(), []);
|
|
19
|
+
const view = useMemo(() => (doc ? adapter.create(doc, editorId) : null), [adapter, doc, editorId]);
|
|
20
|
+
const localFlag = useRef(null);
|
|
21
|
+
// Ao montar, carrega o estado inicial do doc no canvas.
|
|
22
|
+
useEffect(() => {
|
|
23
|
+
if (!excalidrawAPI || !view)
|
|
24
|
+
return;
|
|
25
|
+
const scene = view.state;
|
|
26
|
+
if (scene.elements.length > 0) {
|
|
27
|
+
excalidrawAPI.updateScene({
|
|
28
|
+
elements: scene.elements,
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
}, [excalidrawAPI, view]);
|
|
32
|
+
// Desenho local → escreve no doc.
|
|
33
|
+
useEffect(() => {
|
|
34
|
+
if (!excalidrawAPI || !view)
|
|
35
|
+
return;
|
|
36
|
+
const unsub = excalidrawAPI.onChange((els) => {
|
|
37
|
+
const plain = els.map((e) => ({ ...e }));
|
|
38
|
+
localFlag.current = Symbol('local');
|
|
39
|
+
view.update({ elements: plain });
|
|
40
|
+
queueMicrotask(() => {
|
|
41
|
+
localFlag.current = null;
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
return () => unsub?.();
|
|
45
|
+
}, [excalidrawAPI, view]);
|
|
46
|
+
// Mudança remota → atualiza o canvas.
|
|
47
|
+
useEffect(() => {
|
|
48
|
+
if (!doc || !excalidrawAPI || !view)
|
|
49
|
+
return;
|
|
50
|
+
const unsub = doc.onUpdate(() => {
|
|
51
|
+
if (localFlag.current || !excalidrawAPI)
|
|
52
|
+
return;
|
|
53
|
+
const scene = view.state;
|
|
54
|
+
if (scene.elements.length > 0) {
|
|
55
|
+
excalidrawAPI.updateScene({
|
|
56
|
+
elements: scene.elements,
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
return () => unsub();
|
|
61
|
+
}, [doc, excalidrawAPI, view]);
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=use_excalidraw_sync.js.map
|
|
@@ -0,0 +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;AACnD,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AAsBnE;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,iBAAiB,CAAC,EAChC,GAAG,EACH,aAAa,EACb,QAAQ,GAAG,YAAY,GACE;IACzB,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,uBAAuB,EAAE,EAAE,EAAE,CAAC,CAAC;IAC7D,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC;IACnG,MAAM,SAAS,GAAG,MAAM,CAAgB,IAAI,CAAC,CAAC;IAE9C,wDAAwD;IACxD,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI;YAAE,OAAO;QACpC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACzB,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,aAAa,CAAC,WAAW,CAAC;gBACxB,QAAQ,EAAE,KAAK,CAAC,QAA8C;aAC/D,CAAC,CAAC;QACL,CAAC;IACH,CAAC,EAAE,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC,CAAC;IAE1B,kCAAkC;IAClC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI;YAAE,OAAO;QACpC,MAAM,KAAK,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC,GAAG,EAAE,EAAE;YAC3C,MAAM,KAAK,GAAI,GAA0C,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YACjF,SAAS,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;YACpC,IAAI,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;YACjC,cAAc,CAAC,GAAG,EAAE;gBAClB,SAAS,CAAC,OAAO,GAAG,IAAI,CAAC;YAC3B,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QACH,OAAO,GAAG,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC;IACzB,CAAC,EAAE,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC,CAAC;IAE1B,sCAAsC;IACtC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,GAAG,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI;YAAE,OAAO;QAC5C,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAE;YAC9B,IAAI,SAAS,CAAC,OAAO,IAAI,CAAC,aAAa;gBAAE,OAAO;YAChD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;YACzB,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC9B,aAAa,CAAC,WAAW,CAAC;oBACxB,QAAQ,EAAE,KAAK,CAAC,QAA8C;iBAC/D,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CAAC,CAAC;QACH,OAAO,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC,EAAE,CAAC,GAAG,EAAE,aAAa,EAAE,IAAI,CAAC,CAAC,CAAC;AACjC,CAAC"}
|
package/dist/src/index.d.ts
CHANGED
|
@@ -17,6 +17,10 @@ export type { UseVersionsResult } from './hooks/use_versions.js';
|
|
|
17
17
|
export type { CollabComment, CollabPeer, CollabStatus, CollabTokenInfo, CollabTransport, CollabVersion, CollaborationClientConfig, TransportFactory, } from './types.js';
|
|
18
18
|
export { useAutomergeDoc } from './hooks/use_automerge_doc.js';
|
|
19
19
|
export type { UseAutomergeDocResult } from './hooks/use_automerge_doc.js';
|
|
20
|
+
export { useExcalidrawSync } from './hooks/use_excalidraw_sync.js';
|
|
21
|
+
export type { UseExcalidrawSyncOptions, ExcalidrawAPIHandle } from './hooks/use_excalidraw_sync.js';
|
|
22
|
+
export { ExcalidrawBoard } from './components/excalidraw_board.js';
|
|
23
|
+
export type { ExcalidrawBoardProps } from './components/excalidraw_board.js';
|
|
20
24
|
export { createExcalidrawAdapter, createTldrawAdapter, createTextAdapter, } from './editors/index.js';
|
|
21
25
|
export type { CollabEditorAdapter, CollabEditorView, ExcalidrawScene, TldrawScene, } from './editors/index.js';
|
|
22
26
|
export { useCollabEditor } from './hooks/use_collab_editor.js';
|
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;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,YAAY,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AACnE,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,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,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACnE,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,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,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;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,YAAY,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AACnE,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,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAC1E,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
CHANGED
|
@@ -10,6 +10,8 @@ export { useAwareness } from './hooks/use_awareness.js';
|
|
|
10
10
|
export { useComments } from './hooks/use_comments.js';
|
|
11
11
|
export { useVersions } from './hooks/use_versions.js';
|
|
12
12
|
export { useAutomergeDoc } from './hooks/use_automerge_doc.js';
|
|
13
|
+
export { useExcalidrawSync } from './hooks/use_excalidraw_sync.js';
|
|
14
|
+
export { ExcalidrawBoard } from './components/excalidraw_board.js';
|
|
13
15
|
export { createExcalidrawAdapter, createTldrawAdapter, createTextAdapter, } from './editors/index.js';
|
|
14
16
|
export { useCollabEditor } from './hooks/use_collab_editor.js';
|
|
15
17
|
export { YjsCollabDoc, AutomergeCollabDoc } from './docs/index.js';
|
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;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;AAEzD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAExD,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,EACL,uBAAuB,EACvB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAO5B,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAE/D,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,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;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;AAEzD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAExD,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;AAE/D,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAGzB,OAAO,KAAK,EACV,YAAY,EAEZ,eAAe,EACf,yBAAyB,EAC1B,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAGzB,OAAO,KAAK,EACV,YAAY,EAEZ,eAAe,EACf,yBAAyB,EAC1B,MAAM,YAAY,CAAC;AAcpB;;;;;;;;;GASG;AACH,qBAAa,UAAU;;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC;gBAaR,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,yBAAyB;IAM9D,IAAI,SAAS,IAAI,eAAe,GAAG,SAAS,CAE3C;IAED,IAAI,KAAK,IAAI,KAAK,GAAG,IAAI,CAExB;IAED,qEAAqE;IACrE,IAAI,MAAM,IAAI,MAAM,GAAG,SAAS,CAE/B;IAED,SAAS,IAAI,YAAY;IAIzB,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI;IAS3C,2EAA2E;IAC3E,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAuFtB,OAAO,IAAI,IAAI;CAQhB"}
|
package/dist/src/session.js
CHANGED
|
@@ -2,6 +2,16 @@ import * as Y from 'yjs';
|
|
|
2
2
|
import { fetchToken } from './rest_client.js';
|
|
3
3
|
import { defaultTransportFactory } from './transports/index.js';
|
|
4
4
|
const MAX_RECONNECT_DELAY_MS = 15_000;
|
|
5
|
+
/**
|
|
6
|
+
* Circuit breaker: depois de MAX_RECONNECT_ATTEMPTS falhas consecutivas no
|
|
7
|
+
* fetchToken (e.g. banco sem as tabelas esperadas, auth quebrada), paramos
|
|
8
|
+
* de tentar e marcamos o status como 'error'. Sem isso, o client fica
|
|
9
|
+
* num loop infinito de retry e cada tentativa dispara updates no Y.Doc
|
|
10
|
+
* que o Tiptap `Collaboration` extension escuta — em setups que ligam
|
|
11
|
+
* o editor com `forceUpdate` na mudança, isso vira React error #185
|
|
12
|
+
* (Maximum update depth exceeded) e trava a página.
|
|
13
|
+
*/
|
|
14
|
+
const MAX_RECONNECT_ATTEMPTS = 5;
|
|
5
15
|
/**
|
|
6
16
|
* Session for a single document: fetches the ephemeral token, creates the
|
|
7
17
|
* transport and exposes an observable status store (consumed via
|
|
@@ -108,6 +118,10 @@ export class DocSession {
|
|
|
108
118
|
#scheduleReconnect() {
|
|
109
119
|
if (this.#reconnectTimer || this.#destroyed)
|
|
110
120
|
return;
|
|
121
|
+
if (this.#attempt >= MAX_RECONNECT_ATTEMPTS) {
|
|
122
|
+
this.#setStatus('error', new Error(`reconnect: exceeded ${MAX_RECONNECT_ATTEMPTS} attempts`));
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
111
125
|
const delay = Math.min(1000 * 2 ** this.#attempt, MAX_RECONNECT_DELAY_MS);
|
|
112
126
|
this.#attempt += 1;
|
|
113
127
|
this.#reconnectTimer = setTimeout(() => {
|
package/dist/src/session.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AACzB,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAQhE,MAAM,sBAAsB,GAAG,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/session.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@adonis-agora/collaboration-client",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"description": "Client-side React hooks for @adonis-agora/collaboration — collaborative docs, presence, comments and versions. Part of the Agora ecosystem.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -33,7 +33,8 @@
|
|
|
33
33
|
"yjs": "^13.6.27"
|
|
34
34
|
},
|
|
35
35
|
"peerDependencies": {
|
|
36
|
-
"react": "^18.0.0 || ^19.0.0"
|
|
36
|
+
"react": "^18.0.0 || ^19.0.0",
|
|
37
|
+
"@excalidraw/excalidraw": "^0.17.6 || ^0.18.0"
|
|
37
38
|
},
|
|
38
39
|
"peerDependenciesMeta": {
|
|
39
40
|
"react": {
|