Files
XCDesktop/src/hooks/ui/useKeyboardShortcuts.ts
2026-03-08 01:34:54 +08:00

55 lines
1.7 KiB
TypeScript

import { useEffect } from 'react'
import type { FileItem } from '@/lib/api'
export interface UseKeyboardShortcutsParams {
selectedFile: FileItem | null
isSpecialTab: (file: FileItem | null) => boolean
isAsyncImportProcessing: boolean
isCurrentTabEditing: boolean
hasCurrentTabUnsavedChanges: boolean
handleSave: () => Promise<void>
toggleTabEdit: (path: string) => void
}
export function useKeyboardShortcuts({
selectedFile,
isSpecialTab,
isAsyncImportProcessing,
isCurrentTabEditing,
hasCurrentTabUnsavedChanges,
handleSave,
toggleTabEdit
}: UseKeyboardShortcutsParams): void {
useEffect(() => {
const handleBeforeUnload = (e: BeforeUnloadEvent) => {
if (isCurrentTabEditing && hasCurrentTabUnsavedChanges) {
e.preventDefault()
e.returnValue = ''
}
}
window.addEventListener('beforeunload', handleBeforeUnload)
return () => window.removeEventListener('beforeunload', handleBeforeUnload)
}, [isCurrentTabEditing, hasCurrentTabUnsavedChanges])
useEffect(() => {
const handleKeyDown = (e: KeyboardEvent) => {
if (isSpecialTab(selectedFile) || isAsyncImportProcessing) return
if (e.ctrlKey && e.key === 's') {
e.preventDefault()
if (isCurrentTabEditing) {
handleSave()
}
} else if (e.ctrlKey && e.key === 'e') {
e.preventDefault()
if (selectedFile) {
toggleTabEdit(selectedFile.path)
}
}
}
window.addEventListener('keydown', handleKeyDown)
return () => window.removeEventListener('keydown', handleKeyDown)
}, [selectedFile, isSpecialTab, isAsyncImportProcessing, isCurrentTabEditing, handleSave, toggleTabEdit])
}