move callbacks to canvas compo & refactor types
This commit is contained in:
parent
2e6863cb83
commit
27ddc3d9bc
@ -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;
|
||||||
|
@ -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>
|
||||||
|
@ -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) => {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user