UNPKG

@shopify/react-form

Version:

Manage react forms tersely and safely-typed with no magic using React hooks.

75 lines (74 loc) 2.97 kB
"use strict"; 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()); }