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, } } |