import React from 'react'; import ProgressBar from 'components/ProgressBar'; import request from 'utils/request'; class ChannelCreateForm extends React.Component { constructor (props) { super(props); this.state = { error : null, channel : '', password: '', status : null, }; this.handleChannelInput = this.handleChannelInput.bind(this); this.handleInput = this.handleInput.bind(this); this.createChannel = this.createChannel.bind(this); } cleanseChannelInput (input) { input = input.replace(/\s+/g, '-'); // replace spaces with dashes input = input.replace(/[^A-Za-z0-9-]/g, ''); // remove all characters that are not A-Z, a-z, 0-9, or '-' return input; } handleChannelInput (event) { let value = event.target.value; value = this.cleanseChannelInput(value); this.setState({channel: value}); if (value) { this.updateIsChannelAvailable(value); } else { this.setState({error: 'Please enter a channel name'}); } } handleInput (event) { const name = event.target.name; const value = event.target.value; this.setState({[name]: value}); } updateIsChannelAvailable (channel) { const channelWithAtSymbol = `@${channel}`; request(`/api/channel/availability/${channelWithAtSymbol}`) .then(() => { this.setState({'error': null}); }) .catch((error) => { this.setState({'error': error.message}); }); } checkIsChannelAvailable (channel) { const channelWithAtSymbol = `@${channel}`; return request(`/api/channel/availability/${channelWithAtSymbol}`); } checkIsPasswordProvided (password) { return new Promise((resolve, reject) => { if (!password || password.length < 1) { return reject(new Error('Please provide a password')); } resolve(); }); } makePublishChannelRequest (username, password) { const params = { method : 'POST', body : JSON.stringify({username, password}), headers: new Headers({ 'Content-Type': 'application/json', }), credentials: 'include', }; return new Promise((resolve, reject) => { request('/signup', params) .then(result => { return resolve(result); }) .catch(error => { reject(new Error(`Unfortunately, we encountered an error while creating your channel. Please let us know in Discord! ${error.message}`)); }); }); } createChannel (event) { event.preventDefault(); this.checkIsPasswordProvided(this.state.password) .then(() => { return this.checkIsChannelAvailable(this.state.channel); }) .then(() => { this.setState({status: 'We are publishing your new channel. Sit tight...'}); return this.makePublishChannelRequest(this.state.channel, this.state.password); }) .then(result => { this.setState({status: null}); this.props.onChannelLogin(result.channelName, result.shortChannelId, result.channelClaimId); }) .catch((error) => { if (error.message) { this.setState({'error': error.message, status: null}); } else { this.setState({'error': error, status: null}); }; }); } render () { return (
{ !this.state.status ? (
@ { (this.state.channel && !this.state.error) && {'\u2713'} } { this.state.error && {'\u2716'} }
{this.state.error ? (

{this.state.error}

) : (

Choose a name and password for your channel

)}
) : (

{this.state.status}

)}
); } } export default ChannelCreateForm;