import React, { Fragment } from 'react'; import PropTypes from 'prop-types'; import Grid from '@material-ui/core/Grid'; import { withStyles } from '@material-ui/core/styles'; import MenuItem from '@material-ui/core/MenuItem'; 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 firebase from '../firebase.js'; import GoogleMap from '../components/ReportMap'; import Modal from '@material-ui/core/Modal'; import Typography from '@material-ui/core/Typography'; /** * 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 * 2, marginRight: theme.spacing.unit, marginTop: theme.spacing.unit * 2, flexBasis: 280, width: '90%' }, button: { marginLeft: theme.spacing.unit * 2, marginRight: theme.spacing.unit, marginTop: theme.spacing.unit * 2, }, dense: { marginTop: 30, }, 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, } }); /** * Types of sightings. Label is what is * viewed in the application, value is * what is stored in the database. */ const sightingTypes = [ { value: 'visual', label: 'Visual', }, { value: 'roadkill', label: 'Roadkill', }, { value: 'trapped', label: 'Trapped', }, { value: 'viewed_tracks', label: 'Viewed Tracks', }, { value: 'photo', label: 'Photo', }, { value: 'other', label: 'Other', }, ]; /** * Types of sightings. Label is what is * viewed in the application, value is * what is stored in the database. */ const monthTypes = [ { value: '01', label: 'January', }, { value: '02', label: 'February', }, { value: '03', label: 'March', }, { value: '04', label: 'April', }, { value: '05', label: 'May', }, { value: '06', label: 'June', }, { value: '07', label: 'July', }, { value: '08', label: 'August', }, { value: '09', label: 'September', }, { value: '10', label: 'October', }, { value: '11', label: 'November', }, { value: '12', label: 'December', }, ]; /** * Types of sightings. Label is what is * viewed in the application, value is * what is stored in the database. */ const timeTypes = [ { value: 'unknown', label: 'Unknown', }, { value: 'morning', label: 'Morning', }, { value: 'midday', label: 'Midday', }, { value: 'evening', label: 'Evening', }, { value: 'night', label: 'Night', }, ]; /** * Levels of confidence. Label is what is * viewed in the application, value is * what is stored in the database. */ const confidenceLevels = [ { value: '1', label: '1 - Strongly disagree', }, { value: '2', label: '2 - Disagree', }, { value: '3', label: '3 - Neutral', }, { value: '4', label: '4 - Agree', }, { value: '5', label: '5 - Strongly agree', }, ]; /** * The form component. */ class ReportForm extends React.Component { /** * Component contructor. Currently * only used to bind event * handlers. */ constructor() { super(); this.handleSubmit = this.handleSubmit.bind(this); } /** * Function for formatting the * year as a string that * Material UI can use. * @param {*} date, Date passed in. */ getYear = date => { var d = new Date(date), year = d.getFullYear(); return year; } /** * Function for formatting the * month as a string that * Material UI can use. * @param {*} date, Date passed in. */ getMonth = date => { var d = new Date(date), month = d.getMonth() + 1; month = month.toString(); if (month.length === 1) { month = "0" + month; } return month; } /** * State of form components. */ state = { month: this.getMonth(new Date()), year: this.getYear(new Date()), time: 'unknown', type: 'visual', confidence: '1', desc: '', lat: '', lng: '', open: false, openModal: false, hasModalOpened: false }; handleModalOpen = () => !this.state.hasModalOpened ? this.setState({ openModal: true, hasModalOpened: true }) : null; handleModalClose = () => { this.setState({ openModal: false }); }; getModalStyle = () => { return { top: `25%`, left: `75%`, transform: `translate(-25%, -75%)`, }; } /** * 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 }); }; /* * Get the coordinates * */ getCoordinates = (lat, lng) => { let latitude = lat; let longitude = lng; this.setState({ lat: latitude, lng: longitude }); } /** * Event listener for form. * When the form is submitted, * this function passes the * data along to Firebase. */ handleSubmit(e) { e.preventDefault(); const sightingsRef = firebase.database().ref('sightings'); const sighting = { type: this.state.type, confidence: this.state.confidence, date: this.state.year + '-' + this.state.month, time: this.state.time, desc: this.state.desc, lat: this.state.lat, lng: this.state.lng } sightingsRef.push(sighting); this.setState({ year: this.getYear(new Date()), month: this.getMonth(new Date()), time: 'unknown', type: 'visual', confidence: '1', desc: '', lat: '', lng: '', open: true }); }; /** * The render method for this component. */ render() { const { classes } = this.props; /** * The actual form. */ return (
{sightingTypes.map(option => ( {option.label} ))} {confidenceLevels.map(option => ( {option.label} ))} {timeTypes.map(option => ( {option.label} ))} {monthTypes.map(option => ( {option.label} ))}
Need a little help? Click on the map to drop a pin!
Report received.} action={[ , ]} />
); } } ReportForm.propTypes = { classes: PropTypes.object.isRequired, }; export default withStyles(styles)(ReportForm);