diff --git a/frontend/app/composables/useUnsavedGuard.ts b/frontend/app/composables/useUnsavedGuard.ts new file mode 100644 index 0000000..c3e3195 --- /dev/null +++ b/frontend/app/composables/useUnsavedGuard.ts @@ -0,0 +1,32 @@ +import type { Ref } from 'vue' + +export function useUnsavedGuard(isDirty: Ref) { + const { confirm } = useConfirm() + + function handleBeforeUnload(e: BeforeUnloadEvent) { + if (isDirty.value) { + e.preventDefault() + e.returnValue = '' + } + } + + onMounted(() => { + window.addEventListener('beforeunload', handleBeforeUnload) + }) + + onUnmounted(() => { + window.removeEventListener('beforeunload', handleBeforeUnload) + }) + + onBeforeRouteLeave(async () => { + if (!isDirty.value) return true + const ok = await confirm({ + title: 'Modifications non sauvegardées', + message: 'Vous avez des modifications en cours. Voulez-vous quitter sans sauvegarder ?', + confirmText: 'Quitter sans sauver', + cancelText: 'Rester', + dangerous: true, + }) + return ok + }) +}