Files
Hermes-ui/packages/client/src/composables/useKeyboard.ts
T

56 lines
1.4 KiB
TypeScript
Raw Normal View History

2026-04-11 15:59:14 +08:00
import { onMounted, onUnmounted } from 'vue'
import { useRouter } from 'vue-router'
import { useChatStore } from '@/stores/hermes/chat'
2026-04-22 14:00:34 +08:00
import { useSessionSearch } from './useSessionSearch'
2026-04-11 15:59:14 +08:00
export function useKeyboard() {
const router = useRouter()
const chatStore = useChatStore()
2026-04-22 14:00:34 +08:00
const { sessionSearchOpen, openSessionSearch, closeSessionSearch } = useSessionSearch()
2026-04-11 15:59:14 +08:00
function handleKeydown(e: KeyboardEvent) {
const mod = e.ctrlKey || e.metaKey
if (mod && e.key === 'n') {
e.preventDefault()
chatStore.newChat()
2026-04-22 14:00:34 +08:00
return
2026-04-11 15:59:14 +08:00
}
if (mod && e.key === 'j') {
e.preventDefault()
router.push({ name: 'hermes.jobs' })
2026-04-22 14:00:34 +08:00
return
}
if (mod && e.key.toLowerCase() === 'k') {
if (router.currentRoute.value.name === 'login') return
e.preventDefault()
openSessionSearch()
return
2026-04-11 15:59:14 +08:00
}
if (e.key === 'Escape') {
2026-04-22 14:00:34 +08:00
if (sessionSearchOpen.value) {
e.preventDefault()
closeSessionSearch()
return
}
2026-04-11 15:59:14 +08:00
// Close any open modals — naive-ui handles this internally
const modal = document.querySelector('.n-modal-mask')
if (modal) {
const closeBtn = modal.querySelector('.n-base-close') as HTMLElement
closeBtn?.click()
}
}
}
onMounted(() => {
window.addEventListener('keydown', handleKeydown)
})
onUnmounted(() => {
window.removeEventListener('keydown', handleKeydown)
})
}