55 lines
1.7 KiB
TypeScript
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])
|
|
}
|