import { computed, onScopeDispose, ref, watch, type ComputedRef, type Ref } from 'vue' import { useUnsavedWorkStore } from '@/stores/unsavedWork' interface UnsavedWorkRegistrationOptions { key: string label: ComputedRef isOpen: Ref model: T requiredPermission: ComputedRef } export function useUnsavedWorkRegistration( options: UnsavedWorkRegistrationOptions, ) { const store = useUnsavedWorkStore() const snapshot = computed(() => JSON.stringify(options.model)) const baseline = ref(snapshot.value) function sync() { if (!options.isOpen.value) { store.remove(options.key) return } store.upsert({ key: options.key, label: options.label.value, dirty: snapshot.value !== baseline.value, requiredPermission: options.requiredPermission.value, }) } function captureBaseline() { baseline.value = snapshot.value sync() } watch( [options.isOpen, snapshot, options.label, options.requiredPermission], sync, { flush: 'sync' }, ) sync() onScopeDispose(() => store.remove(options.key)) return { captureBaseline } }