2018-01-05 03:34:17 +01:00
|
|
|
import React from 'react';
|
2018-01-18 00:00:03 +01:00
|
|
|
import {makeGetRequest} from 'utils/xhr';
|
|
|
|
import UrlMiddle from 'components/PublishUrlMiddle';
|
2018-01-05 03:34:17 +01:00
|
|
|
|
2018-01-17 19:49:57 +01:00
|
|
|
class PublishUrlInput extends React.Component {
|
2018-01-05 03:34:17 +01:00
|
|
|
constructor (props) {
|
|
|
|
super(props);
|
|
|
|
this.state = {
|
2018-01-05 22:59:25 +01:00
|
|
|
host : 'spee.ch',
|
|
|
|
urlMiddle: null,
|
2018-01-05 03:34:17 +01:00
|
|
|
};
|
|
|
|
this.handleInput = this.handleInput.bind(this);
|
2018-01-10 03:25:38 +01:00
|
|
|
this.cleanseInput = this.cleanseInput.bind(this);
|
|
|
|
this.setClaimNameFromFileName = this.setClaimNameFromFileName.bind(this);
|
2018-01-05 19:31:49 +01:00
|
|
|
this.checkClaimIsAvailable = this.checkClaimIsAvailable.bind(this);
|
2018-01-05 03:34:17 +01:00
|
|
|
}
|
2018-01-18 19:13:51 +01:00
|
|
|
componentDidMount () {
|
2018-01-10 03:25:38 +01:00
|
|
|
if (!this.props.claim || this.props.claim === '') {
|
|
|
|
this.setClaimNameFromFileName();
|
|
|
|
}
|
|
|
|
}
|
2018-01-12 21:48:24 +01:00
|
|
|
componentWillReceiveProps ({claim: newClaim}) {
|
|
|
|
if (newClaim) {
|
|
|
|
this.checkClaimIsAvailable(newClaim);
|
|
|
|
} else {
|
2018-01-12 23:27:34 +01:00
|
|
|
this.props.onUrlError('Please enter a URL');
|
2018-01-12 21:48:24 +01:00
|
|
|
}
|
|
|
|
}
|
2018-01-05 03:34:17 +01:00
|
|
|
handleInput (event) {
|
|
|
|
event.preventDefault();
|
|
|
|
let value = event.target.value;
|
2018-01-10 03:25:38 +01:00
|
|
|
value = this.cleanseInput(value);
|
|
|
|
// update the state
|
|
|
|
this.props.onClaimChange(value);
|
2018-01-05 03:34:17 +01:00
|
|
|
}
|
2018-01-10 03:25:38 +01:00
|
|
|
cleanseInput (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;
|
|
|
|
}
|
|
|
|
setClaimNameFromFileName () {
|
|
|
|
const fileName = this.props.fileName;
|
|
|
|
const fileNameWithoutEnding = fileName.substring(0, fileName.lastIndexOf('.'));
|
|
|
|
const cleanClaimName = this.cleanseInput(fileNameWithoutEnding);
|
|
|
|
this.props.onClaimChange(cleanClaimName);
|
|
|
|
}
|
2018-01-05 19:31:49 +01:00
|
|
|
checkClaimIsAvailable (claim) {
|
2018-01-05 03:34:17 +01:00
|
|
|
const that = this;
|
2018-01-10 03:25:38 +01:00
|
|
|
makeGetRequest(`/api/claim-is-available/${claim}`)
|
2018-01-12 21:48:24 +01:00
|
|
|
.then(response => {
|
|
|
|
if (response) {
|
2018-01-15 18:59:23 +01:00
|
|
|
that.props.onUrlError(null);
|
2018-01-12 21:48:24 +01:00
|
|
|
} else {
|
2018-01-15 18:59:23 +01:00
|
|
|
that.props.onUrlError('That url has already been claimed');
|
2018-01-12 21:48:24 +01:00
|
|
|
}
|
2018-01-05 03:34:17 +01:00
|
|
|
})
|
|
|
|
.catch((error) => {
|
2018-01-15 18:59:23 +01:00
|
|
|
that.props.onUrlError(error.message);
|
2018-01-05 03:34:17 +01:00
|
|
|
});
|
|
|
|
}
|
|
|
|
render () {
|
|
|
|
return (
|
|
|
|
<div>
|
2018-01-12 23:27:34 +01:00
|
|
|
<p id="input-error-claim-name" className="info-message-placeholder info-message--failure">{this.props.urlError}</p>
|
2018-01-10 20:26:01 +01:00
|
|
|
<div className="column column--3 column--sml-10">
|
|
|
|
<label className="label">URL:</label>
|
|
|
|
</div><div className="column column--7 column--sml-10 input-text--primary span--relative">
|
2018-01-05 03:34:17 +01:00
|
|
|
|
2018-01-10 20:26:01 +01:00
|
|
|
<span className="url-text--secondary">{this.state.host} / </span>
|
2018-01-05 03:34:17 +01:00
|
|
|
|
2018-01-10 20:26:01 +01:00
|
|
|
<UrlMiddle publishInChannel={this.props.publishInChannel} loggedInChannelName={this.props.loggedInChannelName} loggedInChannelShortId={this.props.loggedInChannelShortId}/>
|
2018-01-05 03:34:17 +01:00
|
|
|
|
2018-01-10 20:26:01 +01:00
|
|
|
<input type="text" id="claim-name-input" className="input-text" name='claim' placeholder="your-url-here" onChange={this.handleInput} value={this.props.claim}/>
|
2018-01-12 23:27:34 +01:00
|
|
|
{ (this.props.claim && !this.props.urlError) && <span id="input-success-claim-name" className="info-message--success span--absolute">{'\u2713'}</span> }
|
2018-01-05 03:34:17 +01:00
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-01-17 19:49:57 +01:00
|
|
|
export default PublishUrlInput;
|