import { computed, getCurrentInstance, onActivated, onScopeDispose, ref, watch, type ComputedRef, type Ref } from 'vue' import { useUnsavedWorkStore } from '@/core/unsaved-work/unsavedWork' interface UnsavedWorkRegistrationOptions { key: string label: ComputedRef isOpen: Ref model: T requiredPermission: ComputedRef } export function useUnsavedWorkRegistration( options: UnsavedWorkRegistrationOptions, ) { const store = useUnsavedWorkStore() const routeName = getCurrentInstance()?.proxy?.$route?.name const workspaceTabId = routeName === undefined || routeName === null ? null : String(routeName) const owner = Symbol(options.key) const snapshot = computed(() => JSON.stringify(options.model)) const baseline = ref(snapshot.value) store.claim(options.key, owner) function sync() { if (!options.isOpen.value) { store.remove(options.key, owner) return } store.upsert({ key: options.key, label: options.label.value, dirty: snapshot.value !== baseline.value, requiredPermission: options.requiredPermission.value, workspaceTabId, }, owner) } function captureBaseline() { baseline.value = snapshot.value sync() } watch( [options.isOpen, snapshot, options.label, options.requiredPermission], sync, { flush: 'sync' }, ) sync() onActivated(sync) onScopeDispose(() => store.release(options.key, owner)) return { captureBaseline } }