Skip to content

Commit 4a28f20

Browse files
committed
chore: update dependencies and improve images UX
1 parent 8548dd5 commit 4a28f20

File tree

4 files changed

+147
-110
lines changed

4 files changed

+147
-110
lines changed

code/components/room-components/hooks/use-context-menu.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,12 +95,14 @@ function useContextMenu() {
9595
nodes,
9696
canGroup,
9797
clickPoint,
98+
stageClickPoint,
9899
}: {
99100
actActionActive: string | undefined;
100101
canUnGroup: boolean;
101102
canGroup: boolean;
102103
nodes: WeaveSelection[];
103104
clickPoint: Vector2d;
105+
stageClickPoint: Vector2d;
104106
}): Promise<ContextMenuOption[]> => {
105107
if (!instance) return [];
106108

@@ -294,7 +296,7 @@ function useContextMenu() {
294296
const weaveCopyPasteNodesPlugin =
295297
instance.getPlugin<WeaveCopyPasteNodesPlugin>("copyPasteNodes");
296298
if (weaveCopyPasteNodesPlugin) {
297-
await weaveCopyPasteNodesPlugin.paste(clickPoint);
299+
await weaveCopyPasteNodesPlugin.paste(clickPoint, stageClickPoint);
298300
setContextMenuShow(false);
299301
}
300302
},
@@ -569,6 +571,7 @@ function useContextMenu() {
569571
selection,
570572
contextMenuPoint,
571573
clickPoint,
574+
stageClickPoint,
572575
visible,
573576
}: WeaveStageContextMenuPluginOnNodeContextMenuEvent) => {
574577
if (!instance) return;
@@ -587,6 +590,7 @@ function useContextMenu() {
587590
nodes: selection,
588591
canGroup,
589592
clickPoint,
593+
stageClickPoint,
590594
});
591595

592596
if (contextMenu.length > 0) {

code/components/room-components/overlay/tools-overlay.tsx

Lines changed: 54 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,16 @@ import { ToolsMaskingOverlay } from "./tools-masking-overlay";
2424
import { isClipboardAPIAvailable } from "@/lib/utils";
2525
import {
2626
WeaveImageToolActionOnAddedEvent,
27+
WeaveNode,
2728
WeaveNodesSelectionPlugin,
2829
} from "@inditextech/weave-sdk";
30+
import { WeaveElementInstance } from "@inditextech/weave-types";
2931

3032
export function ToolsOverlay() {
3133
useKeyboardHandler();
3234

35+
const addImageRef = React.useRef<string | null>(null);
36+
3337
const instance = useWeave((state) => state.instance);
3438

3539
const room = useCollaborationRoom((state) => state.room);
@@ -82,6 +86,53 @@ export function ToolsOverlay() {
8286
};
8387
}, [instance, setCroppingImage, setCroppingNode]);
8488

89+
React.useEffect(() => {
90+
const onAddedImageHandler = ({ nodeId }: { nodeId: string }) => {
91+
setUploadingImage(false);
92+
93+
if (!addImageRef.current) {
94+
return;
95+
}
96+
97+
const node = instance?.getStage().findOne(`#${nodeId}`);
98+
99+
if (node) {
100+
node?.x(node.x() - node.width() / 2);
101+
node?.y(node.y() - node.height() / 2);
102+
103+
const nodeHandle = instance?.getNodeHandler<WeaveNode>(
104+
node.getAttrs().nodeType
105+
);
106+
107+
if (nodeHandle) {
108+
instance?.updateNode(
109+
nodeHandle.serialize(node as WeaveElementInstance)
110+
);
111+
}
112+
113+
const selectionPlugin =
114+
instance?.getPlugin<WeaveNodesSelectionPlugin>("nodesSelection");
115+
if (selectionPlugin) {
116+
selectionPlugin.setSelectedNodes([node]);
117+
}
118+
119+
instance?.triggerAction("fitToSelectionTool", {
120+
previousAction: "selectionTool",
121+
smartZoom: true,
122+
});
123+
}
124+
};
125+
126+
instance?.addEventListener<WeaveImageToolActionOnAddedEvent>(
127+
"onAddedImage",
128+
onAddedImageHandler
129+
);
130+
131+
return () => {
132+
instance?.removeEventListener("onAddedImage", onAddedImageHandler);
133+
};
134+
}, [instance, setUploadingImage]);
135+
85136
React.useEffect(() => {
86137
const onPasteExternalImage = async ({
87138
position,
@@ -122,27 +173,6 @@ export function ToolsOverlay() {
122173
return;
123174
}
124175

125-
instance?.addEventListener<WeaveImageToolActionOnAddedEvent>(
126-
"onAddedImage",
127-
({ nodeId }) => {
128-
setUploadingImage(false);
129-
130-
const node = instance?.getStage().findOne(`#${nodeId}`);
131-
if (node) {
132-
const selectionPlugin =
133-
instance.getPlugin<WeaveNodesSelectionPlugin>("nodesSelection");
134-
if (selectionPlugin) {
135-
selectionPlugin.setSelectedNodes([node]);
136-
}
137-
138-
instance?.triggerAction("fitToSelectionTool", {
139-
previousAction: "selectionTool",
140-
smartZoom: true,
141-
});
142-
}
143-
}
144-
);
145-
146176
setUploadingImage(true);
147177
const file = new File([blob], "external.image");
148178
mutationUpload.mutate(file, {
@@ -157,10 +187,13 @@ export function ToolsOverlay() {
157187
"imageTool",
158188
{
159189
position,
190+
forceMainContainer: true,
160191
imageURL: `${process.env.NEXT_PUBLIC_API_ENDPOINT}/weavejs/rooms/${room}/images/${imageId}`,
161192
}
162193
// eslint-disable-next-line @typescript-eslint/no-explicit-any
163194
) as any;
195+
196+
addImageRef.current = imageId;
164197
},
165198
onError: () => {
166199
setUploadingImage(false);

0 commit comments

Comments
 (0)