diff --git a/packages/pkg.module.board/Canvas.tsx b/packages/pkg.module.board/Canvas.tsx
index a602063e..34dc0542 100644
--- a/packages/pkg.module.board/Canvas.tsx
+++ b/packages/pkg.module.board/Canvas.tsx
@@ -6,6 +6,7 @@ import { useCanvasHandlers, useZoom } from './hooks';
import { useStage } from './providers';
import { BackgroundLayer, SelectedElementToolbar, Navbar, ZoomMenu } from './components';
import { CanvasLayer } from './CanvasLayer';
+import { useWhiteboardCollaborative } from './useWhiteboardCollaborative';
export const Canvas = () => {
const { stageRef } = useStage();
@@ -13,6 +14,8 @@ export const Canvas = () => {
const { handleOnWheel, handleMouseUp, handleMouseDown, handleMouseMove, handleDragEnd } =
useCanvasHandlers();
+ useWhiteboardCollaborative({ roomId: 'test/slate-yjs-demo' });
+
const { handleResetZoom, handleZoomIn, handleZoomOut } = useZoom(stageRef);
const boardWidth = window.innerWidth;
diff --git a/packages/pkg.module.board/CanvasLayer.tsx b/packages/pkg.module.board/CanvasLayer.tsx
index 0e8b5d80..6e8eea74 100644
--- a/packages/pkg.module.board/CanvasLayer.tsx
+++ b/packages/pkg.module.board/CanvasLayer.tsx
@@ -6,11 +6,10 @@ import { useStage } from './providers';
import { useElementHandlers, useIsStageScaling } from './hooks';
export const CanvasLayer = memo(() => {
- const { boardElements, selectedElementId, selectedTool, setSelectToolbarPosition } =
- useBoardStore();
+ const { boardElements, selectedElementId, selectedTool, updateElement } = useBoardStore();
const { layerRef, transformerRef } = useStage();
- const { onChangeTransformerPosition } = useElementHandlers();
+ const { handleTransformEnd, handleDragStart, onChangeTransformerPosition } = useElementHandlers();
const { isScaling } = useIsStageScaling();
useEffect(() => {
@@ -20,23 +19,20 @@ export const CanvasLayer = memo(() => {
transformerRef.current.nodes([selectedNode]);
transformerRef.current.getLayer()?.batchDraw();
const box = transformerRef.current.getClientRect();
- setSelectToolbarPosition({
- x: box.x,
- y: box.y,
- });
+ updateElement('toolbar', { x: box.x, y: box.y });
} else {
transformerRef.current.nodes([]);
}
} else {
transformerRef.current?.nodes([]);
}
- }, [layerRef, selectedElementId, setSelectToolbarPosition, transformerRef]);
+ }, [layerRef, selectedElementId, transformerRef, updateElement]);
useEffect(() => {
if (!isScaling && selectedElementId) {
onChangeTransformerPosition();
}
- }, [isScaling, selectedElementId, onChangeTransformerPosition]);
+ }, [isScaling, onChangeTransformerPosition, selectedElementId]);
return (
@@ -47,14 +43,16 @@ export const CanvasLayer = memo(() => {
)}
diff --git a/packages/pkg.module.board/components/SelectedElementToolbar.tsx b/packages/pkg.module.board/components/SelectedElementToolbar.tsx
index 4c4c3300..6edeeaf9 100644
--- a/packages/pkg.module.board/components/SelectedElementToolbar.tsx
+++ b/packages/pkg.module.board/components/SelectedElementToolbar.tsx
@@ -1,15 +1,52 @@
+import { useEffect, useMemo } from 'react';
import { Button } from '@xipkg/button';
import { Trash, Copy, MoreVert } from '@xipkg/icons';
import { useBoardStore } from '../store';
import { useIsStageScaling } from '../hooks';
+import { ToolbarElement } from '../types';
export const SelectedElementToolbar = () => {
- const { selectToolbarPosition, selectedTool, selectedElementId, removeElement, selectElement } =
- useBoardStore();
+ const {
+ selectedTool,
+ selectedElementId,
+ removeElement,
+ selectElement,
+ boardElements,
+ isElementTransforming,
+ selectToolbarPosition,
+ } = useBoardStore();
const { isScaling } = useIsStageScaling();
- if (!selectedElementId || selectedTool !== 'select') {
+ useEffect(() => {
+ if (!selectedElementId) {
+ removeElement('toolbar');
+ }
+ }, [removeElement, selectedElementId]);
+
+ const position = useMemo(() => {
+ if (selectToolbarPosition && (selectToolbarPosition.x !== 0 || selectToolbarPosition.y !== 0)) {
+ return selectToolbarPosition;
+ }
+
+ const toolbarElement = boardElements.find(
+ (el) => el.id === 'toolbar' && el.type === 'toolbar',
+ ) as ToolbarElement;
+
+ return toolbarElement ? { x: toolbarElement.x || 0, y: toolbarElement.y || 0 } : { x: 0, y: 0 };
+ }, [selectToolbarPosition, boardElements]);
+
+ const handleDelete = useMemo(
+ () => () => {
+ if (selectedElementId) {
+ removeElement(selectedElementId);
+ selectElement(null);
+ }
+ },
+ [selectedElementId, removeElement, selectElement],
+ );
+
+ if (!selectedElementId || selectedTool !== 'select' || isElementTransforming) {
return null;
}
@@ -17,22 +54,14 @@ export const SelectedElementToolbar = () => {
-