@oiij/naive-ui
Version:
Som Composable Functions And Components for Vue 3
83 lines (81 loc) • 2.39 kB
JavaScript
import { createEventHook } from "@vueuse/core";
import { reactive, ref, toRaw, toValue } from "vue";
//#region src/composables/useNaiveForm.ts
function isObject(value) {
return typeof value === "object" && value !== null && !Array.isArray(value);
}
function clearObjectValues(obj, rules) {
const { string: _string = "", number: _number = null, boolean: _boolean = false } = rules ?? {};
if (Array.isArray(obj)) {
obj.length = 0;
return obj;
}
if (typeof obj === "object" && obj !== null) {
for (const key in obj) if (Object.prototype.hasOwnProperty.call(obj, key)) obj[key] = clearObjectValues(obj[key], rules);
return obj;
}
if (typeof obj === "string") return _string;
if (typeof obj === "number") return _number;
if (typeof obj === "boolean") return _boolean;
return obj;
}
function deepMerge(target = {}, source = {}) {
for (const key in source) if (Object.prototype.hasOwnProperty.call(source, key)) {
const sourceValue = source[key];
const targetValue = target[key];
if (isObject(sourceValue) && isObject(targetValue)) deepMerge(targetValue, sourceValue);
else target[key] = sourceValue;
}
return target;
}
function useNaiveForm(value, options) {
const { rules, clearRules } = options ?? {};
const cacheValue = structuredClone(toRaw(toValue(value)));
const formValue = ref(toValue(value ?? {}));
const formRules = rules;
const formRef = ref();
const formProps = {
ref: formRef,
model: reactive(formValue.value),
rules: formRules
};
const onValidatedEvent = createEventHook();
function validate() {
return new Promise((resolve, reject) => {
if (!formRef.value) return reject(/* @__PURE__ */ new Error("useNaiveForm: formRef is not found."));
formRef.value.validate().then((res) => {
onValidatedEvent.trigger(toRaw(toValue(formValue)));
return resolve(res);
}).catch(reject);
});
}
function resetValidation() {
formRef.value?.restoreValidation();
}
function clear() {
clearObjectValues(formValue.value, clearRules);
}
function resetForm() {
clear();
const _cacheValue = structuredClone(cacheValue);
deepMerge(formValue.value, _cacheValue);
}
function reset() {
resetValidation();
resetForm();
}
return {
formRef,
formValue,
formRules,
formProps,
validate,
resetValidation,
resetForm,
reset,
clear,
onValidated: onValidatedEvent.on
};
}
//#endregion
export { useNaiveForm };