import React from 'react'; //jshint ignore:line
import Editor from 'misago/components/editor'; //jshint ignore:line
import Form from 'misago/components/form';
import Container from './utils/container'; //jshint ignore:line
import Loader from './utils/loader'; //jshint ignore:line
import Message from './utils/message'; //jshint ignore:line
import * as attachments from './utils/attachments'; //jshint ignore:line
import { getPostValidators } from './utils/validators';
import ajax from 'misago/services/ajax';
import posting from 'misago/services/posting'; //jshint ignore:line
import snackbar from 'misago/services/snackbar';
export default class extends Form {
constructor(props) {
super(props);
this.state = {
isReady: false,
isLoading: false,
isErrored: false,
post: '',
attachments: [],
validators: {
post: getPostValidators()
},
errors: {}
};
}
componentDidMount() {
ajax.get(this.props.config, this.props.context || null).then(this.loadSuccess, this.loadError);
}
componentWillReceiveProps(nextProps) {
const context = this.props.context;
const newContext = nextProps.context;
if (context && newContext && context.reply === newContext.reply) return;
ajax.get(nextProps.config, nextProps.context || null).then(this.appendData, snackbar.apiError);
}
/* jshint ignore:start */
loadSuccess = (data) => {
this.setState({
isReady: true,
post: data.post ? ('[quote="@' + data.poster + '"]\n' + data.post + '\n[/quote]') : ''
});
};
loadError = (rejection) => {
this.setState({
isErrored: rejection.detail
});
};
appendData = (data) => {
const newPost = data.post ? ('[quote="@' + data.poster + '"]\n' + data.post + '\n[/quote]\n\n') : '';
this.setState((prevState, props) => {
if (prevState.post.length > 0) {
return {
post: prevState.post + '\n\n' + newPost
};
}
return {
post: newPost
};
});
};
onCancel = () => {
const cancel = confirm(gettext("Are you sure you want to discard your reply?"));
if (cancel) {
posting.close();
}
};
onPostChange = (event) => {
this.changeValue('post', event.target.value);
};
onAttachmentsChange = (attachments) => {
this.setState({
attachments
});
};
/* jshint ignore:end */
clean() {
if (!this.state.post.trim().length) {
snackbar.error(gettext("You have to enter a message."));
return false;
}
const errors = this.validate();
if (errors.post) {
snackbar.error(errors.post[0]);
return false;
}
return true;
}
send() {
return ajax.post(this.props.submit, {
post: this.state.post,
attachments: attachments.clean(this.state.attachments)
});
}
handleSuccess(success) {
snackbar.success(gettext("Your reply has been posted."));
window.location = success.url.index;
// keep form loading
this.setState({
'isLoading': true
});
}
handleError(rejection) {
if (rejection.status === 400) {
if (rejection.category) {
snackbar.error(rejection.category[0]);
} else if (rejection.title) {
snackbar.error(rejection.title[0]);
} else if (rejection.post) {
snackbar.error(rejection.post[0]);
}
} else {
snackbar.apiError(rejection);
}
}
render() {
/* jshint ignore:start */
if (this.state.isReady) {
return (
);
} else if (this.state.isErrored) {
return (
);
} else {
return (
);
}
/* jshint ignore:end */
}
}