framework-entersol-web
Version:
Framework based on bootstrap 5
87 lines (73 loc) • 2.45 kB
JSX
import React from "react";
import PropTypes from "prop-types";
import eventHandler from "../../functions/event-handler";
import Field from "./field";
import NoWrapField from "./no-wrap-field";
//TODO: al cambiar parpadea la validación o.O
export default class NewPasswordField extends Field {
static jsClass = 'NewPasswordField';
static propTypes = {
...Field.propTypes,
labelRepeat: PropTypes.oneOfType([PropTypes.string, PropTypes.node]),
placeholderRepeat: PropTypes.string,
dividerClasses: PropTypes.string
}
static defaultProps = {
...Field.defaultProps,
dividerClasses: 'mb-3'
}
get type() {
return 'password';
}
componentDidMount() {
super.componentDidMount();
eventHandler.subscribe(`${this.props.name}-repeat`, this.onUpdateRepeat, this.unique);
}
componentWillUnmount() {
super.componentWillUnmount();
eventHandler.unsubscribe(`${this.props.name}-repeat`, this.unique);
}
returnData(value = this.state.value, valueRepeat = this.state.valueRepeat) {
if (value === valueRepeat) super.returnData(value);
}
onUpdateRepeat = (data) => {
this.setState(
{ valueRepeat: data[this.props.name + '-repeat'] },
() => !this.isInvalid() && this.returnData()
);
}
isInvalid(value = this.state.value, valueRepeat = this.state.valueRepeat) {
const error = super.isInvalid(value);
const diff = (value !== valueRepeat);
eventHandler.dispatch(`update.${this.props.name}-repeat`, { error: diff });
return error;
}
content(children = this.props.children) {
const { labelRepeat, placeholderRepeat, name, errorMessageRepeat, dividerClasses, inlineFields } = this.props;
const cloneFieldProps = {
...this.props,
name: name + '-repeat',
type: this.type,
label: labelRepeat,
placeholder: placeholderRepeat,
errorMessage: errorMessageRepeat,
required: true,
};
return inlineFields ? (
<div className="row">
<div className="col">{super.content(false)}</div>
<div className="col"><NoWrapField {...cloneFieldProps} /></div>
<div className="col-12">{children}</div>
</div>
) : (
<>
{super.content(false)}
<div className={dividerClasses}></div>
<div className="position-relative form-floating pass-repeat">
<NoWrapField {...cloneFieldProps} />
</div>
{children}
</>
);
}
};