@undermuz/use-form
Version:
React library for build forms
150 lines (148 loc) • 4.53 kB
JavaScript
;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
// src/useForm/middlewares/send.ts
var send_exports = {};
__export(send_exports, {
createSend: () => createSend
});
module.exports = __toCommonJS(send_exports);
var import_errors = require("../errors.cjs");
var import_helpers = require("../helpers.cjs");
var import_reducer = require("../reducer.cjs");
var noop = () => {
};
var setIsSending = (value) => {
return {
type: import_reducer.FORM_ACTIONS.SET_IS_SENDING,
payload: value
};
};
var setIsCanceling = (value) => {
return {
type: import_reducer.FORM_ACTIONS.SET_IS_CANCELING,
payload: value
};
};
var setIsSuccess = (value) => {
return {
type: import_reducer.FORM_ACTIONS.SET_IS_SUCCESS,
payload: value
};
};
var setErrors = (value) => {
return {
type: import_reducer.FORM_ACTIONS.SET_ERRORS,
payload: { errors: value }
};
};
var setTouched = (value, silent = false) => {
return {
type: import_reducer.FORM_ACTIONS.SET_TOUCHED,
payload: { touched: value },
silent
};
};
var setSendError = (value) => {
return {
type: import_reducer.FORM_ACTIONS.SET_SEND_ERROR,
payload: value
};
};
var send = async (settings, store, api) => {
var _a;
const { mapServerFields, afterSendDelay, debug = false } = settings;
const state = store.getState();
const d = store.dispatch;
d(setIsSending(true));
d(setTouched(Object.keys(state.fields), true));
const [isFormInvalid, formErrors] = (0, import_helpers.isFormHasErrors)(settings, store, false);
if (debug)
console.log(
`[useForm][send][Is form valid: ${isFormInvalid ? "no" : "yes"}]`,
formErrors
);
if (isFormInvalid) {
d(setErrors(formErrors));
d(setIsCanceling(true));
setTimeout(() => {
d(setIsCanceling(false));
}, afterSendDelay);
d(setIsSending(false));
throw new import_errors.FormValidateError("Form is invalid");
}
try {
d(setSendError(null));
if (debug)
console.log(`[useForm][send][Sending]`, state.values);
const resp = await api(state.values);
if (debug)
console.log(`[useForm][send][Success]`);
d(setIsSuccess(true));
setTimeout(() => {
d(setIsSuccess(false));
}, afterSendDelay);
d(setIsSending(false));
return { response: resp, values: state.values };
} catch (error) {
const _errors = {};
let hasErrors = false;
if ((_a = error == null ? void 0 : error.__meta__) == null ? void 0 : _a.formInfo) {
const { formInfo } = error.__meta__;
if (formInfo.fieldsErrors) {
Object.keys(formInfo.fieldsErrors).forEach((fieldName) => {
var _a2;
const realFieldName = (_a2 = mapServerFields[fieldName]) != null ? _a2 : fieldName;
hasErrors = true;
_errors[realFieldName] = formInfo.fieldsErrors[fieldName];
});
}
}
if (debug) {
console.error(`[useForm][send][Fail]`, error == null ? void 0 : error.message);
console.error(error);
}
d(setSendError(error));
d(setIsCanceling(true));
setTimeout(() => {
d(setIsCanceling(false));
}, afterSendDelay);
d(setIsSending(false));
if (hasErrors) {
d(setErrors(_errors));
}
throw new import_errors.FormSendError("Request has failed", error, _errors);
}
};
var createSend = (settings) => (store) => (next) => async (action) => {
const result = next(action);
if (action.type !== import_reducer.FORM_ACTIONS.SEND_FORM) {
return result;
}
const { api, onResolve = noop, onReject = noop } = action.payload;
try {
const resp = await send(settings, store, api);
onResolve(resp);
} catch (e) {
onReject(e);
}
};
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {
createSend
});