use-compile-triggers.js 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. import { useCallback, useEffect } from 'react'
  2. import useEventListener from '../../../shared/hooks/use-event-listener'
  3. import useDetachAction from '../../../shared/hooks/use-detach-action'
  4. export const startCompileKeypress = event => {
  5. if (event.shiftKey || event.altKey) {
  6. return false
  7. }
  8. if (event.ctrlKey) {
  9. // Ctrl+s / Ctrl+Enter / Ctrl+.
  10. if (event.key === 's' || event.key === 'Enter' || event.key === '.') {
  11. return true
  12. }
  13. // Ctrl+s with Caps-Lock on
  14. if (event.key === 'S' && !event.shiftKey) {
  15. return true
  16. }
  17. } else if (event.metaKey) {
  18. // Cmd+s / Cmd+Enter
  19. if (event.key === 's' || event.key === 'Enter') {
  20. return true
  21. }
  22. // Cmd+s with Caps-Lock on
  23. if (event.key === 'S' && !event.shiftKey) {
  24. return true
  25. }
  26. }
  27. }
  28. export default function useCompileTriggers(startCompile, setChangedAt) {
  29. const handleKeyDown = useCallback(
  30. event => {
  31. if (startCompileKeypress(event)) {
  32. event.preventDefault()
  33. startCompile()
  34. }
  35. },
  36. [startCompile]
  37. )
  38. const handleStartCompile = useCallback(() => {
  39. startCompile()
  40. }, [startCompile])
  41. useEventListener('pdf:recompile', handleStartCompile)
  42. useEffect(() => {
  43. document.body.addEventListener('keydown', handleKeyDown)
  44. return () => {
  45. document.body.removeEventListener('keydown', handleKeyDown)
  46. }
  47. }, [handleKeyDown])
  48. // record doc changes when notified by the editor
  49. const setOrTriggerChangedAt = useDetachAction(
  50. 'set-changed-at',
  51. setChangedAt,
  52. 'detacher',
  53. 'detached'
  54. )
  55. const setChangedAtHandler = useCallback(() => {
  56. setOrTriggerChangedAt(Date.now())
  57. }, [setOrTriggerChangedAt])
  58. useEventListener('doc:changed', setChangedAtHandler)
  59. }