mirror of
				https://github.com/langgenius/dify.git
				synced 2025-10-31 02:42:59 +00: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,
 | |
|   })
 | |
| }
 | 
