All files / web/src/composables/shared useUnsavedChanges.ts

0% Statements 0/38
0% Branches 0/1
0% Functions 0/1
0% Lines 0/38

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51                                                                                                     
import { onBeforeUnmount, computed } from 'vue'
import { onBeforeRouteLeave } from 'vue-router'
import { useWorkflowStore } from '../../stores/workflowStore'
 
export function useUnsavedChanges() {
  const workflowStore = useWorkflowStore()
  
  const hasChanges = computed(() => workflowStore.hasUnsavedChanges)
 
  // Browser navigation prevention
  const handleBeforeUnload = (e: BeforeUnloadEvent) => {
    if (hasChanges.value) {
      e.preventDefault()
      e.returnValue = ''
      return ''
    }
  }
 
  // Register browser event
  window.addEventListener('beforeunload', handleBeforeUnload)
 
  // Vue Router navigation guard
  try {
    onBeforeRouteLeave((_to, _from, next) => {
      if (hasChanges.value) {
        if (window.confirm('You have unsaved changes. Are you sure you want to leave?')) {
          workflowStore.markAsSaved()
          next()
        } else {
          next(false)
        }
      } else {
        next()
      }
    })
  } catch {
    // Not in a route component, ignore
  }
 
  // Cleanup
  onBeforeUnmount(() => {
    window.removeEventListener('beforeunload', handleBeforeUnload)
  })
 
  return {
    hasChanges,
    markAsDirty: workflowStore.markAsDirty,
    markAsSaved: workflowStore.markAsSaved,
  }
}