@shopify/react-form
Version:
Manage react forms tersely and safely-typed with no magic using React hooks.
75 lines (74 loc) • 2.97 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib");
var react_1 = require("react");
var utilities_1 = require("../utilities");
function useSubmit(onSubmit, fieldBag) {
if (onSubmit === void 0) { onSubmit = noopSubmission; }
var _a = tslib_1.__read(react_1.useState(false), 2), submitting = _a[0], setSubmitting = _a[1];
var _b = tslib_1.__read(react_1.useState([]), 2), remoteErrors = _b[0], setRemoteErrors = _b[1];
function submit(event) {
return tslib_1.__awaiter(this, void 0, void 0, function () {
var result;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
if (event && event.preventDefault && !event.defaultPrevented) {
event.preventDefault();
}
setSubmitting(true);
return [4 /*yield*/, onSubmit(getValues(fieldBag))];
case 1:
result = _a.sent();
setSubmitting(false);
if (result.status === 'fail') {
setRemoteErrors(result.errors);
}
else {
setRemoteErrors([]);
}
return [2 /*return*/];
}
});
});
}
return { submit: submit, submitting: submitting, errors: remoteErrors, setErrors: setRemoteErrors };
}
exports.useSubmit = useSubmit;
function getValues(fieldBag) {
return utilities_1.mapObject(fieldBag, function (item) {
if (utilities_1.isField(item)) {
return item.value;
}
if (Array.isArray(item)) {
return item.map(valuesOfFields);
}
return valuesOfFields(item);
});
}
function valuesOfFields(fields) {
return utilities_1.mapObject(fields, function (item) {
return item.value;
});
}
/**
* A convenience function for `onSubmit` callbacks returning values to `useSubmit` or `useForm`.
* @return Returns a `SubmitResult` representing your successful form submission.
*/
function submitSuccess() {
return { status: 'success' };
}
exports.submitSuccess = submitSuccess;
/**
* A convenience function for `onSubmit` callbacks returning values to `useSubmit` or `useForm`
* @param errors - An array of errors with the user's input. These can either include both a `fieldPath` and a `message`, in which case they will be passed down to a matching field, or just a `message`.
* @return Returns a `SubmitResult` representing your failed form submission.
*/
function submitFail(errors) {
if (errors === void 0) { errors = []; }
return { status: 'fail', errors: errors };
}
exports.submitFail = submitFail;
function noopSubmission(_) {
return Promise.resolve(submitSuccess());
}