fixed the channel creation error notices

This commit is contained in:
bill bittner 2018-01-12 12:48:24 -08:00
parent edc4ee24f2
commit ac5d95f674
4 changed files with 102 additions and 54 deletions

View file

@ -17,7 +17,9 @@ class ChannelCreateForm extends React.Component {
this.cleanseChannelInput = this.cleanseChannelInput.bind(this); this.cleanseChannelInput = this.cleanseChannelInput.bind(this);
this.handleChannelInput = this.handleChannelInput.bind(this); this.handleChannelInput = this.handleChannelInput.bind(this);
this.handleInput = this.handleInput.bind(this); this.handleInput = this.handleInput.bind(this);
this.checkChannelIsAvailable = this.checkChannelIsAvailable.bind(this); this.updateIsChannelAvailable = this.updateIsChannelAvailable.bind(this);
this.checkIsChannelAvailable = this.checkIsChannelAvailable.bind(this);
this.checkIsPasswordProvided = this.checkIsPasswordProvided.bind(this);
this.createChannel = this.createChannel.bind(this); this.createChannel = this.createChannel.bind(this);
} }
cleanseChannelInput (input) { cleanseChannelInput (input) {
@ -30,7 +32,12 @@ class ChannelCreateForm extends React.Component {
let value = event.target.value; let value = event.target.value;
value = this.cleanseChannelInput(value); value = this.cleanseChannelInput(value);
this.setState({channel: value}); this.setState({channel: value});
this.checkChannelIsAvailable(value); if (value) {
this.updateIsChannelAvailable(value);
} else {
this.setState({error: 'Please enter a channel name'});
}
console.log('end of handlechannelinput');
} }
handleInput (event) { handleInput (event) {
event.preventDefault(); event.preventDefault();
@ -38,47 +45,81 @@ class ChannelCreateForm extends React.Component {
const value = event.target.value; const value = event.target.value;
this.setState({[name]: value}); this.setState({[name]: value});
} }
checkChannelIsAvailable (channel) { updateIsChannelAvailable (channel) {
const that = this; const that = this;
makeGetRequest(`/api/channel-is-available/${channel}`) const channelWithAtSymbol = `@${channel}`
.then(() => { makeGetRequest(`/api/channel-is-available/${channelWithAtSymbol}`)
that.setState({urlError: null}); .then(isAvailable => {
if (isAvailable) {
that.setState({'error': null});
} else {
that.setState({'error': 'That channel has already been claimed'});
}
}) })
.catch((error) => { .catch((error) => {
that.setState({error: error.message}); that.setState({'error': error.message});
}); });
} }
validatePassword (password) { checkIsChannelAvailable (channel) {
if (!password || password.length < 1) { const channelWithAtSymbol = `@${channel}`;
throw new Error('Please provide a password'); return new Promise((resolve, reject) => {
} makeGetRequest(`/api/channel-is-available/${channelWithAtSymbol}`)
.then(isAvailable => {
if (!isAvailable) {
console.log('channel is not available');
return reject(new Error('That channel has already been claimed'));
}
console.log('channel is available');
resolve();
})
.catch((error) => {
reject(error);
});
});
}
checkIsPasswordProvided () {
const password = this.state.password;
return new Promise((resolve, reject) => {
if (!password || password.length < 1) {
console.log('password not provided');
return reject(new Error('Please provide a password'));
}
console.log('password provided');
resolve();
});
}
makeCreateChannelRequest (channel, password) {
const params = `username=${channel}&password=${password}`;
return new Promise((resolve, reject) => {
makePostRequest('/signup', params)
.then(result => {
resolve(result);
})
.catch(error => {
console.log('create channel request failed:', error);
reject(new Error('Unfortunately, we encountered an error while creating your channel. Please let us know in Discord!'));
});
});
} }
createChannel (event) { createChannel (event) {
event.preventDefault(); event.preventDefault();
const params = `username=${this.state.channel}&password=${this.state.password}`;
const url = '/signup';
// validate submission data
try {
this.validatePassword(this.state.password);
} catch (error) {
return this.setState({error: error.message});
}
// publish the channel
const that = this; const that = this;
this.setState({status: 'We are publishing your new channel. Sit tight...'}); this.checkIsPasswordProvided()
makePostRequest(url, params) .then(() => {
return that.checkIsChannelAvailable(that.state.channel, that.state.password);
})
.then(() => {
that.setState({status: 'We are publishing your new channel. Sit tight...'});
return that.makeCreateChannelRequest();
})
.then(result => { .then(result => {
that.props.onChannelLogin(result.channelName, result.shortChannelId, result.channelClaimId); that.setState({status: null});
setUserCookies(result.channelName, result.shortChannelId, result.channelClaimId); setUserCookies(result.channelName, result.shortChannelId, result.channelClaimId);
replaceChannelSelectionInNavBar(result.channelName); replaceChannelSelectionInNavBar(result.channelName);
that.props.onChannelLogin(result.channelName, result.shortChannelId, result.channelClaimId);
}) })
.catch(error => { .catch((error) => {
console.log('create channel failure:', error); that.setState({'error': error.message, status: null});
if (error.message) {
this.setState({'error': error.message});
} else {
this.setState({'error': 'Unfortunately, we encountered an error while creating your channel. Please let us know in Discord!'});
}
}); });
} }
render () { render () {
@ -91,29 +132,29 @@ class ChannelCreateForm extends React.Component {
<div className="column column--3 column--sml-10"> <div className="column column--3 column--sml-10">
<label className="label" htmlFor="new-channel-name">Name:</label> <label className="label" htmlFor="new-channel-name">Name:</label>
</div><div className="column column--6 column--sml-10"> </div><div className="column column--6 column--sml-10">
<div className="input-text--primary flex-container--row flex-container--left-bottom"> <div className="input-text--primary flex-container--row flex-container--left-bottom">
<span>@</span> <span>@</span>
<input type="text" name="channel" id="new-channel-name" className="input-text" placeholder="exampleChannelName" value={this.state.channel} onChange={this.handleChannelInput} /> <input type="text" name="channel" id="new-channel-name" className="input-text" placeholder="exampleChannelName" value={this.state.channel} onChange={this.handleChannelInput} />
<span id="input-success-channel-name" className="info-message--success">{'\u2713'}</span> <span id="input-success-channel-name" className="info-message--success">{'\u2713'}</span>
</div>
</div> </div>
</div> </div>
</div>
<div className="row row--wide row--short"> <div className="row row--wide row--short">
<div className="column column--3 column--sml-10"> <div className="column column--3 column--sml-10">
<label className="label" htmlFor="new-channel-password">Password:</label> <label className="label" htmlFor="new-channel-password">Password:</label>
</div><div className="column column--6 column--sml-10"> </div><div className="column column--6 column--sml-10">
<div className="input-text--primary"> <div className="input-text--primary">
<input type="password" name="password" id="new-channel-password" className="input-text" placeholder="" value={this.state.password} onChange={this.handleInput} /> <input type="password" name="password" id="new-channel-password" className="input-text" placeholder="" value={this.state.password} onChange={this.handleInput} />
</div>
</div> </div>
</div> </div>
</div>
<div className="row row--wide"> <div className="row row--wide">
<button className="button--primary" onClick={this.createChannel}>Create Channel</button> <button className="button--primary" onClick={this.createChannel}>Create Channel</button>
</div> </div>
</form> </form>
) : ( ) : (
<p>{this.state.status}</p> <p className="label">{this.state.status}</p>
)} )}
</div> </div>
); );

