@@ -24,12 +24,16 @@ import { ToolsMaskingOverlay } from "./tools-masking-overlay";
24
24
import { isClipboardAPIAvailable } from "@/lib/utils" ;
25
25
import {
26
26
WeaveImageToolActionOnAddedEvent ,
27
+ WeaveNode ,
27
28
WeaveNodesSelectionPlugin ,
28
29
} from "@inditextech/weave-sdk" ;
30
+ import { WeaveElementInstance } from "@inditextech/weave-types" ;
29
31
30
32
export function ToolsOverlay ( ) {
31
33
useKeyboardHandler ( ) ;
32
34
35
+ const addImageRef = React . useRef < string | null > ( null ) ;
36
+
33
37
const instance = useWeave ( ( state ) => state . instance ) ;
34
38
35
39
const room = useCollaborationRoom ( ( state ) => state . room ) ;
@@ -82,6 +86,53 @@ export function ToolsOverlay() {
82
86
} ;
83
87
} , [ instance , setCroppingImage , setCroppingNode ] ) ;
84
88
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
+
85
136
React . useEffect ( ( ) => {
86
137
const onPasteExternalImage = async ( {
87
138
position,
@@ -122,27 +173,6 @@ export function ToolsOverlay() {
122
173
return ;
123
174
}
124
175
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
-
146
176
setUploadingImage ( true ) ;
147
177
const file = new File ( [ blob ] , "external.image" ) ;
148
178
mutationUpload . mutate ( file , {
@@ -157,10 +187,13 @@ export function ToolsOverlay() {
157
187
"imageTool" ,
158
188
{
159
189
position,
190
+ forceMainContainer : true ,
160
191
imageURL : `${ process . env . NEXT_PUBLIC_API_ENDPOINT } /weavejs/rooms/${ room } /images/${ imageId } ` ,
161
192
}
162
193
// eslint-disable-next-line @typescript-eslint/no-explicit-any
163
194
) as any ;
195
+
196
+ addImageRef . current = imageId ;
164
197
} ,
165
198
onError : ( ) => {
166
199
setUploadingImage ( false ) ;
0 commit comments