diff --git a/package-lock.json b/package-lock.json
index 88e437f..88fc26c 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -4251,6 +4251,21 @@
"minimalistic-crypto-utils": "^1.0.0"
}
},
+ "emailjs-com": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/emailjs-com/-/emailjs-com-2.2.4.tgz",
+ "integrity": "sha512-Pm29HoSxEIKLv7p6rxOPpKFqLnf2JaHTl6coql59r8MNRNW49Mim65s7yoWAqQhZ+Mk4GFmQsiPSFXD6Gnm4BQ==",
+ "requires": {
+ "promise-polyfill": "7.1.0"
+ },
+ "dependencies": {
+ "promise-polyfill": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-7.1.0.tgz",
+ "integrity": "sha512-P6NJ2wU/8fac44ENORsuqT8TiolKGB2u0fEClPtXezn7w5cmLIjM/7mhPlTebke2EPr6tmqZbXvnX0TxwykGrg=="
+ }
+ }
+ },
"emoji-regex": {
"version": "6.5.1",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-6.5.1.tgz",
@@ -5656,7 +5671,7 @@
},
"core-js": {
"version": "2.5.5",
- "resolved": "http://registry.npmjs.org/core-js/-/core-js-2.5.5.tgz",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.5.tgz",
"integrity": "sha1-sU3ek2xkDAV5prUMq8wTLdYSfjs="
},
"firebase": {
diff --git a/package.json b/package.json
index 3322cad..57a3d9f 100644
--- a/package.json
+++ b/package.json
@@ -7,6 +7,7 @@
"@material-ui/icons": "^3.0.1",
"ajv": "^6.0.0",
"disqus-react": "^1.0.5",
+ "emailjs-com": "^2.2.4",
"firebase": "^5.5.2",
"firebase-admin": "^6.1.0",
"flamelink": "^0.19.6",
diff --git a/src/App.css b/src/App.css
index b5b1e22..d1e1bd6 100644
--- a/src/App.css
+++ b/src/App.css
@@ -42,6 +42,11 @@ body {
height: 300px !important;
}
+.contact-form {
+ max-width: 100%;
+ overflow: hidden;
+}
+
@media (min-width: 960px) {
.sighting-detail-google-map-container > div {
width: calc(100% - 50% - 120px) !important;
diff --git a/src/components/ContactForm.js b/src/components/ContactForm.js
new file mode 100644
index 0000000..b009805
--- /dev/null
+++ b/src/components/ContactForm.js
@@ -0,0 +1,227 @@
+import React, { Fragment } from 'react';
+import PropTypes from 'prop-types';
+import Grid from '@material-ui/core/Grid';
+import emailjs from '../emailjs.js'
+import { withStyles } from '@material-ui/core/styles';
+import TextField from '@material-ui/core/TextField';
+import CheckCircleIcon from '@material-ui/icons/CheckCircle';
+import Snackbar from '@material-ui/core/Snackbar';
+import IconButton from '@material-ui/core/IconButton';
+import CloseIcon from '@material-ui/icons/Close';
+import Button from '@material-ui/core/Button';
+import { Typography } from '@material-ui/core';
+
+/**
+ * Styles that the different
+ * Material UI components pull
+ * in. Mostly used for spacing.
+ */
+const styles = theme => ({
+ container: {
+ display: 'flex',
+ flexWrap: 'wrap'
+ },
+ textField: {
+ marginLeft: theme.spacing.unit,
+ marginRight: theme.spacing.unit,
+ marginTop: theme.spacing.unit,
+ flexBasis: 280,
+ width: '90%'
+ },
+ button: {
+ marginLeft: theme.spacing.unit,
+ marginRight: theme.spacing.unit,
+ marginTop: theme.spacing.unit,
+ },
+ close: {
+ padding: theme.spacing.unit / 2,
+ },
+ icon: {
+ fontSize: 20,
+ marginRight: theme.spacing.unit,
+ },
+ message: {
+ display: 'flex',
+ alignItems: 'center',
+ },
+ menu: {
+ width: 200,
+ },
+ paper: {
+ position: 'absolute',
+ width: theme.spacing.unit * 50,
+ backgroundColor: theme.palette.background.paper,
+ boxShadow: theme.shadows[5],
+ padding: theme.spacing.unit * 4,
+ }
+});
+
+/**
+ * The form component.
+ */
+class ContactForm extends React.Component {
+
+ /**
+ * State of form components.
+ */
+ state = {
+ name: "",
+ email: "",
+ comments: "",
+ open: false
+ };
+
+ /**
+ * Handles state change in form
+ * components.
+ */
+ handleChange = name => event => {
+ this.setState({
+ [name]: event.target.value,
+ });
+ };
+
+ /**
+ * Handles closing the toast.
+ */
+ handleClose = (event, reason) => {
+ if (reason === 'clickaway') {
+ return;
+ }
+
+ this.setState({ open: false });
+ };
+
+ /**
+ * Event listener for form.
+ * When the form is submitted,
+ * this function passes the
+ * data along to EmailJS.
+ */
+ handleSubmit = e => {
+ e.preventDefault();
+
+ const templateParams = {
+ from_name: this.state.name,
+ from_email: this.state.email,
+ message_html: this.state.comments
+ };
+
+ emailjs.send('default_service', 'template_XaKOJGSf', templateParams);
+
+ this.setState({
+ name: "",
+ email: "",
+ comments: "",
+ open: true
+ });
+ };
+
+ /**
+ * The render method for this component.
+ */
+ render() {
+ const { classes } = this.props;
+
+ /**
+ * The actual form.
+ */
+ return (
+
+
+ {
}
+ Send us an email!
+
+
+
+ Message sent.}
+ action={[
+
+
+ ,
+ ]}
+ />
+
+ );
+ }
+}
+
+ContactForm.propTypes = {
+ classes: PropTypes.object.isRequired,
+};
+
+export default withStyles(styles)(ContactForm);
diff --git a/src/components/Main.js b/src/components/Main.js
index f6140fe..0af7536 100644
--- a/src/components/Main.js
+++ b/src/components/Main.js
@@ -14,6 +14,7 @@ import Hidden from '@material-ui/core/Hidden';
import Divider from '@material-ui/core/Divider';
import MenuIcon from '@material-ui/icons/Menu';
import HomeIcon from '@material-ui/icons/Home';
+import EmailIcon from '@material-ui/icons/Email';
import PhotoLibraryIcon from '@material-ui/icons/PhotoLibrary';
import AssignmentIcon from '@material-ui/icons/Assignment';
import MapIcon from '@material-ui/icons/Map';
@@ -24,6 +25,7 @@ import Home from '../pages/Home';
import ViewMap from '../pages/ViewMap';
import About from '../pages/About';
import Quiz from '../pages/QuizPage';
+import Contact from '../pages/Contact';
import SightingList from '../pages/SightingList';
import Report from '../pages/Report';
import CssBaseline from '@material-ui/core/CssBaseline';
@@ -119,10 +121,6 @@ class ResponsiveDrawer extends React.Component {
- this.nav('About')}>
-
-
-
@@ -143,6 +141,14 @@ class ResponsiveDrawer extends React.Component {
+ this.nav('Contact')}>
+
+
+
+ this.nav('About')}>
+
+
+
@@ -223,6 +229,7 @@ class ResponsiveDrawer extends React.Component {
{this.state.key === 'Map' && }
{this.state.key === 'List' && }
{this.state.key === 'About' && }
+ {this.state.key === 'Contact' && }
{this.state.key === 'Easy-Quiz' && }
{this.state.key === 'Intermediate-Quiz' && }
{this.state.key === 'Advanced-Quiz' && }
diff --git a/src/emailjs.js b/src/emailjs.js
new file mode 100644
index 0000000..b2c9193
--- /dev/null
+++ b/src/emailjs.js
@@ -0,0 +1,5 @@
+import * as emailjs from 'emailjs-com'
+
+emailjs.init("user_4d5R86dmu6vgeJP4euxSA");
+
+export default emailjs;
\ No newline at end of file
diff --git a/src/pages/Contact.js b/src/pages/Contact.js
new file mode 100644
index 0000000..20d4407
--- /dev/null
+++ b/src/pages/Contact.js
@@ -0,0 +1,14 @@
+import React, { Component } from 'react';
+import ContactForm from '../components/ContactForm.js'
+
+class Contact extends Component {
+ componentDidMount() {
+ document.title = 'Marten Tracker | Contact';
+ }
+
+ render() {
+ return ;
+ }
+}
+
+export default Contact;