focus-formik-error
Version:
Simple auto focus to first Formik error
63 lines (50 loc) • 8.01 kB
JavaScript
;
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.FocusError = FocusError;
var _react = _interopRequireWildcard(require("react"));
var _formik = require("formik");
var _flattenToLodashFormat = _interopRequireDefault(require("./flattenToLodashFormat"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; }
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
function FocusError(_ref) {
var _ref$formik = _ref.formik,
isSubmitting = _ref$formik.isSubmitting,
touched = _ref$formik.touched,
isValidating = _ref$formik.isValidating,
errors = _ref$formik.errors,
_ref$focusDelay = _ref.focusDelay,
focusDelay = _ref$focusDelay === void 0 ? 100 : _ref$focusDelay;
(0, _react.useEffect)(function () {
if (isSubmitting && !isValidating) {
// Flatten touched as a way to check nested keys easily and
// fix the depth problem when the error text is created
// by a React component like react-intl.
var flattedTouched = (0, _flattenToLodashFormat["default"])(touched);
var errorNames = Object.keys(flattedTouched).reduce(function (prev, key) {
if ((0, _formik.getIn)(errors, key)) {
prev.push(key);
}
return prev;
}, []);
if (errorNames.length && typeof document !== "undefined") {
var errorElement;
errorNames.forEach(function (errorKey) {
var selector = "[name=\"".concat(errorKey, "\"]");
if (!errorElement) {
errorElement = document.querySelector(selector);
return;
}
}); // This is to avoid the other components autofocus when submitting
setTimeout(function () {
errorElement && errorElement.focus();
}, focusDelay);
}
}
}, [isSubmitting, isValidating, errors, touched, focusDelay]);
return /*#__PURE__*/_react["default"].createElement(_react.Fragment, null);
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9Gb2N1c0Vycm9yLnRzeCJdLCJuYW1lcyI6WyJGb2N1c0Vycm9yIiwiZm9ybWlrIiwiaXNTdWJtaXR0aW5nIiwidG91Y2hlZCIsImlzVmFsaWRhdGluZyIsImVycm9ycyIsImZvY3VzRGVsYXkiLCJmbGF0dGVkVG91Y2hlZCIsImVycm9yTmFtZXMiLCJPYmplY3QiLCJrZXlzIiwicmVkdWNlIiwicHJldiIsImtleSIsInB1c2giLCJsZW5ndGgiLCJkb2N1bWVudCIsImVycm9yRWxlbWVudCIsImZvckVhY2giLCJlcnJvcktleSIsInNlbGVjdG9yIiwicXVlcnlTZWxlY3RvciIsInNldFRpbWVvdXQiLCJmb2N1cyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7Ozs7Ozs7O0FBc0JPLFNBQVNBLFVBQVQsT0FHYTtBQUFBLHlCQUZsQkMsTUFFa0I7QUFBQSxNQUZSQyxZQUVRLGVBRlJBLFlBRVE7QUFBQSxNQUZNQyxPQUVOLGVBRk1BLE9BRU47QUFBQSxNQUZlQyxZQUVmLGVBRmVBLFlBRWY7QUFBQSxNQUY2QkMsTUFFN0IsZUFGNkJBLE1BRTdCO0FBQUEsNkJBRGxCQyxVQUNrQjtBQUFBLE1BRGxCQSxVQUNrQixnQ0FETCxHQUNLO0FBQ2xCLHdCQUFVLFlBQU07QUFDZCxRQUFJSixZQUFZLElBQUksQ0FBQ0UsWUFBckIsRUFBbUM7QUFDakM7QUFDQTtBQUNBO0FBQ0EsVUFBTUcsY0FBYyxHQUFHLHVDQUFzQkosT0FBdEIsQ0FBdkI7QUFFQSxVQUFNSyxVQUFVLEdBQUdDLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZSCxjQUFaLEVBQTRCSSxNQUE1QixDQUFtQyxVQUFDQyxJQUFELEVBQU9DLEdBQVAsRUFBZTtBQUNuRSxZQUFJLG1CQUFNUixNQUFOLEVBQWNRLEdBQWQsQ0FBSixFQUF3QjtBQUN0QkQsVUFBQUEsSUFBSSxDQUFDRSxJQUFMLENBQVVELEdBQVY7QUFDRDs7QUFDRCxlQUFPRCxJQUFQO0FBQ0QsT0FMa0IsRUFLaEIsRUFMZ0IsQ0FBbkI7O0FBT0EsVUFBSUosVUFBVSxDQUFDTyxNQUFYLElBQXFCLE9BQU9DLFFBQVAsS0FBb0IsV0FBN0MsRUFBMEQ7QUFDeEQsWUFBSUMsWUFBSjtBQUVBVCxRQUFBQSxVQUFVLENBQUNVLE9BQVgsQ0FBbUIsVUFBQ0MsUUFBRCxFQUFjO0FBQy9CLGNBQU1DLFFBQVEscUJBQWFELFFBQWIsUUFBZDs7QUFDQSxjQUFJLENBQUNGLFlBQUwsRUFBbUI7QUFDakJBLFlBQUFBLFlBQVksR0FBR0QsUUFBUSxDQUFDSyxhQUFULENBQXVCRCxRQUF2QixDQUFmO0FBQ0E7QUFDRDtBQUNGLFNBTkQsRUFId0QsQ0FXeEQ7O0FBQ0FFLFFBQUFBLFVBQVUsQ0FBQyxZQUFNO0FBQ2ZMLFVBQUFBLFlBQVksSUFBSUEsWUFBWSxDQUFDTSxLQUFiLEVBQWhCO0FBQ0QsU0FGUyxFQUVQakIsVUFGTyxDQUFWO0FBR0Q7QUFDRjtBQUNGLEdBL0JELEVBK0JHLENBQUNKLFlBQUQsRUFBZUUsWUFBZixFQUE2QkMsTUFBN0IsRUFBcUNGLE9BQXJDLEVBQThDRyxVQUE5QyxDQS9CSDtBQWlDQSxzQkFBTyxnQ0FBQyxlQUFELE9BQVA7QUFDRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCwgeyBGcmFnbWVudCwgdXNlRWZmZWN0IH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBnZXRJbiwgRm9ybWlrQ29udGV4dFR5cGUsIEZvcm1pa1ZhbHVlcyB9IGZyb20gXCJmb3JtaWtcIjtcbmltcG9ydCBmbGF0dGVuVG9Mb2Rhc2hGb3JtYXQgZnJvbSBcIi4vZmxhdHRlblRvTG9kYXNoRm9ybWF0XCI7XG5cbi8qKlxuICogVGhpcyBjb21wb25lbnQgZm9jdXMgdGhlIGZpcnN0IGVycm9yIGluIHRoZSBGb3JtaWsgZm9ybSBhZnRlciB0aGUgdmFsaWRhdGlvbi5cbiAqIE5vdGU6IFRoZSBmaXJzdCBpcyBub3QgbmVjZXNzYXJ5IHRoZSBmaXJzdCBvbiB0aGUgc2NyZWVuLCBpdCdzIGp1c3QgdGhlIGZpcnN0XG4gKiBrZXkgaW4gdGhlIHRvdWNoZWQgb2JqZWN0LCBvcmRlciBpcyBub3QgZ3VhcmFudGVlZC5cbiAqICovXG5cbmV4cG9ydCBpbnRlcmZhY2UgRm9jdXNFcnJvclByb3BzIHtcbiAgLyoqXG4gICAqIFZhbHVlcyBmcm9tIEZvcm1payBwcm92aWRlci5cbiAgICovXG4gIGZvcm1pazogUGljazxcbiAgRm9ybWlrQ29udGV4dFR5cGU8Rm9ybWlrVmFsdWVzPixcbiAgICBcImlzU3VibWl0dGluZ1wiIHwgXCJ0b3VjaGVkXCIgfCBcImlzVmFsaWRhdGluZ1wiIHwgXCJlcnJvcnNcIlxuICA+O1xuICAvKipcbiAgICogVGltZSBpbiBtcyB0byBleGVjdXRlIHRoZSBmb2N1cyBpbiB0aGUgY29tcG9uZW50IHdpdGggdGhlIGVycm9yLCBieSBkZWZhdWx0IDEwMG1zLlxuICAgKi9cbiAgZm9jdXNEZWxheT86IG51bWJlcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEZvY3VzRXJyb3Ioe1xuICBmb3JtaWs6IHsgaXNTdWJtaXR0aW5nLCB0b3VjaGVkLCBpc1ZhbGlkYXRpbmcsIGVycm9ycyB9LFxuICBmb2N1c0RlbGF5ID0gMTAwLFxufTogRm9jdXNFcnJvclByb3BzKSB7XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGlzU3VibWl0dGluZyAmJiAhaXNWYWxpZGF0aW5nKSB7XG4gICAgICAvLyBGbGF0dGVuIHRvdWNoZWQgYXMgYSB3YXkgdG8gY2hlY2sgbmVzdGVkIGtleXMgZWFzaWx5IGFuZFxuICAgICAgLy8gZml4IHRoZSBkZXB0aCBwcm9ibGVtIHdoZW4gdGhlIGVycm9yIHRleHQgaXMgY3JlYXRlZFxuICAgICAgLy8gYnkgYSBSZWFjdCBjb21wb25lbnQgbGlrZSByZWFjdC1pbnRsLlxuICAgICAgY29uc3QgZmxhdHRlZFRvdWNoZWQgPSBmbGF0dGVuVG9Mb2Rhc2hGb3JtYXQodG91Y2hlZCk7XG5cbiAgICAgIGNvbnN0IGVycm9yTmFtZXMgPSBPYmplY3Qua2V5cyhmbGF0dGVkVG91Y2hlZCkucmVkdWNlKChwcmV2LCBrZXkpID0+IHtcbiAgICAgICAgaWYgKGdldEluKGVycm9ycywga2V5KSkge1xuICAgICAgICAgIHByZXYucHVzaChrZXkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcmV2O1xuICAgICAgfSwgW10gYXMgc3RyaW5nW10pO1xuXG4gICAgICBpZiAoZXJyb3JOYW1lcy5sZW5ndGggJiYgdHlwZW9mIGRvY3VtZW50ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIGxldCBlcnJvckVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgbnVsbDtcblxuICAgICAgICBlcnJvck5hbWVzLmZvckVhY2goKGVycm9yS2V5KSA9PiB7XG4gICAgICAgICAgY29uc3Qgc2VsZWN0b3IgPSBgW25hbWU9XCIke2Vycm9yS2V5fVwiXWA7XG4gICAgICAgICAgaWYgKCFlcnJvckVsZW1lbnQpIHtcbiAgICAgICAgICAgIGVycm9yRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gVGhpcyBpcyB0byBhdm9pZCB0aGUgb3RoZXIgY29tcG9uZW50cyBhdXRvZm9jdXMgd2hlbiBzdWJtaXR0aW5nXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGVycm9yRWxlbWVudCAmJiBlcnJvckVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfSwgZm9jdXNEZWxheSk7XG4gICAgICB9XG4gICAgfVxuICB9LCBbaXNTdWJtaXR0aW5nLCBpc1ZhbGlkYXRpbmcsIGVycm9ycywgdG91Y2hlZCwgZm9jdXNEZWxheV0pO1xuXG4gIHJldHVybiA8RnJhZ21lbnQgLz47XG59XG4iXX0=