mirror of
https://git.mirrors.martin98.com/https://github.com/langgenius/dify.git
synced 2025-04-23 06:09:43 +08:00
203 lines
5.2 KiB
TypeScript
203 lines
5.2 KiB
TypeScript
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,
|
|
})
|
|
}
|