| 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() |
|
|
| |
| const constrainedZoomOut = () => { |
| const currentZoom = getZoom() |
| const newZoom = Math.max(currentZoom - 0.1, 0.5) |
| zoomTo(newZoom) |
| } |
|
|
| |
| 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, |
| }) |
| } |
|
|