terriajs
Version:
Geospatial data visualization platform.
122 lines (108 loc) • 4.96 kB
JSX
;
import ObserveModelMixin from '../ObserveModelMixin';
import React from 'react';
import createReactClass from 'create-react-class';
import parseCustomMarkdownToReact from '../Custom/parseCustomMarkdownToReact';
import PropTypes from 'prop-types';
import sendFeedback from '../../Models/sendFeedback.js';
import Styles from './feedback-form.scss';
import Icon from "../Icon.jsx";
import classNames from "classnames";
const FeedbackForm = createReactClass({
displayName: 'FeedbackForm',
mixins: [ObserveModelMixin],
propTypes: {
viewState: PropTypes.object.isRequired
},
getInitialState() {
return {
isSending: false,
sendShareURL: true,
name: '',
email: '',
comment: ''
};
},
onDismiss() {
this.props.viewState.feedbackFormIsVisible = false;
this.setState(this.getInitialState());
},
onSubmit(evt) {
evt.preventDefault();
if (this.state.comment.length > 0) {
this.setState({
isSending: true
});
// submit form
sendFeedback({
terria: this.props.viewState.terria,
name: this.state.name,
email: this.state.email,
sendShareURL: this.state.sendShareURL,
comment: this.state.comment
}).then(succeeded => {
if (succeeded) {
this.setState({
isSending: false,
comment: ''
});
this.props.viewState.feedbackFormIsVisible = false;
} else {
this.setState({
isSending: false
});
}
});
}
return false;
},
handleChange(e) {
this.setState({
[e.target.getAttribute('name')]: e.target.value
});
},
changeSendShareUrl(e) {
this.setState({
sendShareURL: !this.state.sendShareURL
});
},
render() {
const preamble = parseCustomMarkdownToReact(this.props.viewState.terria.configParameters.feedbackPreamble || 'We would love to hear from you!');
const feedbackFormClassNames = classNames(Styles.form, {
[Styles.isOpen]: this.props.viewState.feedbackFormIsVisible
});
return (
<div className='feedback__inner'>
<div className={feedbackFormClassNames}>
<div className={Styles.header}>
<h4 className={Styles.title}>Feedback</h4>
<button className={Styles.btnClose} onClick={this.onDismiss} title='close feedback'>
<Icon glyph={Icon.GLYPHS.close} />
</button>
</div>
<form onSubmit={this.onSubmit}>
<div className={Styles.description}>{preamble}</div>
<label className={Styles.label}>Your name (optional)</label>
<input type="text" name="name" className={Styles.field} value={this.state.name} onChange={this.handleChange} />
<label className={Styles.label}>Email address (optional)<br /><em>We can't follow up without it!</em></label>
<input type="text" name="email" className={Styles.field} value={this.state.email} onChange={this.handleChange} />
<label className={Styles.label}>Comment or question</label>
<textarea className={Styles.field} name="comment" value={this.state.comment} onChange={this.handleChange} />
<div className={Styles.shareUrl}>
<button onClick={this.changeSendShareUrl} type='button'>
{this.state.sendShareURL ? <Icon glyph={Icon.GLYPHS.checkboxOn} /> : <Icon glyph={Icon.GLYPHS.checkboxOff} />}
Share my map view with {this.props.viewState.terria.appName} developers<br />
<small>This helps us to troubleshoot issues by letting us see what you're seeing</small>
</button>
</div>
<div className={Styles.action}>
<button type="button" className={Styles.btnCancel} onClick={this.onDismiss}>Cancel</button>
<button type="submit" className={Styles.btnSubmit} disabled={this.state.isSending}>{this.state.isSending ? 'Sending...' : 'Send'}</button>
</div>
</form>
</div>
</div>
);
},
});
module.exports = FeedbackForm;