Skip to content

Commit a92aa1c

Browse files
fix: file block resize handles not working with touch inputs (#1981)
1 parent 5c7bb42 commit a92aa1c

File tree

2 files changed

+65
-27
lines changed

2 files changed

+65
-27
lines changed

packages/core/src/blocks/FileBlockContent/helpers/render/createResizableFileBlockWrapper.ts

Lines changed: 41 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ export const createResizableFileBlockWrapper = (
5656

5757
// Updates the element width with an updated width depending on the cursor X
5858
// offset from when the resize began, and which resize handle is being used.
59-
const windowMouseMoveHandler = (event: MouseEvent) => {
59+
const windowMouseMoveHandler = (event: MouseEvent | TouchEvent) => {
6060
if (!resizeParams) {
6161
if (
6262
!editor.isEditable &&
@@ -72,27 +72,26 @@ export const createResizableFileBlockWrapper = (
7272

7373
let newWidth: number;
7474

75+
const clientX =
76+
"touches" in event ? event.touches[0].clientX : event.clientX;
77+
7578
if (block.props.textAlignment === "center") {
7679
if (resizeParams.handleUsed === "left") {
7780
newWidth =
7881
resizeParams.initialWidth +
79-
(resizeParams.initialClientX - event.clientX) * 2;
82+
(resizeParams.initialClientX - clientX) * 2;
8083
} else {
8184
newWidth =
8285
resizeParams.initialWidth +
83-
(event.clientX - resizeParams.initialClientX) * 2;
86+
(clientX - resizeParams.initialClientX) * 2;
8487
}
8588
} else {
8689
if (resizeParams.handleUsed === "left") {
8790
newWidth =
88-
resizeParams.initialWidth +
89-
resizeParams.initialClientX -
90-
event.clientX;
91+
resizeParams.initialWidth + resizeParams.initialClientX - clientX;
9192
} else {
9293
newWidth =
93-
resizeParams.initialWidth +
94-
event.clientX -
95-
resizeParams.initialClientX;
94+
resizeParams.initialWidth + clientX - resizeParams.initialClientX;
9695
}
9796
}
9897

@@ -109,7 +108,7 @@ export const createResizableFileBlockWrapper = (
109108
};
110109
// Stops mouse movements from resizing the element and updates the block's
111110
// `width` prop to the new value.
112-
const windowMouseUpHandler = (event: MouseEvent) => {
111+
const windowMouseUpHandler = (event: MouseEvent | TouchEvent) => {
113112
// Hides the drag handles if the cursor is no longer over the element.
114113
if (
115114
(!event.target ||
@@ -172,62 +171,90 @@ export const createResizableFileBlockWrapper = (
172171

173172
// Sets the resize params, allowing the user to begin resizing the element by
174173
// moving the cursor left or right.
175-
const leftResizeHandleMouseDownHandler = (event: MouseEvent) => {
174+
const leftResizeHandleMouseDownHandler = (event: MouseEvent | TouchEvent) => {
176175
event.preventDefault();
177176

178177
if (!wrapper.contains(eventCaptureElement)) {
179178
wrapper.appendChild(eventCaptureElement);
180179
}
181180

181+
const clientX =
182+
"touches" in event ? event.touches[0].clientX : event.clientX;
183+
182184
resizeParams = {
183185
handleUsed: "left",
184186
initialWidth: wrapper.clientWidth,
185-
initialClientX: event.clientX,
187+
initialClientX: clientX,
186188
};
187189
};
188-
const rightResizeHandleMouseDownHandler = (event: MouseEvent) => {
190+
const rightResizeHandleMouseDownHandler = (
191+
event: MouseEvent | TouchEvent,
192+
) => {
189193
event.preventDefault();
190194

191195
if (!wrapper.contains(eventCaptureElement)) {
192196
wrapper.appendChild(eventCaptureElement);
193197
}
194198

199+
const clientX =
200+
"touches" in event ? event.touches[0].clientX : event.clientX;
201+
195202
resizeParams = {
196203
handleUsed: "right",
197204
initialWidth: wrapper.clientWidth,
198-
initialClientX: event.clientX,
205+
initialClientX: clientX,
199206
};
200207
};
201208

202209
window.addEventListener("mousemove", windowMouseMoveHandler);
210+
window.addEventListener("touchmove", windowMouseMoveHandler);
203211
window.addEventListener("mouseup", windowMouseUpHandler);
212+
window.addEventListener("touchend", windowMouseUpHandler);
204213
wrapper.addEventListener("mouseenter", wrapperMouseEnterHandler);
205214
wrapper.addEventListener("mouseleave", wrapperMouseLeaveHandler);
206215
leftResizeHandle.addEventListener(
207216
"mousedown",
208217
leftResizeHandleMouseDownHandler,
209218
);
219+
leftResizeHandle.addEventListener(
220+
"touchstart",
221+
leftResizeHandleMouseDownHandler,
222+
);
210223
rightResizeHandle.addEventListener(
211224
"mousedown",
212225
rightResizeHandleMouseDownHandler,
213226
);
227+
rightResizeHandle.addEventListener(
228+
"touchstart",
229+
rightResizeHandleMouseDownHandler,
230+
);
214231

215232
return {
216233
dom: wrapper,
217234
destroy: () => {
218235
destroy?.();
219236
window.removeEventListener("mousemove", windowMouseMoveHandler);
237+
window.removeEventListener("touchmove", windowMouseMoveHandler);
220238
window.removeEventListener("mouseup", windowMouseUpHandler);
239+
window.removeEventListener("touchend", windowMouseUpHandler);
221240
wrapper.removeEventListener("mouseenter", wrapperMouseEnterHandler);
222241
wrapper.removeEventListener("mouseleave", wrapperMouseLeaveHandler);
223242
leftResizeHandle.removeEventListener(
224243
"mousedown",
225244
leftResizeHandleMouseDownHandler,
226245
);
246+
leftResizeHandle.removeEventListener(
247+
"touchstart",
248+
leftResizeHandleMouseDownHandler,
249+
);
227250
rightResizeHandle.removeEventListener(
228251
"mousedown",
229252
rightResizeHandleMouseDownHandler,
230253
);
254+
rightResizeHandle.removeEventListener(
255+
"touchstart",
256+
rightResizeHandleMouseDownHandler,
257+
);
231258
},
232259
};
233260
};

packages/react/src/blocks/FileBlockContent/helpers/render/ResizableFileBlockWrapper.tsx

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -36,30 +36,29 @@ export const ResizableFileBlockWrapper = (
3636
useEffect(() => {
3737
// Updates the child width with an updated width depending on the cursor X
3838
// offset from when the resize began, and which resize handle is being used.
39-
const windowMouseMoveHandler = (event: MouseEvent) => {
39+
const windowMouseMoveHandler = (event: MouseEvent | TouchEvent) => {
4040
let newWidth: number;
4141

42+
const clientX =
43+
"touches" in event ? event.touches[0].clientX : event.clientX;
44+
4245
if (props.block.props.textAlignment === "center") {
4346
if (resizeParams!.handleUsed === "left") {
4447
newWidth =
4548
resizeParams!.initialWidth +
46-
(resizeParams!.initialClientX - event.clientX) * 2;
49+
(resizeParams!.initialClientX - clientX) * 2;
4750
} else {
4851
newWidth =
4952
resizeParams!.initialWidth +
50-
(event.clientX - resizeParams!.initialClientX) * 2;
53+
(clientX - resizeParams!.initialClientX) * 2;
5154
}
5255
} else {
5356
if (resizeParams!.handleUsed === "left") {
5457
newWidth =
55-
resizeParams!.initialWidth +
56-
resizeParams!.initialClientX -
57-
event.clientX;
58+
resizeParams!.initialWidth + resizeParams!.initialClientX - clientX;
5859
} else {
5960
newWidth =
60-
resizeParams!.initialWidth +
61-
event.clientX -
62-
resizeParams!.initialClientX;
61+
resizeParams!.initialWidth + clientX - resizeParams!.initialClientX;
6362
}
6463
}
6564

@@ -90,12 +89,16 @@ export const ResizableFileBlockWrapper = (
9089

9190
if (resizeParams) {
9291
window.addEventListener("mousemove", windowMouseMoveHandler);
92+
window.addEventListener("touchmove", windowMouseMoveHandler);
9393
window.addEventListener("mouseup", windowMouseUpHandler);
94+
window.addEventListener("touchend", windowMouseUpHandler);
9495
}
9596

9697
return () => {
9798
window.removeEventListener("mousemove", windowMouseMoveHandler);
99+
window.removeEventListener("touchmove", windowMouseMoveHandler);
98100
window.removeEventListener("mouseup", windowMouseUpHandler);
101+
window.removeEventListener("touchend", windowMouseUpHandler);
99102
};
100103
}, [props, resizeParams, width]);
101104

@@ -115,25 +118,31 @@ export const ResizableFileBlockWrapper = (
115118
// Sets the resize params, allowing the user to begin resizing the child by
116119
// moving the cursor left or right.
117120
const leftResizeHandleMouseDownHandler = useCallback(
118-
(event: React.MouseEvent) => {
121+
(event: React.MouseEvent | React.TouchEvent) => {
119122
event.preventDefault();
120123

124+
const clientX =
125+
"touches" in event ? event.touches[0].clientX : event.clientX;
126+
121127
setResizeParams({
122128
handleUsed: "left",
123129
initialWidth: ref.current!.clientWidth,
124-
initialClientX: event.clientX,
130+
initialClientX: clientX,
125131
});
126132
},
127133
[],
128134
);
129135
const rightResizeHandleMouseDownHandler = useCallback(
130-
(event: React.MouseEvent) => {
136+
(event: React.MouseEvent | React.TouchEvent) => {
131137
event.preventDefault();
132138

139+
const clientX =
140+
"touches" in event ? event.touches[0].clientX : event.clientX;
141+
133142
setResizeParams({
134143
handleUsed: "right",
135144
initialWidth: ref.current!.clientWidth,
136-
initialClientX: event.clientX,
145+
initialClientX: clientX,
137146
});
138147
},
139148
[],
@@ -166,11 +175,13 @@ export const ResizableFileBlockWrapper = (
166175
className={"bn-resize-handle"}
167176
style={{ left: "4px" }}
168177
onMouseDown={leftResizeHandleMouseDownHandler}
178+
onTouchStart={leftResizeHandleMouseDownHandler}
169179
/>
170180
<div
171181
className={"bn-resize-handle"}
172182
style={{ right: "4px" }}
173183
onMouseDown={rightResizeHandleMouseDownHandler}
184+
onTouchStart={rightResizeHandleMouseDownHandler}
174185
/>
175186
</>
176187
)}

0 commit comments

Comments
 (0)