import type { ComputedRef, Ref } from 'vue' import { computed, ref } from 'vue' export function useSavable>( data: () => T, save: (changes: Partial) => void, ): { saved: ComputedRef current: Ref reset: () => void save: () => void } { const savedValues = computed(data) const currentValues = ref({ ...data() }) as Ref const changes = computed>(() => { const values: Partial = {} const keys = Object.keys(currentValues.value) as (keyof T)[] for (const key of keys) { if (savedValues.value[key] !== currentValues.value[key]) { values[key] = currentValues.value[key] } } return values }) const reset = () => { currentValues.value = data() } const saveInternal = () => (changes.value ? save(changes.value) : {}) return { saved: savedValues, current: currentValues, reset, save: saveInternal, } }