Initial commit
This commit is contained in:
54
src/hooks/ui/useKeyboardShortcuts.ts
Normal file
54
src/hooks/ui/useKeyboardShortcuts.ts
Normal file
@@ -0,0 +1,54 @@
|
||||
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])
|
||||
}
|
||||
Reference in New Issue
Block a user