diff --git a/src/components/ChangePasswordForm.js b/src/components/ChangePasswordForm.js index 8cbd301..0e8aa83 100644 --- a/src/components/ChangePasswordForm.js +++ b/src/components/ChangePasswordForm.js @@ -142,15 +142,7 @@ export default class ChangePasswordForm extends React.Component { } }; - if (typeof element.type === 'function' && utils.containsWord(element.type.name, ['input', 'field', 'text'])) { - if (element.props && element.props.name) { - tryMapFormField(element.props.name); - } - } else if (element.type === 'input' || element.type === 'textarea') { - if (element.props.type !== 'submit') { - tryMapFormField(element.props.name); - } - } + utils.mapFormField(element, tryMapFormField); } _spIfHandler(action, element) { diff --git a/src/components/LoginForm.js b/src/components/LoginForm.js index b66ea3d..6f27fbf 100644 --- a/src/components/LoginForm.js +++ b/src/components/LoginForm.js @@ -244,15 +244,7 @@ export default class LoginForm extends React.Component { } }; - if (typeof element.type === 'function' && utils.containsWord(element.type.name, ['input', 'field', 'text'])) { - if (element.props && element.props.name) { - tryMapFormField(element.props.name); - } - } else if (['input', 'textarea'].indexOf(element.type) > -1) { - if (element.props.type !== 'submit') { - tryMapFormField(element.props.name); - } - } + utils.mapFormField(element, tryMapFormField); } _spIfHandler(action, element) { diff --git a/src/components/RegistrationForm.js b/src/components/RegistrationForm.js index 70a78d8..a18a28d 100644 --- a/src/components/RegistrationForm.js +++ b/src/components/RegistrationForm.js @@ -325,15 +325,7 @@ export default class RegistrationForm extends React.Component { } }; - if (typeof element.type === 'function' && utils.containsWord(element.type.name, ['input', 'field', 'text'])) { - if (element.props && element.props.name) { - tryMapFormField(element.props.name); - } - } else if (['input', 'textarea'].indexOf(element.type) > -1) { - if (element.props.type !== 'submit') { - tryMapFormField(element.props.name); - } - } + utils.mapFormField(element, tryMapFormField); } _spIfHandler(action, element) { diff --git a/src/components/ResetPasswordForm.js b/src/components/ResetPasswordForm.js index dc98c6d..ab4aa61 100644 --- a/src/components/ResetPasswordForm.js +++ b/src/components/ResetPasswordForm.js @@ -106,15 +106,7 @@ export default class ResetPasswordForm extends React.Component { } }; - if (typeof element.type === 'function' && utils.containsWord(element.type.name, ['input', 'field', 'text'])) { - if (element.props && element.props.name) { - tryMapFormField(element.props.name); - } - } else if (['input', 'textarea'].indexOf(element.type) > -1) { - if (element.props.type !== 'submit') { - tryMapFormField(element.props.name); - } - } + utils.mapFormField(element, tryMapFormField); } _spIfHandler(action, element) { diff --git a/src/components/UserProfileForm.js b/src/components/UserProfileForm.js index 4cb2822..1ad1f98 100644 --- a/src/components/UserProfileForm.js +++ b/src/components/UserProfileForm.js @@ -168,17 +168,7 @@ export default class UserProfileForm extends React.Component { utils.getFieldValue(this.state.defaultFields, element.props.name) : undefined; - if (typeof element.type === 'function' && utils.containsWord(element.type.name, ['input', 'field', 'text'])) { - if (element.props && element.props.name) { - tryMapField(element.props.name, defaultValue); - } - } else if (element.type === 'input') { - if (element.props.type === 'submit') { - return; - } - - tryMapField(element.props.name, defaultValue); - } + utils.mapFormField(element, tryMapField, defaultValue); } _spIfHandler(action, element) { diff --git a/src/utils.js b/src/utils.js index fb7d543..c130beb 100644 --- a/src/utils.js +++ b/src/utils.js @@ -12,7 +12,29 @@ class Utils { s4() + '-' + s4() + s4() + s4(); } + functionName(f) { + if (typeof f !== 'function') { + return ''; + } + + if (f.name) { + return f.name; + } + + const parts = f.toString().match(/^function\s*([^\s(]+)/); + + if (parts) { + return parts[1]; + } + + return ''; + } + containsWord(testWord, words) { + if (typeof testWord !== 'string') { + return false; + } + testWord = testWord.toLowerCase(); for (let i = 0; i < words.length; i++) { @@ -25,6 +47,11 @@ class Utils { return false; } + isInputLikeComponent(element, inputNames = ['input', 'field', 'text']) { + return typeof element.type === 'function' + && this.containsWord(this.functionName(element.type), inputNames); + } + takeProp(source, ...fields) { for (let i = 0; i < fields.length; i++) { let fieldName = fields[i]; @@ -116,6 +143,18 @@ class Utils { return React.cloneElement(newElement, newOptions, newChildren); } + mapFormField(element, mappingFn, defaultValue) { + if (this.isInputLikeComponent(element)) { + if (element.props && element.props.name) { + mappingFn(element.props.name, defaultValue); + } + } else if (['input', 'textarea'].indexOf(element.type) > -1) { + if (element.props.type !== 'submit') { + mappingFn(element.props.name, defaultValue); + } + } + } + getFormFieldMap(root, handler) { var fields = {};