overleaf/services/web/frontend/js/features/pdf-preview/hooks/use-compile-triggers.js

56 lines
1.6 KiB
JavaScript
Raw Normal View History

import { useCallback, useEffect } from 'react'
import { useDetachCompileContext as useCompileContext } from '../../../shared/context/detach-compile-context'
import useEventListener from '../../../shared/hooks/use-event-listener'
import useDetachAction from '../../../shared/hooks/use-detach-action'
export default function useCompileTriggers() {
const { startCompile, setChangedAt } = useCompileContext()
const handleKeyDown = useCallback(
event => {
if (event.metaKey) {
switch (event.key) {
case 's':
case 'Enter':
event.preventDefault()
startCompile()
break
}
} else if (event.ctrlKey) {
switch (event.key) {
case '.':
event.preventDefault()
startCompile()
break
}
}
},
[startCompile]
)
const handleStartCompile = useCallback(() => {
startCompile()
}, [startCompile])
useEventListener('pdf:recompile', handleStartCompile)
useEffect(() => {
document.body.addEventListener('keydown', handleKeyDown)
return () => {
document.body.removeEventListener('keydown', handleKeyDown)
}
}, [handleKeyDown])
// record doc changes when notified by the editor
const setOrTriggerChangedAt = useDetachAction(
'set-changed-at',
setChangedAt,
'detacher',
'detached'
)
const setChangedAtHandler = useCallback(() => {
setOrTriggerChangedAt(Date.now())
}, [setOrTriggerChangedAt])
useEventListener('doc:changed', setChangedAtHandler)
useEventListener('doc:saved', setChangedAtHandler) // TODO: store this separately?
}