UNPKG

@stackoverfloweth/vue-compositions

Version:

A collection of reusable vue compositions.

76 lines 2.49 kB
import { computed, inject, onUnmounted, provide, reactive } from 'vue'; export const VALIDATION_OBSERVER_INJECTION_KEY = Symbol('useValidationObserverKey'); export function useValidationObserver() { const parent = inject(VALIDATION_OBSERVER_INJECTION_KEY, undefined); const validations = reactive({}); const registrations = {}; const register = (validation) => { const unregister = parent?.register(validation); const key = Symbol(); registrations[key] = unregister; validations[key] = reactive(validation); return () => { delete validations[key]; delete registrations[key]; unregister?.(); }; }; const validate = () => { const keys = Reflect.ownKeys(validations); const promises = keys.map(key => validations[key].validate({ source: 'observer', })); return Promise.all(promises).then(results => results.every(valid => valid)); }; const pause = () => { const keys = Reflect.ownKeys(validations); for (const key of keys) { validations[key].pause(); } }; const resume = () => { const keys = Reflect.ownKeys(validations); for (const key of keys) { validations[key].resume(); } }; const reset = (resetCallback) => { const keys = Reflect.ownKeys(validations); for (const key of keys) { validations[key].reset(resetCallback); } }; const errors = computed(() => { const keys = Reflect.ownKeys(validations); return keys .map(key => validations[key].error) .filter(error => !!error); }); const pending = computed(() => { const keys = Reflect.ownKeys(validations); return keys.some(key => validations[key].pending); }); const valid = computed(() => errors.value.length === 0); const invalid = computed(() => !valid.value); onUnmounted(() => { Object.values(registrations).forEach(unregister => { if (typeof unregister === 'function') { unregister(); } }); }); const observer = { errors, valid, invalid, pending, validate, pause, resume, reset, register, }; provide(VALIDATION_OBSERVER_INJECTION_KEY, observer); return observer; } //# sourceMappingURL=useValidationObserver.js.map