use-compile-triggers.ts 1.8 KB

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