import React from 'react'; import { connect } from 'react-redux'; import PropTypes from 'prop-types'; import { TextInput, View, Text, Switch, TouchableOpacity, SafeAreaView } from 'react-native'; import { createChannelRequest } from '../actions/createChannel'; import styles from './Styles'; import KeyboardView from '../presentation/KeyboardView'; @connect( state => ({ result: state.createChannel, users: state.createChannel.users }), dispatch => ({ createChannel: data => dispatch(createChannelRequest(data)) }) ) export default class CreateChannelView extends React.Component { static navigationOptions = () => ({ title: 'Create a New Channel' }); static propTypes = { createChannel: PropTypes.func.isRequired, result: PropTypes.object.isRequired, users: PropTypes.array.isRequired, navigation: PropTypes.object.isRequired }; constructor(props) { super(props); this.default = { channelName: '', type: true }; this.state = this.default; } componentDidUpdate() { if (!this.adding) { return; } if (this.props.result.result && !this.props.result.failure) { this.props.navigation.navigate('Room', { room: this.props.result.result }); this.adding = false; } } submit() { this.adding = true; if (!this.state.channelName.trim() || this.props.result.isFetching) { return; } const { channelName, type = true } = this.state; let { users } = this.props; // transform users object into array of usernames users = users.map(user => user.name); // create channel this.props.createChannel({ name: channelName, users, type }); } renderChannelNameError() { if ( !this.props.result.failure || this.props.result.error.error !== 'error-duplicate-channel-name' ) { return null; } return ( <Text style={[styles.label_white, styles.label_error]}>{this.props.result.error.reason}</Text> ); } renderTypeSwitch() { return ( <View style={[styles.view_white, styles.switchContainer]}> <Switch style={[{ flexGrow: 0, flexShrink: 1 }]} value={this.state.type} onValueChange={type => this.setState({ type })} /> <Text style={[styles.label_white, styles.switchLabel]}> {this.state.type ? 'Public' : 'Private'} </Text> </View> ); } render() { return ( <KeyboardView style={[styles.defaultViewBackground, { flex: 1 }]} contentContainerStyle={styles.defaultView} > <SafeAreaView style={styles.formContainer}> <Text style={styles.label_white}>Channel Name</Text> <TextInput value={this.state.channelName} style={styles.input_white} onChangeText={channelName => this.setState({ channelName })} autoCorrect={false} returnKeyType='done' autoCapitalize='none' autoFocus // onSubmitEditing={() => this.textInput.focus()} placeholder='Type the channel name here' /> {this.renderChannelNameError()} {this.renderTypeSwitch()} <Text style={[ styles.label_white, { color: '#9ea2a8', flexGrow: 1, paddingHorizontal: 0, marginBottom: 20 } ]} > {this.state.type ? ( 'Everyone can access this channel' ) : ( 'Just invited people can access this channel' )} </Text> <TouchableOpacity onPress={() => this.submit()} style={[ styles.buttonContainer_white, this.state.channelName.length === 0 || this.props.result.isFetching ? styles.disabledButton : styles.enabledButton ]} > <Text style={styles.button_white}> {this.props.result.isFetching ? 'LOADING' : 'CREATE'}! </Text> </TouchableOpacity> </SafeAreaView> </KeyboardView> ); } }