View file

@ -22,14 +22,20 @@ class UrlChooser extends React.Component {
this.setClaimNameFromFileName(); this.setClaimNameFromFileName();
} }
} }
componentWillReceiveProps ({claim: newClaim}) {
console.log('PublishUrlInput will receive new props (claim)', newClaim);
if (newClaim) {
this.checkClaimIsAvailable(newClaim);
} else {
this.setState({error: 'Please enter a URL'});
}
}
handleInput (event) { handleInput (event) {
event.preventDefault(); event.preventDefault();
let value = event.target.value; let value = event.target.value;
value = this.cleanseInput(value); value = this.cleanseInput(value);
// update the state // update the state
this.props.onClaimChange(value); this.props.onClaimChange(value);
// check to make sure claim name is available
this.checkClaimIsAvailable(value);
} }
cleanseInput (input) { cleanseInput (input) {
input = input.replace(/\s+/g, '-'); // replace spaces with dashes input = input.replace(/\s+/g, '-'); // replace spaces with dashes
@ -38,7 +44,6 @@ class UrlChooser extends React.Component {
} }
setClaimNameFromFileName () { setClaimNameFromFileName () {
const fileName = this.props.fileName; const fileName = this.props.fileName;
console.log('setClaimNameFromFileName', fileName);
const fileNameWithoutEnding = fileName.substring(0, fileName.lastIndexOf('.')); const fileNameWithoutEnding = fileName.substring(0, fileName.lastIndexOf('.'));
const cleanClaimName = this.cleanseInput(fileNameWithoutEnding); const cleanClaimName = this.cleanseInput(fileNameWithoutEnding);
this.props.onClaimChange(cleanClaimName); this.props.onClaimChange(cleanClaimName);
@ -46,8 +51,12 @@ class UrlChooser extends React.Component {
checkClaimIsAvailable (claim) { checkClaimIsAvailable (claim) {
const that = this; const that = this;
makeGetRequest(`/api/claim-is-available/${claim}`) makeGetRequest(`/api/claim-is-available/${claim}`)
.then(() => { .then(response => {
that.setState({'error': null}); if (response) {
that.setState({'error': null});
} else {
that.setState({'error': 'That url has already been claimed'});
}
}) })
.catch((error) => { .catch((error) => {
that.setState({'error': error.message}); that.setState({'error': error.message});

View file

@ -8,11 +8,11 @@ module.exports = {
if (xhttp.readyState === 4) { if (xhttp.readyState === 4) {
if (xhttp.status === 200) { if (xhttp.status === 200) {
resolve(xhttp.response); resolve(xhttp.response);
} else if (xhttp.status === 401) { } if (xhttp.status === 401) {
reject('Wrong channel name or password'); reject(new Error('Wrong username or password'));
} else { } else {
reject('request failed with status:' + xhttp.status); reject(new Error(xhttp.response));
}; }
} }
}; };
xhttp.send(); xhttp.send();
@ -28,11 +28,11 @@ module.exports = {
if (xhttp.readyState === 4) { if (xhttp.readyState === 4) {
if (xhttp.status === 200) { if (xhttp.status === 200) {
resolve(xhttp.response); resolve(xhttp.response);
} else if (xhttp.status === 401) { } if (xhttp.status === 401) {
reject('Wrong channel name or password'); reject(new Error('Wrong username or password'));
} else { } else {
reject('request failed with status:' + xhttp.status); reject(new Error(xhttp.response));
}; }
} }
}; };
xhttp.send(params); xhttp.send(params);

View file

@ -90,7 +90,6 @@ module.exports = (app) => {
if (result === true) { if (result === true) {
res.status(200).json(true); res.status(200).json(true);
} else { } else {
// logger.debug(`Rejecting '${params.name}' because that name has already been claimed by this site`);
res.status(200).json(false); res.status(200).json(false);
} }
}) })
@ -105,7 +104,6 @@ module.exports = (app) => {
if (result === true) { if (result === true) {
res.status(200).json(true); res.status(200).json(true);
} else { } else {
// logger.debug(`Rejecting '${params.name}' because that channel has already been claimed`);
res.status(200).json(false); res.status(200).json(false);
} }
}) })