Spaces:
Paused
Paused
| import { useReactFlow } from 'reactflow' | |
| import { useKeyPress } from 'ahooks' | |
| import { useCallback } from 'react' | |
| import { | |
| getKeyboardKeyCodeBySystem, | |
| isEventTargetInputArea, | |
| } from '../utils' | |
| import { useWorkflowHistoryStore } from '../workflow-history-store' | |
| import { useWorkflowStore } from '../store' | |
| import { | |
| useEdgesInteractions, | |
| useNodesInteractions, | |
| useNodesSyncDraft, | |
| useWorkflowMoveMode, | |
| useWorkflowOrganize, | |
| useWorkflowStartRun, | |
| } from '.' | |
| export const useShortcuts = (): void => { | |
| const { | |
| handleNodesCopy, | |
| handleNodesPaste, | |
| handleNodesDuplicate, | |
| handleNodesDelete, | |
| handleHistoryBack, | |
| handleHistoryForward, | |
| } = useNodesInteractions() | |
| const { handleStartWorkflowRun } = useWorkflowStartRun() | |
| const { shortcutsEnabled: workflowHistoryShortcutsEnabled } = useWorkflowHistoryStore() | |
| const { handleSyncWorkflowDraft } = useNodesSyncDraft() | |
| const { handleEdgeDelete } = useEdgesInteractions() | |
| const workflowStore = useWorkflowStore() | |
| const { | |
| handleModeHand, | |
| handleModePointer, | |
| } = useWorkflowMoveMode() | |
| const { handleLayout } = useWorkflowOrganize() | |
| const { | |
| zoomTo, | |
| getZoom, | |
| fitView, | |
| } = useReactFlow() | |
| // Zoom out to a minimum of 0.5 for shortcut | |
| const constrainedZoomOut = () => { | |
| const currentZoom = getZoom() | |
| const newZoom = Math.max(currentZoom - 0.1, 0.5) | |
| zoomTo(newZoom) | |
| } | |
| // Zoom in to a maximum of 1 for shortcut | |
| const constrainedZoomIn = () => { | |
| const currentZoom = getZoom() | |
| const newZoom = Math.min(currentZoom + 0.1, 1) | |
| zoomTo(newZoom) | |
| } | |
| const shouldHandleShortcut = useCallback((e: KeyboardEvent) => { | |
| const { showFeaturesPanel } = workflowStore.getState() | |
| return !showFeaturesPanel && !isEventTargetInputArea(e.target as HTMLElement) | |
| }, [workflowStore]) | |
| useKeyPress(['delete', 'backspace'], (e) => { | |
| if (shouldHandleShortcut(e)) { | |
| e.preventDefault() | |
| handleNodesDelete() | |
| handleEdgeDelete() | |
| } | |
| }) | |
| useKeyPress(`${getKeyboardKeyCodeBySystem('ctrl')}.c`, (e) => { | |
| const { showDebugAndPreviewPanel } = workflowStore.getState() | |
| if (shouldHandleShortcut(e) && !showDebugAndPreviewPanel) { | |
| e.preventDefault() | |
| handleNodesCopy() | |
| } | |
| }, { exactMatch: true, useCapture: true }) | |
| useKeyPress(`${getKeyboardKeyCodeBySystem('ctrl')}.v`, (e) => { | |
| const { showDebugAndPreviewPanel } = workflowStore.getState() | |
| if (shouldHandleShortcut(e) && !showDebugAndPreviewPanel) { | |
| e.preventDefault() | |
| handleNodesPaste() | |
| } | |
| }, { exactMatch: true, useCapture: true }) | |
| useKeyPress(`${getKeyboardKeyCodeBySystem('ctrl')}.d`, (e) => { | |
| if (shouldHandleShortcut(e)) { | |
| e.preventDefault() | |
| handleNodesDuplicate() | |
| } | |
| }, { exactMatch: true, useCapture: true }) | |
| useKeyPress(`${getKeyboardKeyCodeBySystem('alt')}.r`, (e) => { | |
| if (shouldHandleShortcut(e)) { | |
| e.preventDefault() | |
| handleStartWorkflowRun() | |
| } | |
| }, { exactMatch: true, useCapture: true }) | |
| useKeyPress(`${getKeyboardKeyCodeBySystem('ctrl')}.z`, (e) => { | |
| const { showDebugAndPreviewPanel } = workflowStore.getState() | |
| if (shouldHandleShortcut(e) && !showDebugAndPreviewPanel) { | |
| e.preventDefault() | |
| workflowHistoryShortcutsEnabled && handleHistoryBack() | |
| } | |
| }, { exactMatch: true, useCapture: true }) | |
| useKeyPress( | |
| [`${getKeyboardKeyCodeBySystem('ctrl')}.y`, `${getKeyboardKeyCodeBySystem('ctrl')}.shift.z`], | |
| (e) => { | |
| if (shouldHandleShortcut(e)) { | |
| e.preventDefault() | |
| workflowHistoryShortcutsEnabled && handleHistoryForward() | |
| } | |
| }, | |
| { exactMatch: true, useCapture: true }, | |
| ) | |
| useKeyPress('h', (e) => { | |
| if (shouldHandleShortcut(e)) { | |
| e.preventDefault() | |
| handleModeHand() | |
| } | |
| }, { | |
| exactMatch: true, | |
| useCapture: true, | |
| }) | |
| useKeyPress('v', (e) => { | |
| if (shouldHandleShortcut(e)) { | |
| e.preventDefault() | |
| handleModePointer() | |
| } | |
| }, { | |
| exactMatch: true, | |
| useCapture: true, | |
| }) | |
| useKeyPress(`${getKeyboardKeyCodeBySystem('ctrl')}.o`, (e) => { | |
| if (shouldHandleShortcut(e)) { | |
| e.preventDefault() | |
| handleLayout() | |
| } | |
| }, { exactMatch: true, useCapture: true }) | |
| useKeyPress(`${getKeyboardKeyCodeBySystem('ctrl')}.1`, (e) => { | |
| if (shouldHandleShortcut(e)) { | |
| e.preventDefault() | |
| fitView() | |
| handleSyncWorkflowDraft() | |
| } | |
| }, { | |
| exactMatch: true, | |
| useCapture: true, | |
| }) | |
| useKeyPress('shift.1', (e) => { | |
| if (shouldHandleShortcut(e)) { | |
| e.preventDefault() | |
| zoomTo(1) | |
| handleSyncWorkflowDraft() | |
| } | |
| }, { | |
| exactMatch: true, | |
| useCapture: true, | |
| }) | |
| useKeyPress('shift.5', (e) => { | |
| if (shouldHandleShortcut(e)) { | |
| e.preventDefault() | |
| zoomTo(0.5) | |
| handleSyncWorkflowDraft() | |
| } | |
| }, { | |
| exactMatch: true, | |
| useCapture: true, | |
| }) | |
| useKeyPress(`${getKeyboardKeyCodeBySystem('ctrl')}.dash`, (e) => { | |
| if (shouldHandleShortcut(e)) { | |
| e.preventDefault() | |
| constrainedZoomOut() | |
| handleSyncWorkflowDraft() | |
| } | |
| }, { | |
| exactMatch: true, | |
| useCapture: true, | |
| }) | |
| useKeyPress(`${getKeyboardKeyCodeBySystem('ctrl')}.equalsign`, (e) => { | |
| if (shouldHandleShortcut(e)) { | |
| e.preventDefault() | |
| constrainedZoomIn() | |
| handleSyncWorkflowDraft() | |
| } | |
| }, { | |
| exactMatch: true, | |
| useCapture: true, | |
| }) | |
| } | |