| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- import { useCallback, useEffect } from 'react'
- import useEventListener from '../../../shared/hooks/use-event-listener'
- import useDetachAction from '../../../shared/hooks/use-detach-action'
- export const startCompileKeypress = event => {
- if (event.shiftKey || event.altKey) {
- return false
- }
- if (event.ctrlKey) {
- // Ctrl+s / Ctrl+Enter / Ctrl+.
- if (event.key === 's' || event.key === 'Enter' || event.key === '.') {
- return true
- }
- // Ctrl+s with Caps-Lock on
- if (event.key === 'S' && !event.shiftKey) {
- return true
- }
- } else if (event.metaKey) {
- // Cmd+s / Cmd+Enter
- if (event.key === 's' || event.key === 'Enter') {
- return true
- }
- // Cmd+s with Caps-Lock on
- if (event.key === 'S' && !event.shiftKey) {
- return true
- }
- }
- }
- export default function useCompileTriggers(
- startCompile,
- setChangedAt,
- setSavedAt
- ) {
- const handleKeyDown = useCallback(
- event => {
- if (startCompileKeypress(event)) {
- event.preventDefault()
- startCompile()
- }
- },
- [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)
- // record when the server acknowledges saving changes
- const setOrTriggerSavedAt = useDetachAction(
- 'set-saved-at',
- setSavedAt,
- 'detacher',
- 'detached'
- )
- const setSavedAtHandler = useCallback(() => {
- setOrTriggerSavedAt(Date.now())
- }, [setOrTriggerSavedAt])
- useEventListener('doc:saved', setSavedAtHandler)
- }
|