import { AnyJson, AnyStore } from '~/types/interfaces' /** * @category Use/form * @class UseDirtyForm * Use Classe pour gérer l'apparation de message si le formulaire est dirty */ export class UseDirtyForm { private store:AnyStore private handler:any constructor (handler:any, store:AnyStore) { this.store = store this.handler = handler } /** * Composition function */ public invoke (): AnyJson { return { markFormAsDirty: () => this.markAsDirty(), markFormAsNotDirty: () => this.markAsNotDirty() } } /** * définit le formulaire comme Dirty (modifié) */ private markAsDirty () { this.store.commit('form/setDirty', true) this.addEventListener() } /** * Définit le formulaire comme non dirty (non modifié) */ private markAsNotDirty () { this.store.commit('form/setDirty', false) this.clearEventListener() } /** * Ajoute un Event avant le départ de la page */ private addEventListener () { if (process.browser) { window.addEventListener('beforeunload', this.handler) } } /** * Supprime l'Event avant le départ de la page */ private clearEventListener () { if (process.browser) { window.removeEventListener('beforeunload', this.handler) } } } function getEventHandler () { return function (e: any) { // Cancel the event e.preventDefault() // Chrome requires returnValue to be set e.returnValue = '' } } const handler = getEventHandler() export const $useDirtyForm = (store:AnyStore) => new UseDirtyForm(handler, store).invoke()