From e71057bdc6a4906b2dbade36d57daa5c12b444ab Mon Sep 17 00:00:00 2001 From: Craig Condon Date: Thu, 28 Dec 2023 10:26:52 -0600 Subject: [PATCH] redirect if file deleted --- libs/designer/src/domains/api/engine.ts | 1 + libs/designer/src/domains/ui/events.ts | 5 ++++ .../src/domains/ui/reducers/canvas.ts | 17 +++++++++++++ .../src/domains/ui/reducers/left-sidebar.ts | 1 + libs/designer/src/state/routes.ts | 14 ++++------- .../src/ui/logic/ContextMenu/controller.tsx | 25 ++++++++++++------- .../LeftSidebar/FileNavigator/controller.tsx | 7 +++++- 7 files changed, 51 insertions(+), 19 deletions(-) diff --git a/libs/designer/src/domains/api/engine.ts b/libs/designer/src/domains/api/engine.ts index ca963c7c6..c2d92cf09 100644 --- a/libs/designer/src/domains/api/engine.ts +++ b/libs/designer/src/domains/api/engine.ts @@ -995,6 +995,7 @@ const createEventHandler = (actions: Actions) => { case "ui/canvasMouseUp": { return handleCanvasMouseUp(newState, prevState); } + case "ui/FileNavigatorContextMenuOpened": case "ui/FileNavigatorItemClicked": { return handleFileNavigatorItemClicked(event.payload); } diff --git a/libs/designer/src/domains/ui/events.ts b/libs/designer/src/domains/ui/events.ts index d74ac4905..d9cfa9669 100644 --- a/libs/designer/src/domains/ui/events.ts +++ b/libs/designer/src/domains/ui/events.ts @@ -245,6 +245,10 @@ export type FileNavigatorItemClicked = BaseEvent< "ui/FileNavigatorItemClicked", FSItem >; +export type FileNavigatorContextMenuOpened = BaseEvent< + "ui/FileNavigatorContextMenuOpened", + FSItem +>; export type InsertElementReleased = BaseEvent<"ui/insertElementReleased", Box>; @@ -259,6 +263,7 @@ export type UIEvent = | AddLayerMenuItemClicked | BoundsChanged | CanvasResized + | FileNavigatorContextMenuOpened | ToolsLayerDrop | PromptClosed | FileNavigatorItemClicked diff --git a/libs/designer/src/domains/ui/reducers/canvas.ts b/libs/designer/src/domains/ui/reducers/canvas.ts index 7500462d1..8a78739a2 100644 --- a/libs/designer/src/domains/ui/reducers/canvas.ts +++ b/libs/designer/src/domains/ui/reducers/canvas.ts @@ -9,10 +9,14 @@ import { getTargetExprId, highlightNode, InsertMode, + newConvertToSlotPrompt, + redirect, resetCurrentDocument, } from "@paperclip-ui/designer/src/state"; import { centerTransformZoom } from "@paperclip-ui/designer/src/state/geom"; +import { routes } from "@paperclip-ui/designer/src/state/routes"; import { virtHTML } from "@paperclip-ui/proto-ext/lib/virt/html-utils"; +import { FileChangedKind } from "@paperclip-ui/proto/lib/generated/service/designer"; import produce from "immer"; import { clamp, mapValues } from "lodash"; import { @@ -60,6 +64,19 @@ export const canvasReducer = (state: DesignerState, event: DesignerEvent) => { }); } + case "designer-engine/serverEvent": { + // If current file is deleted, then direct to blank screen + if (event.payload.fileChanged?.kind === FileChangedKind.DELETED) { + if ( + event.payload.fileChanged.path.includes(getCurrentFilePath(state)) + ) { + return redirect(state, routes.editor()); + } + } + + return state; + } + case "ui/canvasMouseDown": { state = produce(state, (newState) => { newState.canvas.mouseDown = true; diff --git a/libs/designer/src/domains/ui/reducers/left-sidebar.ts b/libs/designer/src/domains/ui/reducers/left-sidebar.ts index c93679bba..8041efb67 100644 --- a/libs/designer/src/domains/ui/reducers/left-sidebar.ts +++ b/libs/designer/src/domains/ui/reducers/left-sidebar.ts @@ -91,6 +91,7 @@ export const leftSidebarReducer = ( } }); } + case "ui/FileNavigatorContextMenuOpened": case "ui/FileNavigatorItemClicked": { if (event.payload.kind === FSItemKind.File) { state = redirect( diff --git a/libs/designer/src/state/routes.ts b/libs/designer/src/state/routes.ts index 1371bc473..a53d5d26b 100644 --- a/libs/designer/src/state/routes.ts +++ b/libs/designer/src/state/routes.ts @@ -1,5 +1,5 @@ type EditorRedirectInfo = { - filePath: string; + filePath?: string; nodeId?: string; declName?: string; variantIds?: string[]; @@ -12,15 +12,11 @@ export namespace routes { nodeId, declName, variantIds = [], - }: EditorRedirectInfo) => { - const query = { - file: encodeURIComponent(filePath), - nodeId, - declName, - }; - + }: EditorRedirectInfo = {}) => { const params = new URLSearchParams(); - params.set("file", filePath); + if (filePath) { + params.set("file", filePath); + } if (nodeId) { params.set("nodeId", nodeId); } diff --git a/libs/designer/src/ui/logic/ContextMenu/controller.tsx b/libs/designer/src/ui/logic/ContextMenu/controller.tsx index 623cbdd28..5a9c8b14d 100644 --- a/libs/designer/src/ui/logic/ContextMenu/controller.tsx +++ b/libs/designer/src/ui/logic/ContextMenu/controller.tsx @@ -10,18 +10,19 @@ import { MenuItemOption, } from "../../../modules/shortcuts/base"; import { Portal } from "../Portal"; -import { getHistoryStr } from "../../../state"; +import { getHistoryStr } from "../../../state"; import { prettyKeyCombo } from "../../../domains/ui/state"; import { ContextMenuDivider, BaseContextMenuProps } from "./context-menu.pc"; export type ContextMenuProps = { children: React.ReactElement; menu: () => MenuItem[]; + onOpen?: () => void; }; export const ContextMenu = (Base: React.FC) => - ({ children, menu }: ContextMenuProps) => { + ({ children, menu, onOpen }: ContextMenuProps) => { const otherRef = useRef(); const ref = otherRef; const history = useSelector(getHistoryStr); @@ -38,6 +39,12 @@ export const ContextMenu = }); }; + useEffect(() => { + if (anchorStyle) { + onOpen?.(); + } + }, [anchorStyle]); + const onTargetKeyDown = (event: React.KeyboardEvent) => { if (children.props.onKeyDown) { children.props.onKeyDown(event); @@ -86,7 +93,7 @@ export const ContextMenu = })} {anchorStyle && ( - + {menu().map((item) => { if (item.kind === MenuItemKind.Divider) { return ; @@ -117,12 +124,12 @@ const ContextMenuOption = ({ }; return ( {label} diff --git a/libs/designer/src/ui/logic/Editor/EditorPanels/LeftSidebar/FileNavigator/controller.tsx b/libs/designer/src/ui/logic/Editor/EditorPanels/LeftSidebar/FileNavigator/controller.tsx index 3cfd1df03..e9580aabf 100644 --- a/libs/designer/src/ui/logic/Editor/EditorPanels/LeftSidebar/FileNavigator/controller.tsx +++ b/libs/designer/src/ui/logic/Editor/EditorPanels/LeftSidebar/FileNavigator/controller.tsx @@ -287,6 +287,11 @@ export const FSNavigatorItem = (Base: React.FC) => setOpen(!open); }, [open, item.path]); + const onContextMenuOpen = useCallback(() => { + dispatch({ type: "ui/FileNavigatorContextMenuOpened", payload: item }); + setOpen(true); + }, [item.path]); + useEffect(() => { if (selected) { headerRef.current?.scrollIntoView({ @@ -313,7 +318,7 @@ export const FSNavigatorItem = (Base: React.FC) => } return ( - shortcuts}> + shortcuts} onOpen={onContextMenuOpen}>