use-compile-triggers.js 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. import { useCallback, useEffect } from 'react'
  2. import { useDetachCompileContext as useCompileContext } from '../../../shared/context/detach-compile-context'
  3. import useEventListener from '../../../shared/hooks/use-event-listener'
  4. import useDetachAction from '../../../shared/hooks/use-detach-action'
  5. export default function useCompileTriggers() {
  6. const { startCompile, setChangedAt } = useCompileContext()
  7. const handleKeyDown = useCallback(
  8. event => {
  9. if (event.metaKey) {
  10. switch (event.key) {
  11. case 's':
  12. case 'Enter':
  13. event.preventDefault()
  14. startCompile()
  15. break
  16. }
  17. } else if (event.ctrlKey) {
  18. switch (event.key) {
  19. case '.':
  20. event.preventDefault()
  21. startCompile()
  22. break
  23. }
  24. }
  25. },
  26. [startCompile]
  27. )
  28. const handleStartCompile = useCallback(() => {
  29. startCompile()
  30. }, [startCompile])
  31. useEventListener('pdf:recompile', handleStartCompile)
  32. useEffect(() => {
  33. document.body.addEventListener('keydown', handleKeyDown)
  34. return () => {
  35. document.body.removeEventListener('keydown', handleKeyDown)
  36. }
  37. }, [handleKeyDown])
  38. // record doc changes when notified by the editor
  39. const setOrTriggerChangedAt = useDetachAction(
  40. 'set-changed-at',
  41. setChangedAt,
  42. 'detacher',
  43. 'detached'
  44. )
  45. const setChangedAtHandler = useCallback(() => {
  46. setOrTriggerChangedAt(Date.now())
  47. }, [setOrTriggerChangedAt])
  48. useEventListener('doc:changed', setChangedAtHandler)
  49. useEventListener('doc:saved', setChangedAtHandler) // TODO: store this separately?
  50. }