[NEW] Custom fields on signup (#1013)
* added custom feilds on registration * added flag as leftIcon and removed lable * added try and catch * typo
This commit is contained in:
parent
8931118032
commit
3ca1bdf7d1
|
@ -5,6 +5,8 @@ import {
|
||||||
} from 'react-native';
|
} from 'react-native';
|
||||||
import { connect } from 'react-redux';
|
import { connect } from 'react-redux';
|
||||||
import { SafeAreaView } from 'react-navigation';
|
import { SafeAreaView } from 'react-navigation';
|
||||||
|
import RNPickerSelect from 'react-native-picker-select';
|
||||||
|
import equal from 'deep-equal';
|
||||||
|
|
||||||
import TextInput from '../containers/TextInput';
|
import TextInput from '../containers/TextInput';
|
||||||
import Button from '../containers/Button';
|
import Button from '../containers/Button';
|
||||||
|
@ -17,10 +19,13 @@ import { loginRequest as loginRequestAction } from '../actions/login';
|
||||||
import isValidEmail from '../utils/isValidEmail';
|
import isValidEmail from '../utils/isValidEmail';
|
||||||
import { LegalButton } from '../containers/HeaderButton';
|
import { LegalButton } from '../containers/HeaderButton';
|
||||||
import StatusBar from '../containers/StatusBar';
|
import StatusBar from '../containers/StatusBar';
|
||||||
|
import log from '../utils/log';
|
||||||
|
|
||||||
const shouldUpdateState = ['name', 'email', 'password', 'username', 'saving'];
|
const shouldUpdateState = ['name', 'email', 'password', 'username', 'saving'];
|
||||||
|
|
||||||
@connect(null, dispatch => ({
|
@connect(state => ({
|
||||||
|
Accounts_CustomFields: state.settings.Accounts_CustomFields
|
||||||
|
}), dispatch => ({
|
||||||
loginRequest: params => dispatch(loginRequestAction(params))
|
loginRequest: params => dispatch(loginRequestAction(params))
|
||||||
}))
|
}))
|
||||||
export default class RegisterView extends React.Component {
|
export default class RegisterView extends React.Component {
|
||||||
|
@ -35,15 +40,34 @@ export default class RegisterView extends React.Component {
|
||||||
static propTypes = {
|
static propTypes = {
|
||||||
navigation: PropTypes.object,
|
navigation: PropTypes.object,
|
||||||
loginRequest: PropTypes.func,
|
loginRequest: PropTypes.func,
|
||||||
Site_Name: PropTypes.string
|
Site_Name: PropTypes.string,
|
||||||
|
Accounts_CustomFields: PropTypes.string
|
||||||
}
|
}
|
||||||
|
|
||||||
state = {
|
constructor(props) {
|
||||||
|
super(props);
|
||||||
|
const customFields = {};
|
||||||
|
this.parsedCustomFields = {};
|
||||||
|
if (props.Accounts_CustomFields) {
|
||||||
|
try {
|
||||||
|
this.parsedCustomFields = JSON.parse(props.Accounts_CustomFields);
|
||||||
|
} catch (e) {
|
||||||
|
log('err_parsing_account_custom_fields', e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Object.keys(this.parsedCustomFields).forEach((key) => {
|
||||||
|
if (this.parsedCustomFields[key].defaultValue) {
|
||||||
|
customFields[key] = this.parsedCustomFields[key].defaultValue;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
this.state = {
|
||||||
name: '',
|
name: '',
|
||||||
email: '',
|
email: '',
|
||||||
password: '',
|
password: '',
|
||||||
username: '',
|
username: '',
|
||||||
saving: false
|
saving: false,
|
||||||
|
customFields
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
componentDidMount() {
|
componentDidMount() {
|
||||||
|
@ -53,6 +77,10 @@ export default class RegisterView extends React.Component {
|
||||||
}
|
}
|
||||||
|
|
||||||
shouldComponentUpdate(nextProps, nextState) {
|
shouldComponentUpdate(nextProps, nextState) {
|
||||||
|
const { customFields } = this.state;
|
||||||
|
if (!equal(nextState.customFields, customFields)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
// eslint-disable-next-line react/destructuring-assignment
|
// eslint-disable-next-line react/destructuring-assignment
|
||||||
return shouldUpdateState.some(key => nextState[key] !== this.state[key]);
|
return shouldUpdateState.some(key => nextState[key] !== this.state[key]);
|
||||||
}
|
}
|
||||||
|
@ -77,9 +105,15 @@ export default class RegisterView extends React.Component {
|
||||||
|
|
||||||
valid = () => {
|
valid = () => {
|
||||||
const {
|
const {
|
||||||
name, email, password, username
|
name, email, password, username, customFields
|
||||||
} = this.state;
|
} = this.state;
|
||||||
return name.trim() && email.trim() && password.trim() && username.trim() && isValidEmail(email);
|
let requiredCheck = true;
|
||||||
|
Object.keys(this.parsedCustomFields).forEach((key) => {
|
||||||
|
if (this.parsedCustomFields[key].required) {
|
||||||
|
requiredCheck = requiredCheck && customFields[key] && Boolean(customFields[key].trim());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return name.trim() && email.trim() && password.trim() && username.trim() && isValidEmail(email) && requiredCheck;
|
||||||
}
|
}
|
||||||
|
|
||||||
submit = async() => {
|
submit = async() => {
|
||||||
|
@ -90,13 +124,13 @@ export default class RegisterView extends React.Component {
|
||||||
Keyboard.dismiss();
|
Keyboard.dismiss();
|
||||||
|
|
||||||
const {
|
const {
|
||||||
name, email, password, username
|
name, email, password, username, customFields
|
||||||
} = this.state;
|
} = this.state;
|
||||||
const { loginRequest } = this.props;
|
const { loginRequest } = this.props;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
await RocketChat.register({
|
await RocketChat.register({
|
||||||
name, email, pass: password, username
|
name, email, pass: password, username, ...customFields
|
||||||
});
|
});
|
||||||
await loginRequest({ user: email, password });
|
await loginRequest({ user: email, password });
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
@ -105,6 +139,64 @@ export default class RegisterView extends React.Component {
|
||||||
this.setState({ saving: false });
|
this.setState({ saving: false });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
renderCustomFields = () => {
|
||||||
|
const { customFields } = this.state;
|
||||||
|
const { Accounts_CustomFields } = this.props;
|
||||||
|
if (!Accounts_CustomFields) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
return Object.keys(this.parsedCustomFields).map((key, index, array) => {
|
||||||
|
if (this.parsedCustomFields[key].type === 'select') {
|
||||||
|
const options = this.parsedCustomFields[key].options.map(option => ({ label: option, value: option }));
|
||||||
|
return (
|
||||||
|
<RNPickerSelect
|
||||||
|
key={key}
|
||||||
|
items={options}
|
||||||
|
onValueChange={(value) => {
|
||||||
|
const newValue = {};
|
||||||
|
newValue[key] = value;
|
||||||
|
this.setState({ customFields: { ...customFields, ...newValue } });
|
||||||
|
}}
|
||||||
|
value={customFields[key]}
|
||||||
|
>
|
||||||
|
<TextInput
|
||||||
|
inputRef={(e) => { this[key] = e; }}
|
||||||
|
placeholder={key}
|
||||||
|
value={customFields[key]}
|
||||||
|
iconLeft='flag'
|
||||||
|
testID='register-view-custom-picker'
|
||||||
|
/>
|
||||||
|
</RNPickerSelect>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<TextInput
|
||||||
|
inputRef={(e) => { this[key] = e; }}
|
||||||
|
key={key}
|
||||||
|
placeholder={key}
|
||||||
|
value={customFields[key]}
|
||||||
|
iconLeft='flag'
|
||||||
|
onChangeText={(value) => {
|
||||||
|
const newValue = {};
|
||||||
|
newValue[key] = value;
|
||||||
|
this.setState({ customFields: { ...customFields, ...newValue } });
|
||||||
|
}}
|
||||||
|
onSubmitEditing={() => {
|
||||||
|
if (array.length - 1 > index) {
|
||||||
|
return this[array[index + 1]].focus();
|
||||||
|
}
|
||||||
|
this.avatarUrl.focus();
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
});
|
||||||
|
} catch (error) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
const { saving } = this.state;
|
const { saving } = this.state;
|
||||||
return (
|
return (
|
||||||
|
@ -153,6 +245,8 @@ export default class RegisterView extends React.Component {
|
||||||
containerStyle={sharedStyles.inputLastChild}
|
containerStyle={sharedStyles.inputLastChild}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
|
{this.renderCustomFields()}
|
||||||
|
|
||||||
<Button
|
<Button
|
||||||
title={I18n.t('Register')}
|
title={I18n.t('Register')}
|
||||||
type='primary'
|
type='primary'
|
||||||
|
|
Loading…
Reference in New Issue