UNPKG

maz-ui

Version:

A standalone components library for Vue.Js 3 & Nuxt.Js 3

146 lines (145 loc) 5.12 kB
import { ref, toValue, computed, watch, provide, nextTick } from "vue"; import { g as getInstance, a as getFieldsStates, b as getFieldsErrors, c as getErrorMessages, u as updateFieldsStates, v as validateForm, C as CONFIG, s as scrollToError, h as hasModeIncludes, d as handleFieldInput } from "../chunks/dom-events.H9KIOv83.js"; function createValidationProcessor(fieldsToValidate, fieldsStates, payload, internalSchema, isSubmitted) { return () => { fieldsToValidate.forEach((name) => { const fieldState = fieldsStates.value[name]; handleFieldInput({ name, fieldState, payload: payload.value, schema: internalSchema.value, isSubmitted: isSubmitted.value, forceValidation: !0 }); }); }; } function useFormValidator({ schema, defaultValues, model, options }) { const instance = getInstance("useFormValidator"), opts = { mode: CONFIG.mode, scrollToError: CONFIG.scrollToErrorSelector, debouncedFields: null, throttledFields: null, identifier: "main-form-validator", ...options }, internalDefaultValues = ref(toValue(defaultValues)), payload = ref({ ...internalDefaultValues.value, ...model?.value }), internalSchema = ref(toValue(schema)), fieldsStates = ref( getFieldsStates({ schema: internalSchema.value, payload: payload.value, options: opts }) ), isSubmitting = ref(!1), isSubmitted = ref(!1), isValid = computed(() => { for (const key in fieldsStates.value) if (!fieldsStates.value[key].valid) return !1; return !0; }), isDirty = computed(() => { for (const key in fieldsStates.value) if (fieldsStates.value[key].dirty) return !0; return !1; }), errors = computed(() => getFieldsErrors(fieldsStates.value)), errorMessages = computed(() => getErrorMessages(errors.value, fieldsStates.value)); model && watch( payload, (newModel) => { model.value = { ...internalDefaultValues.value, ...newModel }; }, { deep: !0 } ), watch( internalDefaultValues, (newDefaultValues) => { payload.value = { ...newDefaultValues, ...payload.value }; }, { deep: !0 } ), watch( internalSchema, (schema2) => { updateFieldsStates({ schema: schema2, fieldsStates: fieldsStates.value, payload: payload.value, options: opts }), internalValidateForm(); }, { deep: !0 } ), internalValidateForm(); function internalValidateForm(setErrors = opts.mode === "aggressive") { return validateForm({ fieldsStates: fieldsStates.value, payload: payload.value, schema: internalSchema.value, setErrors }); } let payloadWatchStop = null; function setupOptimizedWatch() { payloadWatchStop && payloadWatchStop(); const payloadSnapshot = computed(() => { const snapshot = {}; for (const key of Object.keys(internalSchema.value)) snapshot[key] = payload.value[key]; return snapshot; }); payloadWatchStop = watch( payloadSnapshot, (newSnapshot, oldSnapshot) => { const fieldsToValidate = Object.keys(internalSchema.value).filter((name) => { const fieldState = fieldsStates.value[name]; return fieldState && newSnapshot[name] !== oldSnapshot?.[name] && hasModeIncludes(["aggressive", "lazy", "progressive"], fieldState.mode); }); if (fieldsToValidate.length > 0) { const processValidations = createValidationProcessor( fieldsToValidate, fieldsStates, payload, internalSchema, isSubmitted ); typeof requestIdleCallback < "u" ? requestIdleCallback(processValidations, { timeout: 100 }) : nextTick(processValidations); } }, { deep: !0 } ); } function handleSubmit(successCallback, enableScrollOrSelector) { return async (event) => { if (event?.preventDefault(), !isSubmitting.value) { isSubmitted.value = !0, isSubmitting.value = !0; try { await internalValidateForm(!0); const scrollToErrorParam = typeof enableScrollOrSelector == "string" ? enableScrollOrSelector : opts.scrollToError; let response; return isValid.value ? response = await successCallback(payload.value) : typeof scrollToErrorParam != "boolean" && scrollToError(scrollToErrorParam), isSubmitting.value = !1, response; } finally { isSubmitting.value = !1; } } }; } const context = { fieldsStates, payload, options: opts, internalSchema, errorMessages, isSubmitted }; return instance.formContexts ??= /* @__PURE__ */ new Map(), instance.formContexts.set(opts.identifier, context), provide(opts.identifier, context), setupOptimizedWatch(), { identifier: opts.identifier, isDirty, isSubmitting, isSubmitted, isValid, errors, model: payload, fieldsStates, validateForm: internalValidateForm, scrollToError, handleSubmit, errorMessages }; } export { useFormValidator };