mirror of
https://github.com/scratchfoundation/scratch-www.git
synced 2024-12-12 08:41:31 -05:00
91 lines
2.6 KiB
JavaScript
91 lines
2.6 KiB
JavaScript
const PropTypes = require('prop-types');
|
|
const React = require('react');
|
|
const bindAll = require('lodash.bindall');
|
|
const connect = require('react-redux').connect;
|
|
const injectIntl = require('react-intl').injectIntl;
|
|
const intlShape = require('react-intl').intlShape;
|
|
|
|
const api = require('../../lib/api');
|
|
const previewActions = require('../../redux/preview');
|
|
|
|
class FormsyProjectUpdater extends React.Component {
|
|
constructor (props) {
|
|
super(props);
|
|
bindAll(this, [
|
|
'setRef',
|
|
'handleUpdate'
|
|
]);
|
|
this.state = {
|
|
value: props.initialValue,
|
|
error: false
|
|
};
|
|
}
|
|
componentDidUpdate () {
|
|
if (this.state.error !== false) {
|
|
const errorMessageId = this.state.error === 400 ?
|
|
'project.inappropriateUpdate' : 'general.notAvailableHeadline';
|
|
this.ref.updateInputsWithError({
|
|
[this.props.field]: this.props.intl.formatMessage({
|
|
id: errorMessageId
|
|
})
|
|
});
|
|
}
|
|
}
|
|
handleUpdate (jsonData) {
|
|
// Ignore updates that would not change the value
|
|
if (jsonData[this.props.field] === this.state.value) return;
|
|
|
|
api({
|
|
uri: `/projects/${this.props.projectInfo.id}`,
|
|
authentication: this.props.user.token,
|
|
method: 'PUT',
|
|
json: jsonData
|
|
}, (err, body, res) => {
|
|
if (res.statusCode === 200) {
|
|
this.setState({value: body[this.props.field], error: false});
|
|
this.props.onUpdate(jsonData);
|
|
} else {
|
|
this.setState({error: res.statusCode});
|
|
}
|
|
});
|
|
}
|
|
setRef (ref) {
|
|
this.ref = ref;
|
|
}
|
|
render () {
|
|
return this.props.children(
|
|
this.state.value,
|
|
this.setRef,
|
|
this.handleUpdate
|
|
);
|
|
}
|
|
}
|
|
|
|
FormsyProjectUpdater.propTypes = {
|
|
children: PropTypes.func.isRequired,
|
|
field: PropTypes.string,
|
|
initialValue: PropTypes.string,
|
|
intl: intlShape,
|
|
onUpdate: PropTypes.func,
|
|
projectInfo: PropTypes.shape({
|
|
id: PropTypes.oneOfType([PropTypes.string, PropTypes.number])
|
|
}),
|
|
user: PropTypes.shape({
|
|
token: PropTypes.string
|
|
})
|
|
};
|
|
|
|
const mapStateToProps = state => ({
|
|
projectInfo: state.preview.projectInfo,
|
|
user: state.session.session.user
|
|
});
|
|
|
|
const mapDispatchToProps = dispatch => ({
|
|
onUpdate: info => {
|
|
dispatch(previewActions.updateProjectInfo(info));
|
|
}
|
|
});
|
|
|
|
module.exports = connect(mapStateToProps, mapDispatchToProps)(
|
|
injectIntl(FormsyProjectUpdater)
|
|
);
|