@stackoverfloweth/vue-compositions
Version:
A collection of reusable vue compositions.
76 lines • 2.49 kB
JavaScript
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