fix: double image dialog shown on insert (#7152)

This commit is contained in:
David Luzar 2023-10-16 00:19:46 +02:00 committed by GitHub
parent 44d9d5fcac
commit aaf73c8ff3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 26 additions and 50 deletions

View File

@ -1,7 +1,7 @@
import React, { useState } from "react"; import React, { useState } from "react";
import { ActionManager } from "../actions/manager"; import { ActionManager } from "../actions/manager";
import { getNonDeletedElements } from "../element"; import { getNonDeletedElements } from "../element";
import { ExcalidrawElement, PointerType } from "../element/types"; import { ExcalidrawElement } from "../element/types";
import { t } from "../i18n"; import { t } from "../i18n";
import { useDevice } from "../components/App"; import { useDevice } from "../components/App";
import { import {
@ -213,15 +213,11 @@ export const SelectedShapeActions = ({
}; };
export const ShapesSwitcher = ({ export const ShapesSwitcher = ({
interactiveCanvas,
activeTool, activeTool,
onImageAction,
appState, appState,
app, app,
}: { }: {
interactiveCanvas: HTMLCanvasElement | null;
activeTool: UIAppState["activeTool"]; activeTool: UIAppState["activeTool"];
onImageAction: (data: { pointerType: PointerType | null }) => void;
appState: UIAppState; appState: UIAppState;
app: AppClassProperties; app: AppClassProperties;
}) => { }) => {
@ -263,9 +259,13 @@ export const ShapesSwitcher = ({
if (appState.activeTool.type !== value) { if (appState.activeTool.type !== value) {
trackEvent("toolbar", value, "ui"); trackEvent("toolbar", value, "ui");
} }
app.setActiveTool({ type: value });
if (value === "image") { if (value === "image") {
onImageAction({ pointerType }); app.setActiveTool({
type: value,
insertOnCanvasDirectly: pointerType !== "mouse",
});
} else {
app.setActiveTool({ type: value });
} }
}} }}
/> />

View File

@ -1188,7 +1188,6 @@ class App extends React.Component<AppProps, AppState> {
> >
<LayerUI <LayerUI
canvas={this.canvas} canvas={this.canvas}
interactiveCanvas={this.interactiveCanvas}
appState={this.state} appState={this.state}
files={this.files} files={this.files}
setAppState={this.setAppState} setAppState={this.setAppState}
@ -1205,7 +1204,6 @@ class App extends React.Component<AppProps, AppState> {
this.state.zenModeEnabled this.state.zenModeEnabled
} }
UIOptions={this.props.UIOptions} UIOptions={this.props.UIOptions}
onImageAction={this.onImageAction}
onExportImage={this.onExportImage} onExportImage={this.onExportImage}
renderWelcomeScreen={ renderWelcomeScreen={
!this.state.isLoading && !this.state.isLoading &&
@ -3135,9 +3133,13 @@ class App extends React.Component<AppProps, AppState> {
setActiveTool = ( setActiveTool = (
tool: tool:
| { | (
type: ToolType; | { type: Exclude<ToolType, "image"> }
} | {
type: Extract<ToolType, "image">;
insertOnCanvasDirectly?: boolean;
}
)
| { type: "custom"; customType: string }, | { type: "custom"; customType: string },
) => { ) => {
const nextActiveTool = updateActiveTool(this.state, tool); const nextActiveTool = updateActiveTool(this.state, tool);
@ -3153,7 +3155,10 @@ class App extends React.Component<AppProps, AppState> {
this.setState({ suggestedBindings: [] }); this.setState({ suggestedBindings: [] });
} }
if (nextActiveTool.type === "image") { if (nextActiveTool.type === "image") {
this.onImageAction(); this.onImageAction({
insertOnCanvasDirectly:
(tool.type === "image" && tool.insertOnCanvasDirectly) ?? false,
});
} }
this.setState((prevState) => { this.setState((prevState) => {
@ -7353,9 +7358,11 @@ class App extends React.Component<AppProps, AppState> {
} }
}; };
private onImageAction = async ( private onImageAction = async ({
{ insertOnCanvasDirectly } = { insertOnCanvasDirectly: false }, insertOnCanvasDirectly,
) => { }: {
insertOnCanvasDirectly: boolean;
}) => {
try { try {
const clientX = this.state.width / 2 + this.state.offsetLeft; const clientX = this.state.width / 2 + this.state.offsetLeft;
const clientY = this.state.height / 2 + this.state.offsetTop; const clientY = this.state.height / 2 + this.state.offsetTop;

View File

@ -62,7 +62,6 @@ interface LayerUIProps {
appState: UIAppState; appState: UIAppState;
files: BinaryFiles; files: BinaryFiles;
canvas: HTMLCanvasElement; canvas: HTMLCanvasElement;
interactiveCanvas: HTMLCanvasElement | null;
setAppState: React.Component<any, AppState>["setState"]; setAppState: React.Component<any, AppState>["setState"];
elements: readonly NonDeletedExcalidrawElement[]; elements: readonly NonDeletedExcalidrawElement[];
onLockToggle: () => void; onLockToggle: () => void;
@ -73,7 +72,6 @@ interface LayerUIProps {
renderTopRightUI?: ExcalidrawProps["renderTopRightUI"]; renderTopRightUI?: ExcalidrawProps["renderTopRightUI"];
renderCustomStats?: ExcalidrawProps["renderCustomStats"]; renderCustomStats?: ExcalidrawProps["renderCustomStats"];
UIOptions: AppProps["UIOptions"]; UIOptions: AppProps["UIOptions"];
onImageAction: (data: { insertOnCanvasDirectly: boolean }) => void;
onExportImage: AppClassProperties["onExportImage"]; onExportImage: AppClassProperties["onExportImage"];
renderWelcomeScreen: boolean; renderWelcomeScreen: boolean;
children?: React.ReactNode; children?: React.ReactNode;
@ -123,7 +121,6 @@ const LayerUI = ({
setAppState, setAppState,
elements, elements,
canvas, canvas,
interactiveCanvas,
onLockToggle, onLockToggle,
onHandToolToggle, onHandToolToggle,
onPenModeToggle, onPenModeToggle,
@ -131,7 +128,6 @@ const LayerUI = ({
renderTopRightUI, renderTopRightUI,
renderCustomStats, renderCustomStats,
UIOptions, UIOptions,
onImageAction,
onExportImage, onExportImage,
renderWelcomeScreen, renderWelcomeScreen,
children, children,
@ -280,14 +276,8 @@ const LayerUI = ({
<ShapesSwitcher <ShapesSwitcher
appState={appState} appState={appState}
interactiveCanvas={interactiveCanvas}
activeTool={appState.activeTool} activeTool={appState.activeTool}
app={app} app={app}
onImageAction={({ pointerType }) => {
onImageAction({
insertOnCanvasDirectly: pointerType !== "mouse",
});
}}
/> />
</Stack.Row> </Stack.Row>
</Island> </Island>
@ -472,8 +462,6 @@ const LayerUI = ({
onLockToggle={onLockToggle} onLockToggle={onLockToggle}
onHandToolToggle={onHandToolToggle} onHandToolToggle={onHandToolToggle}
onPenModeToggle={onPenModeToggle} onPenModeToggle={onPenModeToggle}
interactiveCanvas={interactiveCanvas}
onImageAction={onImageAction}
renderTopRightUI={renderTopRightUI} renderTopRightUI={renderTopRightUI}
renderCustomStats={renderCustomStats} renderCustomStats={renderCustomStats}
renderSidebars={renderSidebars} renderSidebars={renderSidebars}
@ -560,18 +548,8 @@ const areEqual = (prevProps: LayerUIProps, nextProps: LayerUIProps) => {
return false; return false;
} }
const { const { canvas: _pC, appState: prevAppState, ...prev } = prevProps;
canvas: _pC, const { canvas: _nC, appState: nextAppState, ...next } = nextProps;
interactiveCanvas: _pIC,
appState: prevAppState,
...prev
} = prevProps;
const {
canvas: _nC,
interactiveCanvas: _nIC,
appState: nextAppState,
...next
} = nextProps;
return ( return (
isShallowEqual( isShallowEqual(

View File

@ -36,9 +36,7 @@ type MobileMenuProps = {
onLockToggle: () => void; onLockToggle: () => void;
onHandToolToggle: () => void; onHandToolToggle: () => void;
onPenModeToggle: () => void; onPenModeToggle: () => void;
interactiveCanvas: HTMLCanvasElement | null;
onImageAction: (data: { insertOnCanvasDirectly: boolean }) => void;
renderTopRightUI?: ( renderTopRightUI?: (
isMobile: boolean, isMobile: boolean,
appState: UIAppState, appState: UIAppState,
@ -58,8 +56,7 @@ export const MobileMenu = ({
onLockToggle, onLockToggle,
onHandToolToggle, onHandToolToggle,
onPenModeToggle, onPenModeToggle,
interactiveCanvas,
onImageAction,
renderTopRightUI, renderTopRightUI,
renderCustomStats, renderCustomStats,
renderSidebars, renderSidebars,
@ -85,14 +82,8 @@ export const MobileMenu = ({
<Stack.Row gap={1}> <Stack.Row gap={1}>
<ShapesSwitcher <ShapesSwitcher
appState={appState} appState={appState}
interactiveCanvas={interactiveCanvas}
activeTool={appState.activeTool} activeTool={appState.activeTool}
app={app} app={app}
onImageAction={({ pointerType }) => {
onImageAction({
insertOnCanvasDirectly: pointerType !== "mouse",
});
}}
/> />
</Stack.Row> </Stack.Row>
</Island> </Island>