move callbacks to canvas compo & refactor types

This commit is contained in:
dwelle 2023-08-10 11:17:19 +02:00
parent 2e6863cb83
commit 27ddc3d9bc
3 changed files with 34 additions and 45 deletions

View File

@ -1085,11 +1085,7 @@ class App extends React.Component<AppProps, AppState> {
}} }}
onPointerDown={(event) => this.handleCanvasPointerDown(event)} onPointerDown={(event) => this.handleCanvasPointerDown(event)}
onWheel={(event) => this.handleWheel(event)} onWheel={(event) => this.handleWheel(event)}
onContextMenu={ onContextMenu={this.handleCanvasContextMenu}
this.handleCanvasContextMenu as (
event: React.PointerEvent<HTMLDivElement>,
) => void
}
onDoubleClick={() => { onDoubleClick={() => {
this.setState({ this.setState({
editingFrame: f.id, editingFrame: f.id,
@ -1226,7 +1222,7 @@ class App extends React.Component<AppProps, AppState> {
isExporting: false, isExporting: false,
renderGrid: true, renderGrid: true,
}} }}
handleCanvasRef={this.handleCanvasRef} handleCanvasRef={this.handleStaticCanvasRef}
/> />
<InteractiveCanvas <InteractiveCanvas
canvas={this.interactiveCanvas} canvas={this.interactiveCanvas}
@ -1243,17 +1239,16 @@ class App extends React.Component<AppProps, AppState> {
this.renderInteractiveSceneCallback this.renderInteractiveSceneCallback
} }
handleCanvasRef={this.handleInteractiveCanvasRef} handleCanvasRef={this.handleInteractiveCanvasRef}
onContextMenu={ onContextMenu={this.handleCanvasContextMenu}
this.handleCanvasContextMenu as (
event: React.PointerEvent<HTMLCanvasElement>,
) => void
}
onPointerMove={this.handleCanvasPointerMove} onPointerMove={this.handleCanvasPointerMove}
onPointerUp={this.handleCanvasPointerUp} onPointerUp={this.handleCanvasPointerUp}
onPointerCancel={this.removePointer} onPointerCancel={this.removePointer}
onTouchMove={this.handleTouchMove} onTouchMove={this.handleTouchMove}
onPointerDown={this.handleCanvasPointerDown} onPointerDown={this.handleCanvasPointerDown}
onDoubleClick={this.handleCanvasDoubleClick} onDoubleClick={this.handleCanvasDoubleClick}
onWheel={this.handleWheel}
onTouchStart={this.onTouchStart}
onTouchEnd={this.onTouchEnd}
/> />
{this.renderFrameNames()} {this.renderFrameNames()}
</ExcalidrawActionManagerContext.Provider> </ExcalidrawActionManagerContext.Provider>
@ -2064,7 +2059,7 @@ class App extends React.Component<AppProps, AppState> {
didTapTwice = false; didTapTwice = false;
} }
private onTapStart = (event: TouchEvent) => { private onTouchStart = (event: React.TouchEvent) => {
// fix for Apple Pencil Scribble // fix for Apple Pencil Scribble
// On Android, preventing the event would disable contextMenu on tap-hold // On Android, preventing the event would disable contextMenu on tap-hold
if (!isAndroid) { if (!isAndroid) {
@ -2083,7 +2078,7 @@ class App extends React.Component<AppProps, AppState> {
// insert text only if we tapped twice with a single finger // insert text only if we tapped twice with a single finger
// event.touches.length === 1 will also prevent inserting text when user's zooming // event.touches.length === 1 will also prevent inserting text when user's zooming
if (didTapTwice && event.touches.length === 1) { if (didTapTwice && event.touches.length === 1) {
const [touch] = event.touches; const touch = event.touches[0];
// @ts-ignore // @ts-ignore
this.handleCanvasDoubleClick({ this.handleCanvasDoubleClick({
clientX: touch.clientX, clientX: touch.clientX,
@ -2104,7 +2099,7 @@ class App extends React.Component<AppProps, AppState> {
} }
}; };
private onTapEnd = (event: TouchEvent) => { private onTouchEnd = (event: React.TouchEvent) => {
this.resetContextMenuTimer(); this.resetContextMenuTimer();
if (event.touches.length > 0) { if (event.touches.length > 0) {
this.setState({ this.setState({
@ -7410,36 +7405,14 @@ class App extends React.Component<AppProps, AppState> {
}); });
} }
private handleInteractiveCanvasRef = (canvas: HTMLCanvasElement) => { private handleInteractiveCanvasRef = (canvas: HTMLCanvasElement | null) => {
// canvas is null when unmounting // canvas is null when unmounting
if (canvas !== null) { if (canvas !== null) {
this.interactiveCanvas = canvas; this.interactiveCanvas = canvas;
this.interactiveCanvas.addEventListener(EVENT.WHEEL, this.handleWheel, {
passive: false,
});
this.interactiveCanvas.addEventListener(
EVENT.TOUCH_START,
this.onTapStart,
);
this.interactiveCanvas.addEventListener(EVENT.TOUCH_END, this.onTapEnd);
} else {
this.interactiveCanvas?.removeEventListener(
EVENT.WHEEL,
this.handleWheel,
);
this.interactiveCanvas?.removeEventListener(
EVENT.TOUCH_START,
this.onTapStart,
);
this.interactiveCanvas?.removeEventListener(
EVENT.TOUCH_END,
this.onTapEnd,
);
} }
}; };
private handleCanvasRef = (canvas: HTMLCanvasElement) => { private handleStaticCanvasRef = (canvas: HTMLCanvasElement | null) => {
// canvas is null when unmounting // canvas is null when unmounting
if (canvas !== null) { if (canvas !== null) {
this.canvas = canvas; this.canvas = canvas;
@ -7589,13 +7562,15 @@ class App extends React.Component<AppProps, AppState> {
}; };
private handleCanvasContextMenu = ( private handleCanvasContextMenu = (
event: React.PointerEvent<HTMLElement>, event: React.MouseEvent<HTMLElement | HTMLCanvasElement>,
) => { ) => {
event.preventDefault(); event.preventDefault();
if ( if (
(event.nativeEvent.pointerType === "touch" || (("pointerType" in event.nativeEvent &&
(event.nativeEvent.pointerType === "pen" && event.nativeEvent.pointerType === "touch") ||
("pointerType" in event.nativeEvent &&
event.nativeEvent.pointerType === "pen" &&
// always allow if user uses a pen secondary button // always allow if user uses a pen secondary button
event.button !== POINTER_BUTTON.SECONDARY)) && event.button !== POINTER_BUTTON.SECONDARY)) &&
this.state.activeTool.type !== "selection" this.state.activeTool.type !== "selection"
@ -7933,7 +7908,9 @@ class App extends React.Component<AppProps, AppState> {
}; };
private handleWheel = withBatchedUpdates( private handleWheel = withBatchedUpdates(
(event: WheelEvent | React.WheelEvent<HTMLDivElement>) => { (
event: WheelEvent | React.WheelEvent<HTMLDivElement | HTMLCanvasElement>,
) => {
event.preventDefault(); event.preventDefault();
if (isPanning) { if (isPanning) {
return; return;

View File

@ -27,9 +27,9 @@ type InteractiveCanvasProps = {
renderInteractiveSceneCallback: ( renderInteractiveSceneCallback: (
data: RenderInteractiveSceneCallback, data: RenderInteractiveSceneCallback,
) => void; ) => void;
handleCanvasRef: (canvas: HTMLCanvasElement) => void; handleCanvasRef: (canvas: HTMLCanvasElement | null) => void;
onContextMenu: Exclude< onContextMenu: Exclude<
DOMAttributes<HTMLCanvasElement>["onContextMenu"], DOMAttributes<HTMLCanvasElement | HTMLDivElement>["onContextMenu"],
undefined undefined
>; >;
onPointerMove: Exclude< onPointerMove: Exclude<
@ -56,6 +56,15 @@ type InteractiveCanvasProps = {
DOMAttributes<HTMLCanvasElement>["onDoubleClick"], DOMAttributes<HTMLCanvasElement>["onDoubleClick"],
undefined undefined
>; >;
onWheel: Exclude<DOMAttributes<HTMLCanvasElement>["onWheel"], undefined>;
onTouchStart: Exclude<
DOMAttributes<HTMLCanvasElement>["onTouchStart"],
undefined
>;
onTouchEnd: Exclude<
DOMAttributes<HTMLCanvasElement>["onTouchEnd"],
undefined
>;
}; };
const InteractiveCanvas = (props: InteractiveCanvasProps) => { const InteractiveCanvas = (props: InteractiveCanvasProps) => {
@ -154,6 +163,9 @@ const InteractiveCanvas = (props: InteractiveCanvasProps) => {
onDoubleClick={ onDoubleClick={
props.appState.viewModeEnabled ? undefined : props.onDoubleClick props.appState.viewModeEnabled ? undefined : props.onDoubleClick
} }
onWheel={props.onWheel}
onTouchStart={props.onTouchStart}
onTouchEnd={props.onTouchEnd}
> >
{t("labels.drawingCanvas")} {t("labels.drawingCanvas")}
</canvas> </canvas>

View File

@ -16,7 +16,7 @@ type StaticCanvasProps = {
scale: number; scale: number;
appState: StaticCanvasAppState; appState: StaticCanvasAppState;
renderConfig: StaticCanvasRenderConfig; renderConfig: StaticCanvasRenderConfig;
handleCanvasRef: (canvas: HTMLCanvasElement) => void; handleCanvasRef: (canvas: HTMLCanvasElement | null) => void;
}; };
const StaticCanvas = (props: StaticCanvasProps) => { const StaticCanvas = (props: StaticCanvasProps) => {