diff --git a/src/components/App.tsx b/src/components/App.tsx index 46e8017ae..e8e2b8a5b 100644 --- a/src/components/App.tsx +++ b/src/components/App.tsx @@ -1502,6 +1502,11 @@ class App extends React.Component { // TODO follow-participant // add zoom change + + if (prevState.zoom.value !== this.state.zoom.value) { + this.props?.onZoomChange?.(this.state.zoom); + } + if ( prevState.scrollX !== this.state.scrollX || prevState.scrollY !== this.state.scrollY diff --git a/src/excalidraw-app/collab/Collab.tsx b/src/excalidraw-app/collab/Collab.tsx index 2a5b5552e..2a1554f14 100644 --- a/src/excalidraw-app/collab/Collab.tsx +++ b/src/excalidraw-app/collab/Collab.tsx @@ -90,6 +90,7 @@ export interface CollabAPI { isCollaborating: () => boolean; onPointerUpdate: CollabInstance["onPointerUpdate"]; onScrollChange: CollabInstance["onScrollChange"]; + onZoomChange: CollabInstance["onZoomChange"]; startCollaboration: CollabInstance["startCollaboration"]; stopCollaboration: CollabInstance["stopCollaboration"]; syncElements: CollabInstance["syncElements"]; @@ -164,6 +165,7 @@ class Collab extends PureComponent { isCollaborating: this.isCollaborating, onPointerUpdate: this.onPointerUpdate, onScrollChange: this.onScrollChange, + onZoomChange: this.onZoomChange, startCollaboration: this.startCollaboration, syncElements: this.syncElements, fetchImageFilesFromFirebase: this.fetchImageFilesFromFirebase, @@ -542,7 +544,7 @@ class Collab extends PureComponent { // case "ZOOM_VALUE" // if following someone, update scroll and zoom - case "SCROLL_LOCATION": + case "SCROLL_LOCATION": { const { scroll: { x, y }, } = decryptedData.payload; @@ -565,6 +567,26 @@ class Collab extends PureComponent { } break; + } + + case "ZOOM_VALUE": { + const { zoom } = decryptedData.payload; + + console.log({ decryptedData }); + + const socketId: SocketUpdateDataSource["ZOOM_VALUE"]["payload"]["socketId"] = + decryptedData.payload.socketId; + + const appState = this.excalidrawAPI.getAppState(); + + if (appState.userToFollow === socketId) { + this.excalidrawAPI.updateScene({ + appState: { zoom }, + }); + } + + break; + } case "IDLE_STATUS": { const { userState, socketId, username } = decryptedData.payload; @@ -806,6 +828,14 @@ class Collab extends PureComponent { // - onZoomChange // -- broadCastZoomValue + onZoomChange = throttle( + (payload: { + zoom: SocketUpdateDataSource["ZOOM_VALUE"]["payload"]["zoom"]; + }) => { + this.portal.socket && this.portal.broadcastZoomValue(payload); + }, + ); + onScrollChange = throttle( (payload: { scrollX: SocketUpdateDataSource["SCROLL_LOCATION"]["payload"]["scroll"]["x"]; diff --git a/src/excalidraw-app/collab/Portal.tsx b/src/excalidraw-app/collab/Portal.tsx index 209f84358..5c5ffbcf6 100644 --- a/src/excalidraw-app/collab/Portal.tsx +++ b/src/excalidraw-app/collab/Portal.tsx @@ -249,6 +249,28 @@ class Portal { ); } }; + + broadcastZoomValue = (payload: { + zoom: SocketUpdateDataSource["ZOOM_VALUE"]["payload"]["zoom"]; + }) => { + if (this.socket?.id) { + const data: SocketUpdateDataSource["ZOOM_VALUE"] = { + type: "ZOOM_VALUE", + payload: { + socketId: this.socket.id, + zoom: payload.zoom, + username: this.collab.state.username, + }, + }; + + console.log("broadcastZoomValue data", data); + + return this._broadcastSocketData( + data as SocketUpdateData, + true, // volatile + ); + } + }; } export default Portal; diff --git a/src/excalidraw-app/data/index.ts b/src/excalidraw-app/data/index.ts index c8732ff25..d036a6696 100644 --- a/src/excalidraw-app/data/index.ts +++ b/src/excalidraw-app/data/index.ts @@ -121,6 +121,14 @@ export type SocketUpdateDataSource = { username: string; }; }; + ZOOM_VALUE: { + type: "ZOOM_VALUE"; + payload: { + socketId: string; + zoom: AppState["zoom"]; + username: string; + }; + }; IDLE_STATUS: { type: "IDLE_STATUS"; payload: { diff --git a/src/excalidraw-app/index.tsx b/src/excalidraw-app/index.tsx index e48692c2b..c1304996f 100644 --- a/src/excalidraw-app/index.tsx +++ b/src/excalidraw-app/index.tsx @@ -651,6 +651,10 @@ const ExcalidrawWrapper = () => { { + console.log({ zoom }); + collabAPI?.onZoomChange({ zoom }); + }} onScrollChange={(x, y) => { // console.log({ x, y }); diff --git a/src/packages/excalidraw/index.tsx b/src/packages/excalidraw/index.tsx index 8ee2956bb..034cfd393 100644 --- a/src/packages/excalidraw/index.tsx +++ b/src/packages/excalidraw/index.tsx @@ -41,6 +41,7 @@ const ExcalidrawBase = (props: ExcalidrawProps) => { onLinkOpen, onPointerDown, onScrollChange, + onZoomChange, children, } = props; @@ -115,6 +116,7 @@ const ExcalidrawBase = (props: ExcalidrawProps) => { onLinkOpen={onLinkOpen} onPointerDown={onPointerDown} onScrollChange={onScrollChange} + onZoomChange={onZoomChange} > {children} diff --git a/src/types.ts b/src/types.ts index 3932f8df6..a6439de71 100644 --- a/src/types.ts +++ b/src/types.ts @@ -361,6 +361,7 @@ export interface ExcalidrawProps { pointerDownState: PointerDownState, ) => void; onScrollChange?: (scrollX: number, scrollY: number) => void; + onZoomChange?: (zoom: Zoom) => void; children?: React.ReactNode; }