Some checks failed
Tests / Go Tests (push) Has been cancelled
Tests / Python Tests (push) Has been cancelled
Tests / Integration Tests (push) Has been cancelled
Tests / Go Lint (push) Has been cancelled
Tests / Python Lint (push) Has been cancelled
Tests / Security Scan (push) Has been cancelled
Tests / All Checks Passed (push) Has been cancelled
Security Scanning / Secret Scanning (push) Has been cancelled
Security Scanning / Dependency Vulnerability Scan (push) Has been cancelled
Security Scanning / Go Security Scan (push) Has been cancelled
Security Scanning / Python Security Scan (push) Has been cancelled
Security Scanning / Node.js Security Scan (push) Has been cancelled
Security Scanning / Docker Image Security (push) Has been cancelled
Security Scanning / Security Summary (push) Has been cancelled
CI/CD Pipeline / Go Tests (push) Has been cancelled
CI/CD Pipeline / Python Tests (push) Has been cancelled
CI/CD Pipeline / Website Tests (push) Has been cancelled
CI/CD Pipeline / Linting (push) Has been cancelled
CI/CD Pipeline / Security Scan (push) Has been cancelled
CI/CD Pipeline / Docker Build & Push (push) Has been cancelled
CI/CD Pipeline / Integration Tests (push) Has been cancelled
CI/CD Pipeline / Deploy to Staging (push) Has been cancelled
CI/CD Pipeline / Deploy to Production (push) Has been cancelled
CI/CD Pipeline / CI Summary (push) Has been cancelled
ci/woodpecker/manual/build-ci-image Pipeline was successful
ci/woodpecker/manual/main Pipeline failed
All services: admin-v2, studio-v2, website, ai-compliance-sdk, consent-service, klausur-service, voice-service, and infrastructure. Large PDFs and compiled binaries excluded via .gitignore.
114 lines
2.8 KiB
TypeScript
114 lines
2.8 KiB
TypeScript
'use client'
|
|
|
|
import { useEffect, useCallback, useRef } from 'react'
|
|
import { KEYBOARD_SHORTCUTS } from '@/lib/companion/constants'
|
|
|
|
interface UseKeyboardShortcutsOptions {
|
|
onPauseResume?: () => void
|
|
onExtend?: () => void
|
|
onNextPhase?: () => void
|
|
onCloseModal?: () => void
|
|
onShowHelp?: () => void
|
|
enabled?: boolean
|
|
}
|
|
|
|
export function useKeyboardShortcuts({
|
|
onPauseResume,
|
|
onExtend,
|
|
onNextPhase,
|
|
onCloseModal,
|
|
onShowHelp,
|
|
enabled = true,
|
|
}: UseKeyboardShortcutsOptions) {
|
|
// Track if we're in an input field
|
|
const isInputFocused = useRef(false)
|
|
|
|
const handleKeyDown = useCallback(
|
|
(event: KeyboardEvent) => {
|
|
if (!enabled) return
|
|
|
|
// Don't trigger shortcuts when typing in inputs
|
|
const target = event.target as HTMLElement
|
|
const isInput =
|
|
target.tagName === 'INPUT' ||
|
|
target.tagName === 'TEXTAREA' ||
|
|
target.tagName === 'SELECT' ||
|
|
target.isContentEditable
|
|
|
|
if (isInput) {
|
|
isInputFocused.current = true
|
|
// Only allow Escape in inputs
|
|
if (event.key !== 'Escape') return
|
|
} else {
|
|
isInputFocused.current = false
|
|
}
|
|
|
|
// Handle shortcuts
|
|
switch (event.key) {
|
|
case KEYBOARD_SHORTCUTS.PAUSE_RESUME:
|
|
if (!isInput) {
|
|
event.preventDefault()
|
|
onPauseResume?.()
|
|
}
|
|
break
|
|
|
|
case KEYBOARD_SHORTCUTS.EXTEND_5MIN:
|
|
case KEYBOARD_SHORTCUTS.EXTEND_5MIN.toUpperCase():
|
|
if (!isInput) {
|
|
event.preventDefault()
|
|
onExtend?.()
|
|
}
|
|
break
|
|
|
|
case KEYBOARD_SHORTCUTS.NEXT_PHASE:
|
|
case KEYBOARD_SHORTCUTS.NEXT_PHASE.toUpperCase():
|
|
if (!isInput) {
|
|
event.preventDefault()
|
|
onNextPhase?.()
|
|
}
|
|
break
|
|
|
|
case KEYBOARD_SHORTCUTS.CLOSE_MODAL:
|
|
event.preventDefault()
|
|
onCloseModal?.()
|
|
break
|
|
|
|
case KEYBOARD_SHORTCUTS.SHOW_HELP:
|
|
if (!isInput) {
|
|
event.preventDefault()
|
|
onShowHelp?.()
|
|
}
|
|
break
|
|
}
|
|
},
|
|
[enabled, onPauseResume, onExtend, onNextPhase, onCloseModal, onShowHelp]
|
|
)
|
|
|
|
useEffect(() => {
|
|
if (!enabled) return
|
|
|
|
document.addEventListener('keydown', handleKeyDown)
|
|
return () => document.removeEventListener('keydown', handleKeyDown)
|
|
}, [enabled, handleKeyDown])
|
|
|
|
return {
|
|
isInputFocused: isInputFocused.current,
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Hook to display keyboard shortcut hints
|
|
*/
|
|
export function useKeyboardShortcutHints(show: boolean) {
|
|
const shortcuts = [
|
|
{ key: 'Leertaste', action: 'Pause/Fortsetzen', code: 'space' },
|
|
{ key: 'E', action: '+5 Minuten', code: 'e' },
|
|
{ key: 'N', action: 'Naechste Phase', code: 'n' },
|
|
{ key: 'Esc', action: 'Modal schliessen', code: 'escape' },
|
|
]
|
|
|
|
if (!show) return null
|
|
|
|
return shortcuts
|
|
}
|