use-compile-triggers.js 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  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(
  29. startCompile,
  30. setChangedAt,
  31. setSavedAt
  32. ) {
  33. const handleKeyDown = useCallback(
  34. event => {
  35. if (startCompileKeypress(event)) {
  36. event.preventDefault()
  37. startCompile()
  38. }
  39. },
  40. [startCompile]
  41. )
  42. const handleStartCompile = useCallback(() => {
  43. startCompile()
  44. }, [startCompile])
  45. useEventListener('pdf:recompile', handleStartCompile)
  46. useEffect(() => {
  47. document.body.addEventListener('keydown', handleKeyDown)
  48. return () => {
  49. document.body.removeEventListener('keydown', handleKeyDown)
  50. }
  51. }, [handleKeyDown])
  52. // record doc changes when notified by the editor
  53. const setOrTriggerChangedAt = useDetachAction(
  54. 'set-changed-at',
  55. setChangedAt,
  56. 'detacher',
  57. 'detached'
  58. )
  59. const setChangedAtHandler = useCallback(() => {
  60. setOrTriggerChangedAt(Date.now())
  61. }, [setOrTriggerChangedAt])
  62. useEventListener('doc:changed', setChangedAtHandler)
  63. // record when the server acknowledges saving changes
  64. const setOrTriggerSavedAt = useDetachAction(
  65. 'set-saved-at',
  66. setSavedAt,
  67. 'detacher',
  68. 'detached'
  69. )
  70. const setSavedAtHandler = useCallback(() => {
  71. setOrTriggerSavedAt(Date.now())
  72. }, [setOrTriggerSavedAt])
  73. useEventListener('doc:saved', setSavedAtHandler)
  74. }