fixed merge conflicts
							
								
								
									
										1426
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						@ -5,11 +5,15 @@
 | 
				
			|||||||
  "dependencies": {
 | 
					  "dependencies": {
 | 
				
			||||||
    "@material-ui/core": "^3.1.0",
 | 
					    "@material-ui/core": "^3.1.0",
 | 
				
			||||||
    "@material-ui/icons": "^3.0.1",
 | 
					    "@material-ui/icons": "^3.0.1",
 | 
				
			||||||
 | 
					    "ajv": "^6.0.0",
 | 
				
			||||||
    "disqus-react": "^1.0.5",
 | 
					    "disqus-react": "^1.0.5",
 | 
				
			||||||
    "firebase": "^5.5.2",
 | 
					    "firebase": "^5.5.2",
 | 
				
			||||||
    "firebase-admin": "^6.0.0",
 | 
					    "firebase-admin": "^6.1.0",
 | 
				
			||||||
    "flamelink": "^0.19.2",
 | 
					    "flamelink": "^0.19.2",
 | 
				
			||||||
    "google-maps-react": "^2.0.2",
 | 
					    "google-maps-react": "^2.0.2",
 | 
				
			||||||
 | 
					    "grpc": "^1.15.1",
 | 
				
			||||||
 | 
					    "material-ui": "^1.0.0-beta.16",
 | 
				
			||||||
 | 
					    "material-ui-icons": "^1.0.0-beta.36",
 | 
				
			||||||
    "moment": "^2.22.2",
 | 
					    "moment": "^2.22.2",
 | 
				
			||||||
    "react": "^16.5.1",
 | 
					    "react": "^16.5.1",
 | 
				
			||||||
    "react-dom": "^16.5.1",
 | 
					    "react-dom": "^16.5.1",
 | 
				
			||||||
 | 
				
			|||||||
| 
		 Before Width: | Height: | Size: 3.8 KiB After Width: | Height: | Size: 21 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								public/mapicons/cage.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 12 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								public/mapicons/marten-icon.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 21 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								public/mapicons/other-icon.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 3.7 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								public/mapicons/paws.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 4.1 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								public/mapicons/photo-icon.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 23 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								public/mapicons/tire-icon.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 72 KiB  | 
@ -3,6 +3,10 @@ import Main from './components/Main';
 | 
				
			|||||||
import './App.css';
 | 
					import './App.css';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class App extends Component {
 | 
					class App extends Component {
 | 
				
			||||||
 | 
					    componentDidMount() {
 | 
				
			||||||
 | 
					        document.title = 'Marten Tracker';
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    render() {
 | 
					    render() {
 | 
				
			||||||
        return (
 | 
					        return (
 | 
				
			||||||
        <div>
 | 
					        <div>
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										28
									
								
								src/components/FlameLinkComponentCreations.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,28 @@
 | 
				
			|||||||
 | 
					import React, { Component} from 'react';
 | 
				
			||||||
 | 
					import FlameLinkStructure from './FlameLinkStructure';
 | 
				
			||||||
 | 
					import Grid from '@material-ui/core/Grid';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class FlameLinkComponentCreations extends Component {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    getSchemaFieldData(schemaData){
 | 
				
			||||||
 | 
					        var arr = [];
 | 
				
			||||||
 | 
					        for (var val in schemaData){
 | 
				
			||||||
 | 
					            arr.push(val);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return arr.map(this.createComponents, schemaData);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    createComponents(num){
 | 
				
			||||||
 | 
					        return <FlameLinkStructure schemaData={this} field={this[num]} type={this[num].type} key={this[num].key} />
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    render() {
 | 
				
			||||||
 | 
					        return(
 | 
				
			||||||
 | 
					                <Grid container>
 | 
				
			||||||
 | 
					                    {this.getSchemaFieldData(this.props.schemaDetails)}
 | 
				
			||||||
 | 
					                </Grid>
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default FlameLinkComponentCreations;
 | 
				
			||||||
							
								
								
									
										31
									
								
								src/components/FlameLinkFieldSet.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,31 @@
 | 
				
			|||||||
 | 
					import React, { Component} from 'react';
 | 
				
			||||||
 | 
					import Grid from '@material-ui/core/Grid';
 | 
				
			||||||
 | 
					import FlameLinkFieldSetContent from './FlameLinkFieldSetContent';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class FlameLinkFieldSet extends Component {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    getFieldSetContent(content1, content2){
 | 
				
			||||||
 | 
					        var arr = [];
 | 
				
			||||||
 | 
					        for (var val in content2){
 | 
				
			||||||
 | 
					            arr.push(val);
 | 
				
			||||||
 | 
					        }  
 | 
				
			||||||
 | 
					        var arrContent = [content1, content2];
 | 
				
			||||||
 | 
					        return arr.map(this.createFieldSetComponents, arrContent);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    createFieldSetComponents(num){
 | 
				
			||||||
 | 
					        return <FlameLinkFieldSetContent field={this[1][num]} type={this[1][num].type} key={this[1][num].key} fieldKey={this[1][num].key} data={this[0]}/>
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    render() {
 | 
				
			||||||
 | 
					        return(
 | 
				
			||||||
 | 
					            <Grid item xs={12}>
 | 
				
			||||||
 | 
					                    {this.getFieldSetContent(this.props.field, this.props.field2)}
 | 
				
			||||||
 | 
					            </Grid>
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default FlameLinkFieldSet;
 | 
				
			||||||
							
								
								
									
										52
									
								
								src/components/FlameLinkFieldSetContent.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,52 @@
 | 
				
			|||||||
 | 
					import React, { Component} from 'react';
 | 
				
			||||||
 | 
					import Grid from '@material-ui/core/Grid';
 | 
				
			||||||
 | 
					import Typography from '@material-ui/core/Typography';
 | 
				
			||||||
 | 
					import { withStyles } from '@material-ui/core/styles';
 | 
				
			||||||
 | 
					import FlameLinkImage from './FlameLinkImage';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const styles = theme => ({
 | 
				
			||||||
 | 
					        flamelinkFieldSetItem: {
 | 
				
			||||||
 | 
					            paddingBottom: 10,
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class FlameLinkFieldSetContent extends Component {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    getContent(key, type, description, fieldsetContent){
 | 
				
			||||||
 | 
					        if (type === 'text'){
 | 
				
			||||||
 | 
					                return  (
 | 
				
			||||||
 | 
					                        <Typography variant='body2' component="p" id={this.props.field.key}>
 | 
				
			||||||
 | 
					                        {fieldsetContent[key]}
 | 
				
			||||||
 | 
					                        </Typography>
 | 
				
			||||||
 | 
					                        )
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if(type === 'textarea'){
 | 
				
			||||||
 | 
					            return  (
 | 
				
			||||||
 | 
					                    <Typography variant='body2' component="p" id={this.props.field.key} gutterBottom>
 | 
				
			||||||
 | 
					                    {fieldsetContent[key]}
 | 
				
			||||||
 | 
					                    </Typography>
 | 
				
			||||||
 | 
					                    )               
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if (type === 'media'){
 | 
				
			||||||
 | 
					            for (var val in fieldsetContent[key]){
 | 
				
			||||||
 | 
					                return <FlameLinkImage content={fieldsetContent[key][val]}/>
 | 
				
			||||||
 | 
					            } 
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    render() {
 | 
				
			||||||
 | 
					        const { classes } = this.props;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        const lg = this.props.field.gridColumns.lg;
 | 
				
			||||||
 | 
					        const md = this.props.field.gridColumns.md;
 | 
				
			||||||
 | 
					        const sm = this.props.field.gridColumns.sm;
 | 
				
			||||||
 | 
					        const xs = this.props.field.gridColumns.xs;
 | 
				
			||||||
 | 
					        return(
 | 
				
			||||||
 | 
					            <Grid item lg={lg} md={md} sm={sm} xs={xs} className={classes.flamelinkFieldSetItem}>
 | 
				
			||||||
 | 
					                    {this.getContent(this.props.fieldKey, this.props.type, this.props.field.description, this.props.data)}
 | 
				
			||||||
 | 
					            </Grid>
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default withStyles(styles)(FlameLinkFieldSetContent);
 | 
				
			||||||
							
								
								
									
										29
									
								
								src/components/FlameLinkImage.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,29 @@
 | 
				
			|||||||
 | 
					import React, { Component } from 'react';
 | 
				
			||||||
 | 
					import Typography from '@material-ui/core/Typography';
 | 
				
			||||||
 | 
					import flamelinkApp from '../flamelink.js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class FlameLinkImage extends Component {
 | 
				
			||||||
 | 
					    constructor() {
 | 
				
			||||||
 | 
					        super();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        this.state = {
 | 
				
			||||||
 | 
					          mediaURL: '',
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        flamelinkApp.storage.getURL(global.mediaID)
 | 
				
			||||||
 | 
					                    .then(url => this.setState({
 | 
				
			||||||
 | 
					                      mediaURL: url
 | 
				
			||||||
 | 
					                    }))
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    render() {
 | 
				
			||||||
 | 
					        return(
 | 
				
			||||||
 | 
					                <Typography align='center'>
 | 
				
			||||||
 | 
					                    <img src={this.state.mediaURL} width="70%" alt='' />
 | 
				
			||||||
 | 
					                </Typography>
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default FlameLinkImage;
 | 
				
			||||||
							
								
								
									
										123
									
								
								src/components/FlameLinkStructure.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						@ -0,0 +1,123 @@
 | 
				
			|||||||
 | 
					import React, { Component} from 'react';
 | 
				
			||||||
 | 
					import Grid from '@material-ui/core/Grid';
 | 
				
			||||||
 | 
					import Typography from '@material-ui/core/Typography';
 | 
				
			||||||
 | 
					import { withStyles } from '@material-ui/core/styles';
 | 
				
			||||||
 | 
					import flamelinkApp from '../flamelink.js';
 | 
				
			||||||
 | 
					import FlameLinkImage from './FlameLinkImage';
 | 
				
			||||||
 | 
					import FlameLinkFieldSet from './FlameLinkFieldSet';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const styles = theme => ({
 | 
				
			||||||
 | 
					        flamelinkItem: {
 | 
				
			||||||
 | 
					            paddingRight: 20,
 | 
				
			||||||
 | 
					            paddingLeft: 20,
 | 
				
			||||||
 | 
					            paddingTop: 20,
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class FlameLinkStructure extends Component {
 | 
				
			||||||
 | 
					    constructor() {
 | 
				
			||||||
 | 
					        super();
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        global.mediaID = '';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        this.state = {
 | 
				
			||||||
 | 
					          schemaContent: '',
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        flamelinkApp.content.get(global.schemaName)
 | 
				
			||||||
 | 
					        .then(result => this.setState({
 | 
				
			||||||
 | 
					          schemaContent: result
 | 
				
			||||||
 | 
					        }))
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    getContent(schemaField, key, type, description){
 | 
				
			||||||
 | 
					        if (type === 'text'){
 | 
				
			||||||
 | 
					            if(description === 'h1'){
 | 
				
			||||||
 | 
					                return  (
 | 
				
			||||||
 | 
					                        <Typography variant='display4' id={key}>
 | 
				
			||||||
 | 
					                            {this.state.schemaContent[key]}
 | 
				
			||||||
 | 
					                        </Typography>
 | 
				
			||||||
 | 
					                        )                
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            if(description === 'h2'){
 | 
				
			||||||
 | 
					                return  (
 | 
				
			||||||
 | 
					                        <Typography variant='display3' id={key}>
 | 
				
			||||||
 | 
					                            {this.state.schemaContent[key]}
 | 
				
			||||||
 | 
					                        </Typography>
 | 
				
			||||||
 | 
					                        )                
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            if(description === 'h3'){
 | 
				
			||||||
 | 
					                return  (
 | 
				
			||||||
 | 
					                        <Typography variant='display2' id={key}>
 | 
				
			||||||
 | 
					                            {this.state.schemaContent[key]}
 | 
				
			||||||
 | 
					                        </Typography>
 | 
				
			||||||
 | 
					                        )                
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            if(description === 'h4'){
 | 
				
			||||||
 | 
					                return  (
 | 
				
			||||||
 | 
					                        <Typography variant='display1' id={key}>
 | 
				
			||||||
 | 
					                            {this.state.schemaContent[key]}
 | 
				
			||||||
 | 
					                        </Typography>
 | 
				
			||||||
 | 
					                        )                
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            if(description === 'h5'){
 | 
				
			||||||
 | 
					                return  (
 | 
				
			||||||
 | 
					                        <Typography variant='headline' id={key}>
 | 
				
			||||||
 | 
					                            {this.state.schemaContent[key]}
 | 
				
			||||||
 | 
					                        </Typography>
 | 
				
			||||||
 | 
					                        )                
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            if(description === 'h6'){
 | 
				
			||||||
 | 
					                return  (
 | 
				
			||||||
 | 
					                        <Typography variant='title' id={key}>
 | 
				
			||||||
 | 
					                            {this.state.schemaContent[key]}
 | 
				
			||||||
 | 
					                        </Typography>
 | 
				
			||||||
 | 
					                        )                
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            else{
 | 
				
			||||||
 | 
					                return  (
 | 
				
			||||||
 | 
					                        <Typography variant='body2' component="p" id={key}>
 | 
				
			||||||
 | 
					                            {this.state.schemaContent[key]}
 | 
				
			||||||
 | 
					                        </Typography>
 | 
				
			||||||
 | 
					                        )
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if(type === 'textarea'){
 | 
				
			||||||
 | 
					            return  (
 | 
				
			||||||
 | 
					                    <Typography variant='body2' component="p" id={key}>
 | 
				
			||||||
 | 
					                        {this.state.schemaContent[key]}
 | 
				
			||||||
 | 
					                    </Typography>
 | 
				
			||||||
 | 
					                    )               
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if (type === 'media'){
 | 
				
			||||||
 | 
					            for (var val in this.state.schemaContent[key]){
 | 
				
			||||||
 | 
					                global.mediaID = this.state.schemaContent[key][val];
 | 
				
			||||||
 | 
					                return <FlameLinkImage/>
 | 
				
			||||||
 | 
					            } 
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if (type === 'fieldset'){
 | 
				
			||||||
 | 
					            if(this.state.schemaContent === ''){
 | 
				
			||||||
 | 
					                return
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            else{
 | 
				
			||||||
 | 
					                return <FlameLinkFieldSet field={this.state.schemaContent[key]} field2={schemaField.options}/>
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    render() {
 | 
				
			||||||
 | 
					        const { classes } = this.props;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        const lg = this.props.field.gridColumns.lg;
 | 
				
			||||||
 | 
					        const md = this.props.field.gridColumns.md;
 | 
				
			||||||
 | 
					        const sm = this.props.field.gridColumns.sm;
 | 
				
			||||||
 | 
					        const xs = this.props.field.gridColumns.xs;
 | 
				
			||||||
 | 
					        return(
 | 
				
			||||||
 | 
					            <Grid item lg={lg} md={md} sm={sm} xs={xs} className={classes.flamelinkItem}>
 | 
				
			||||||
 | 
					                    {this.getContent(this.props.field, this.props.field.key, this.props.type, this.props.field.description)}
 | 
				
			||||||
 | 
					            </Grid>
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default withStyles(styles)(FlameLinkStructure);
 | 
				
			||||||
@ -1,10 +0,0 @@
 | 
				
			|||||||
import { Component } from 'react';
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class Flamelink extends Component {
 | 
					 | 
				
			||||||
    render() {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        return(null);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
export default Flamelink;
 | 
					 | 
				
			||||||
@ -16,10 +16,12 @@ import MenuIcon from '@material-ui/icons/Menu';
 | 
				
			|||||||
import HomeIcon from '@material-ui/icons/Home';
 | 
					import HomeIcon from '@material-ui/icons/Home';
 | 
				
			||||||
import AssignmentIcon from '@material-ui/icons/Assignment';
 | 
					import AssignmentIcon from '@material-ui/icons/Assignment';
 | 
				
			||||||
import MapIcon from '@material-ui/icons/Map';
 | 
					import MapIcon from '@material-ui/icons/Map';
 | 
				
			||||||
 | 
					import InfoIcon from '@material-ui/icons/Info';
 | 
				
			||||||
import ListIcon from '@material-ui/icons/List';
 | 
					import ListIcon from '@material-ui/icons/List';
 | 
				
			||||||
import SlideshowIcon from '@material-ui/icons/Slideshow';
 | 
					import SlideshowIcon from '@material-ui/icons/Slideshow';
 | 
				
			||||||
import Home from '../pages/Home';
 | 
					import Home from '../pages/Home';
 | 
				
			||||||
import ViewMap from '../pages/ViewMap';
 | 
					import ViewMap from '../pages/ViewMap';
 | 
				
			||||||
 | 
					import Info from '../pages/Info';
 | 
				
			||||||
import Quiz from '../pages/QuizPage';
 | 
					import Quiz from '../pages/QuizPage';
 | 
				
			||||||
import SightingList from '../pages/SightingList';
 | 
					import SightingList from '../pages/SightingList';
 | 
				
			||||||
import Report from '../pages/Report';
 | 
					import Report from '../pages/Report';
 | 
				
			||||||
@ -68,7 +70,7 @@ const styles = theme => ({
 | 
				
			|||||||
class ResponsiveDrawer extends React.Component {
 | 
					class ResponsiveDrawer extends React.Component {
 | 
				
			||||||
    state = {
 | 
					    state = {
 | 
				
			||||||
        mobileOpen: false,
 | 
					        mobileOpen: false,
 | 
				
			||||||
        key: '',
 | 
					        key: 'Home',
 | 
				
			||||||
        open: false
 | 
					        open: false
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -83,7 +85,7 @@ class ResponsiveDrawer extends React.Component {
 | 
				
			|||||||
    nav = (text) => {
 | 
					    nav = (text) => {
 | 
				
			||||||
        this.setState({
 | 
					        this.setState({
 | 
				
			||||||
            key: text
 | 
					            key: text
 | 
				
			||||||
        })
 | 
					        });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    render() {
 | 
					    render() {
 | 
				
			||||||
@ -110,6 +112,10 @@ class ResponsiveDrawer extends React.Component {
 | 
				
			|||||||
                        <ListItemIcon><ListIcon /></ListItemIcon>
 | 
					                        <ListItemIcon><ListIcon /></ListItemIcon>
 | 
				
			||||||
                        <ListItemText primary='List' />
 | 
					                        <ListItemText primary='List' />
 | 
				
			||||||
                    </ListItem>
 | 
					                    </ListItem>
 | 
				
			||||||
 | 
					                    <ListItem button key='About' onClick={() => this.nav('About')}>
 | 
				
			||||||
 | 
					                        <ListItemIcon><InfoIcon /></ListItemIcon>
 | 
				
			||||||
 | 
					                        <ListItemText primary='About' />
 | 
				
			||||||
 | 
					                    </ListItem>
 | 
				
			||||||
                    <ListItem button onClick={this.handleClick}>
 | 
					                    <ListItem button onClick={this.handleClick}>
 | 
				
			||||||
                        <ListItemIcon>
 | 
					                        <ListItemIcon>
 | 
				
			||||||
                            <SlideshowIcon />
 | 
					                            <SlideshowIcon />
 | 
				
			||||||
@ -189,6 +195,7 @@ class ResponsiveDrawer extends React.Component {
 | 
				
			|||||||
                    {this.state.key === 'Report' && <Report />}
 | 
					                    {this.state.key === 'Report' && <Report />}
 | 
				
			||||||
                    {this.state.key === 'Map' && <ViewMap />}
 | 
					                    {this.state.key === 'Map' && <ViewMap />}
 | 
				
			||||||
                    {this.state.key === 'List' && <SightingList />}
 | 
					                    {this.state.key === 'List' && <SightingList />}
 | 
				
			||||||
 | 
					                    {this.state.key === 'About' && <Info />}
 | 
				
			||||||
                    {this.state.key === 'Easy-Quiz' && <Quiz difficulty='Easy'/>}
 | 
					                    {this.state.key === 'Easy-Quiz' && <Quiz difficulty='Easy'/>}
 | 
				
			||||||
                    {this.state.key === 'Medium-Quiz' && <Quiz difficulty='Medium'/>}
 | 
					                    {this.state.key === 'Medium-Quiz' && <Quiz difficulty='Medium'/>}
 | 
				
			||||||
                    {this.state.key === 'Hard-Quiz' && <Quiz difficulty='Hard'/>}
 | 
					                    {this.state.key === 'Hard-Quiz' && <Quiz difficulty='Hard'/>}
 | 
				
			||||||
 | 
				
			|||||||
@ -239,33 +239,33 @@ class QuizGame extends React.Component {
 | 
				
			|||||||
     * @param {*} difficulty The difficulty setting passed in.
 | 
					     * @param {*} difficulty The difficulty setting passed in.
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    pickDifficulty = difficulty => {
 | 
					    pickDifficulty = difficulty => {
 | 
				
			||||||
        let level
 | 
					        let level;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        switch (difficulty) {
 | 
					        switch (difficulty) {
 | 
				
			||||||
            case 'Easy':
 | 
					            case 'Easy':
 | 
				
			||||||
                this.easy.questions = this.shuffleArray(this.easy.questions)
 | 
					                this.easy.questions = this.shuffleArray(this.easy.questions);
 | 
				
			||||||
                level = this.easy
 | 
					                level = this.easy;
 | 
				
			||||||
                break
 | 
					                break;
 | 
				
			||||||
            case 'Medium':
 | 
					            case 'Medium':
 | 
				
			||||||
                this.medium.questions = this.shuffleArray(this.medium.questions)
 | 
					                this.medium.questions = this.shuffleArray(this.medium.questions);
 | 
				
			||||||
                level = this.medium
 | 
					                level = this.medium;
 | 
				
			||||||
                break
 | 
					                break;
 | 
				
			||||||
            case 'Hard':
 | 
					            case 'Hard':
 | 
				
			||||||
                this.hard.questions = this.shuffleArray(this.hard.questions)
 | 
					                this.hard.questions = this.shuffleArray(this.hard.questions);
 | 
				
			||||||
                level = this.hard
 | 
					                level = this.hard;
 | 
				
			||||||
                break
 | 
					                break;
 | 
				
			||||||
            default:
 | 
					            default:
 | 
				
			||||||
                break
 | 
					                break;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return level
 | 
					        return level;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // The state of the component.
 | 
					    // The state of the component.
 | 
				
			||||||
    state = {
 | 
					    state = {
 | 
				
			||||||
        difficulty: this.pickDifficulty(this.props.difficulty),
 | 
					        difficulty: this.pickDifficulty(this.props.difficulty),
 | 
				
			||||||
        key: Math.random()
 | 
					        key: Math.random()
 | 
				
			||||||
    }
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Renders the quiz component.
 | 
					    // Renders the quiz component.
 | 
				
			||||||
    render() {
 | 
					    render() {
 | 
				
			||||||
 | 
				
			|||||||
@ -11,6 +11,8 @@ import CloseIcon from '@material-ui/icons/Close';
 | 
				
			|||||||
import Button from '@material-ui/core/Button';
 | 
					import Button from '@material-ui/core/Button';
 | 
				
			||||||
import firebase from '../firebase.js';
 | 
					import firebase from '../firebase.js';
 | 
				
			||||||
import GoogleMap from '../components/ReportMap';
 | 
					import GoogleMap from '../components/ReportMap';
 | 
				
			||||||
 | 
					import Modal from '@material-ui/core/Modal';
 | 
				
			||||||
 | 
					import Typography from '@material-ui/core/Typography';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * Styles that the different
 | 
					 * Styles that the different
 | 
				
			||||||
@ -51,6 +53,13 @@ const styles = theme => ({
 | 
				
			|||||||
    menu: {
 | 
					    menu: {
 | 
				
			||||||
        width: 200,
 | 
					        width: 200,
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    paper: {
 | 
				
			||||||
 | 
					        position: 'absolute',
 | 
				
			||||||
 | 
					        width: theme.spacing.unit * 50,
 | 
				
			||||||
 | 
					        backgroundColor: theme.palette.background.paper,
 | 
				
			||||||
 | 
					        boxShadow: theme.shadows[5],
 | 
				
			||||||
 | 
					        padding: theme.spacing.unit * 4,
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/** 
 | 
					/** 
 | 
				
			||||||
@ -255,9 +264,25 @@ getMonth = date => {
 | 
				
			|||||||
        desc: '',
 | 
					        desc: '',
 | 
				
			||||||
        lat: '',
 | 
					        lat: '',
 | 
				
			||||||
        lng: '',
 | 
					        lng: '',
 | 
				
			||||||
    open: false
 | 
					        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
 | 
					     * Handles state change in form
 | 
				
			||||||
     * components.
 | 
					     * components.
 | 
				
			||||||
@ -474,7 +499,6 @@ getMonth = date => {
 | 
				
			|||||||
                                        }}
 | 
					                                        }}
 | 
				
			||||||
                                    />
 | 
					                                    />
 | 
				
			||||||
                                </Grid>
 | 
					                                </Grid>
 | 
				
			||||||
 | 
					 | 
				
			||||||
                                <Grid item xs={12}>
 | 
					                                <Grid item xs={12}>
 | 
				
			||||||
                                    <Button variant="contained" type="submit" color="primary" className={classes.button}>
 | 
					                                    <Button variant="contained" type="submit" color="primary" className={classes.button}>
 | 
				
			||||||
                                        Submit
 | 
					                                        Submit
 | 
				
			||||||
@ -482,8 +506,23 @@ getMonth = date => {
 | 
				
			|||||||
                                </Grid>
 | 
					                                </Grid>
 | 
				
			||||||
                            </Grid>
 | 
					                            </Grid>
 | 
				
			||||||
                        </Grid>
 | 
					                        </Grid>
 | 
				
			||||||
            <Grid item xs={12} md={6}>
 | 
					                        <Grid item xs={12} md={6} onMouseEnter={this.handleModalOpen}>
 | 
				
			||||||
                            <GoogleMap onClick={this.getCoordinates}/>
 | 
					                            <GoogleMap onClick={this.getCoordinates}/>
 | 
				
			||||||
 | 
					                            <Modal
 | 
				
			||||||
 | 
					                                aria-labelledby="simple-modal-title"
 | 
				
			||||||
 | 
					                                aria-describedby="simple-modal-description"
 | 
				
			||||||
 | 
					                                open={this.state.openModal}
 | 
				
			||||||
 | 
					                                onClose={this.handleModalClose}
 | 
				
			||||||
 | 
					                            >
 | 
				
			||||||
 | 
					                                <div style={this.getModalStyle()} className={classes.paper}>
 | 
				
			||||||
 | 
					                                    <Typography variant="title" id="modal-title">
 | 
				
			||||||
 | 
					                                        Need a little help?
 | 
				
			||||||
 | 
					                                    </Typography>
 | 
				
			||||||
 | 
					                                    <Typography variant="subheading" id="simple-modal-description">
 | 
				
			||||||
 | 
					                                        Click on the map to drop a pin!
 | 
				
			||||||
 | 
					                                    </Typography>
 | 
				
			||||||
 | 
					                                </div>
 | 
				
			||||||
 | 
					                            </Modal>
 | 
				
			||||||
                        </Grid>
 | 
					                        </Grid>
 | 
				
			||||||
                    </Grid>
 | 
					                    </Grid>
 | 
				
			||||||
                </form>
 | 
					                </form>
 | 
				
			||||||
 | 
				
			|||||||
@ -9,7 +9,7 @@ const API_KEY = 'AIzaSyAZ_0J01bA6wCbIPK4UBq2RUBC-hIqG4mM';
 | 
				
			|||||||
const mapStyles = {
 | 
					const mapStyles = {
 | 
				
			||||||
    width: '100%',
 | 
					    width: '100%',
 | 
				
			||||||
    height: '100%'
 | 
					    height: '100%'
 | 
				
			||||||
}
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export class MapContainer extends Component {
 | 
					export class MapContainer extends Component {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -68,7 +68,7 @@ export class MapContainer extends Component {
 | 
				
			|||||||
                lat: e.latLng.lat(),
 | 
					                lat: e.latLng.lat(),
 | 
				
			||||||
                lng: e.latLng.lng()
 | 
					                lng: e.latLng.lng()
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        })
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let lat = e.latLng.lat();
 | 
					        let lat = e.latLng.lat();
 | 
				
			||||||
        let lng = e.latLng.lng();
 | 
					        let lng = e.latLng.lng();
 | 
				
			||||||
@ -138,6 +138,4 @@ export class MapContainer extends Component {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Send the Google Map API Key with the MapContainer component
 | 
					// Send the Google Map API Key with the MapContainer component
 | 
				
			||||||
export default GoogleApiWrapper({
 | 
					export default GoogleApiWrapper({ apiKey: (API_KEY) })(MapContainer);
 | 
				
			||||||
    apiKey: (API_KEY)
 | 
					 | 
				
			||||||
})(MapContainer)
 | 
					 | 
				
			||||||
@ -1,24 +1,154 @@
 | 
				
			|||||||
import React, { Component, Fragment } from 'react';
 | 
					import React, { Component, Fragment } from 'react';
 | 
				
			||||||
import Disqus from 'disqus-react';
 | 
					import Disqus from 'disqus-react';
 | 
				
			||||||
 | 
					import moment from 'moment';
 | 
				
			||||||
import SightingDetailMap from './SightingDetailMap';
 | 
					import SightingDetailMap from './SightingDetailMap';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** 
 | 
				
			||||||
 | 
					  * 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 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',
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class SightingDetail extends Component {
 | 
					class SightingDetail extends Component {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * Gets formatted type value.
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    getType = item => {
 | 
				
			||||||
 | 
					        for (var i = 0; i < sightingTypes.length; i++) {
 | 
				
			||||||
 | 
					            if (sightingTypes[i].value === item) {
 | 
				
			||||||
 | 
					                return sightingTypes[i].label;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Gets formatted time value.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    getTime = item => {
 | 
				
			||||||
 | 
					        for (var i = 0; i < timeTypes.length; i++) {
 | 
				
			||||||
 | 
					            if (timeTypes[i].value === item) {
 | 
				
			||||||
 | 
					                return timeTypes[i].label;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    * Gets formatted confidence value.
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
 | 
					    getConfidence = item => {
 | 
				
			||||||
 | 
					        for (var i = 0; i < confidenceLevels.length; i++) {
 | 
				
			||||||
 | 
					            if (confidenceLevels[i].value === item) {
 | 
				
			||||||
 | 
					                return confidenceLevels[i].label;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    formatDate = date => {
 | 
				
			||||||
 | 
					        return (moment(date, "YYYY-MM").format("MMMM YYYY").toString());
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    render() {
 | 
					    render() {
 | 
				
			||||||
        const disqusShortname = 'https-marten-application-netlify-com';
 | 
					        const disqusShortname = 'marten-tracker';
 | 
				
			||||||
        const disqusConfig = {
 | 
					        const disqusConfig = {
 | 
				
			||||||
            url: `http://localhost:3000/${this.props.detail.id}`,
 | 
					            url: `http://localhost:3000/${this.props.detail.id}`,
 | 
				
			||||||
            identifier: this.props.detail.id,
 | 
					            identifier: this.props.detail.id,
 | 
				
			||||||
            title: this.props.detail.id
 | 
					            title: this.props.detail.id
 | 
				
			||||||
        }
 | 
					        };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return (
 | 
					        return (
 | 
				
			||||||
            <Fragment>
 | 
					            <Fragment>
 | 
				
			||||||
                <SightingDetailMap lat={this.props.detail.lat} lng={this.props.detail.lng} />
 | 
					                <SightingDetailMap lat={this.props.detail.lat} lng={this.props.detail.lng} />
 | 
				
			||||||
                <div className='sighting-details-content'>
 | 
					                <div className='sighting-details-content'>
 | 
				
			||||||
                    <p>{`Confidence: ${this.props.detail.confidence}`}</p>
 | 
					                    <p><b>Type:</b> {this.getType(this.props.detail.type)}</p>
 | 
				
			||||||
                    <p>{`When: ${this.props.detail.date}, ${this.props.detail.time}`}</p>
 | 
					                    <p><b>When:</b> {this.formatDate(this.props.detail.date)}, {this.getTime(this.props.detail.time)}</p>
 | 
				
			||||||
                    <p>{`Where: ${this.props.detail.lat} degrees N, and ${this.props.detail.lng} degrees E`}</p>
 | 
					                    <p><b>Where:</b> {this.props.detail.lat} degrees N, and {this.props.detail.lng} degrees E</p>
 | 
				
			||||||
 | 
					                    <p><b>I am confident of my sighting:</b> {this.getConfidence(this.props.detail.confidence)}</p>
 | 
				
			||||||
 | 
					                    <hr/>
 | 
				
			||||||
                    <p>{`${this.props.detail.desc}`}</p>
 | 
					                    <p>{`${this.props.detail.desc}`}</p>
 | 
				
			||||||
                </div>
 | 
					                </div>
 | 
				
			||||||
                <Disqus.DiscussionEmbed shortname={disqusShortname} config={disqusConfig} />
 | 
					                <Disqus.DiscussionEmbed shortname={disqusShortname} config={disqusConfig} />
 | 
				
			||||||
 | 
				
			|||||||
@ -8,7 +8,7 @@ const API_KEY = 'AIzaSyAZ_0J01bA6wCbIPK4UBq2RUBC-hIqG4mM';
 | 
				
			|||||||
const mapStyles = {
 | 
					const mapStyles = {
 | 
				
			||||||
    width: '100%',
 | 
					    width: '100%',
 | 
				
			||||||
    height: '100%'
 | 
					    height: '100%'
 | 
				
			||||||
}
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export class MapContainer extends Component {
 | 
					export class MapContainer extends Component {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -33,6 +33,4 @@ export class MapContainer extends Component {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Send the Google Map API Key with the MapContainer component
 | 
					// Send the Google Map API Key with the MapContainer component
 | 
				
			||||||
export default GoogleApiWrapper({
 | 
					export default GoogleApiWrapper({ apiKey: (API_KEY) })(MapContainer);
 | 
				
			||||||
    apiKey: (API_KEY)
 | 
					 | 
				
			||||||
})(MapContainer)
 | 
					 | 
				
			||||||
@ -1,6 +1,6 @@
 | 
				
			|||||||
import React, { Component, Fragment } from 'react';
 | 
					import React, { Component, Fragment } from 'react';
 | 
				
			||||||
import { Map, InfoWindow, Marker, GoogleApiWrapper } from 'google-maps-react';
 | 
					import { Map, InfoWindow, Marker, GoogleApiWrapper } from 'google-maps-react';
 | 
				
			||||||
import moment from 'moment'
 | 
					import moment from 'moment';
 | 
				
			||||||
import Typography from '@material-ui/core/Typography';
 | 
					import Typography from '@material-ui/core/Typography';
 | 
				
			||||||
import firebase from '../firebase.js';
 | 
					import firebase from '../firebase.js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -11,7 +11,7 @@ const API_KEY = 'AIzaSyAZ_0J01bA6wCbIPK4UBq2RUBC-hIqG4mM';
 | 
				
			|||||||
const mapStyles = {
 | 
					const mapStyles = {
 | 
				
			||||||
    width: '100%',
 | 
					    width: '100%',
 | 
				
			||||||
    height: '100%'
 | 
					    height: '100%'
 | 
				
			||||||
}
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/** 
 | 
					/** 
 | 
				
			||||||
  * Types of sightings. Label is what is
 | 
					  * Types of sightings. Label is what is
 | 
				
			||||||
@ -81,23 +81,23 @@ const timeTypes = [
 | 
				
			|||||||
const confidenceLevels = [
 | 
					const confidenceLevels = [
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        value: '1',
 | 
					        value: '1',
 | 
				
			||||||
        label: '1 - Strongly unconfident',
 | 
					        label: '1 - Strongly disagree',
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        value: '2',
 | 
					        value: '2',
 | 
				
			||||||
        label: '2 - Unconfident',
 | 
					        label: '2 - Disagree',
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        value: '3',
 | 
					        value: '3',
 | 
				
			||||||
        label: '3 - Somewhat confident',
 | 
					        label: '3 - Neutral',
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        value: '4',
 | 
					        value: '4',
 | 
				
			||||||
        label: '4 - Confident',
 | 
					        label: '4 - Agree',
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        value: '5',
 | 
					        value: '5',
 | 
				
			||||||
        label: '5 - Very confident',
 | 
					        label: '5 - Strongly agree',
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
];
 | 
					];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -112,9 +112,8 @@ export class MapContainer extends Component {
 | 
				
			|||||||
                        lat: position.coords.latitude,
 | 
					                        lat: position.coords.latitude,
 | 
				
			||||||
                        lng: position.coords.longitude
 | 
					                        lng: position.coords.longitude
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                });
 | 
				
			||||||
                );
 | 
					            });
 | 
				
			||||||
            })
 | 
					 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            // If browser doesn't support geolocation or if user does not allow it, 
 | 
					            // If browser doesn't support geolocation or if user does not allow it, 
 | 
				
			||||||
            // center map on Grand Rapids, Michigan
 | 
					            // center map on Grand Rapids, Michigan
 | 
				
			||||||
@ -123,8 +122,7 @@ export class MapContainer extends Component {
 | 
				
			|||||||
                    lat: 42.9634,
 | 
					                    lat: 42.9634,
 | 
				
			||||||
                    lng: 85.6681
 | 
					                    lng: 85.6681
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            });
 | 
				
			||||||
            );
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -209,6 +207,42 @@ export class MapContainer extends Component {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Determines marker icon based on the
 | 
				
			||||||
 | 
					     * sighting type.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    sightingIcon = (type) => {
 | 
				
			||||||
 | 
					        let pinIcon;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        switch(type) {
 | 
				
			||||||
 | 
					            case 'visual':
 | 
				
			||||||
 | 
					                pinIcon = '/mapicons/marten-icon.png';
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            case 'roadkill':
 | 
				
			||||||
 | 
					                pinIcon = '/mapicons/tire-icon.png';
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            case 'viewed_tracks':
 | 
				
			||||||
 | 
					                pinIcon = '/mapicons/paws.png';
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            case 'trapped':
 | 
				
			||||||
 | 
					                pinIcon = '/mapicons/cage.png';
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            case 'photo':
 | 
				
			||||||
 | 
					                pinIcon = '/mapicons/photo-icon.png';
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            case 'other':
 | 
				
			||||||
 | 
					                pinIcon = '/mapicons/other-icon.png';
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            default:
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return pinIcon;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Formats date using Moment.js.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
    formatDate = date => {
 | 
					    formatDate = date => {
 | 
				
			||||||
        return (moment(date, "YYYY-MM").format("MMMM YYYY").toString())
 | 
					        return (moment(date, "YYYY-MM").format("MMMM YYYY").toString())
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@ -224,9 +258,11 @@ export class MapContainer extends Component {
 | 
				
			|||||||
        activeMarker: {},
 | 
					        activeMarker: {},
 | 
				
			||||||
        selectedPlace: {},
 | 
					        selectedPlace: {},
 | 
				
			||||||
        sightings: []
 | 
					        sightings: []
 | 
				
			||||||
    }
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    render() {
 | 
					    render() {
 | 
				
			||||||
 | 
					        const {google} = this.props;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return (
 | 
					        return (
 | 
				
			||||||
            // Render the Google Map, Marker, and InfoWindow components
 | 
					            // Render the Google Map, Marker, and InfoWindow components
 | 
				
			||||||
            <div className="sighting-google-map-container">
 | 
					            <div className="sighting-google-map-container">
 | 
				
			||||||
@ -235,9 +271,15 @@ export class MapContainer extends Component {
 | 
				
			|||||||
                    google={this.props.google}
 | 
					                    google={this.props.google}
 | 
				
			||||||
                    initialCenter={this.state.myLatLng}
 | 
					                    initialCenter={this.state.myLatLng}
 | 
				
			||||||
                    center={this.state.myLatLng}
 | 
					                    center={this.state.myLatLng}
 | 
				
			||||||
 | 
					<<<<<<< HEAD
 | 
				
			||||||
                    minZoom={6}
 | 
					                    minZoom={6}
 | 
				
			||||||
                    zoom={6}
 | 
					                    zoom={6}
 | 
				
			||||||
                    onClick={this.onMapClick} >
 | 
					                    onClick={this.onMapClick} >
 | 
				
			||||||
 | 
					=======
 | 
				
			||||||
 | 
					                    defaultZoom={15}
 | 
				
			||||||
 | 
					                    onClick={this.onMapClick}
 | 
				
			||||||
 | 
					                >
 | 
				
			||||||
 | 
					>>>>>>> 80a73145f79c96ee62e901f94528550ad8761cca
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    <Marker
 | 
					                    <Marker
 | 
				
			||||||
                        position={this.state.myLatLng}
 | 
					                        position={this.state.myLatLng}
 | 
				
			||||||
@ -246,16 +288,24 @@ export class MapContainer extends Component {
 | 
				
			|||||||
                    />
 | 
					                    />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    {this.state.sightings.map((sighting) => {
 | 
					                    {this.state.sightings.map((sighting) => {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        let pinIcon = this.sightingIcon(sighting.type)
 | 
				
			||||||
 | 
					                        
 | 
				
			||||||
                        return (
 | 
					                        return (
 | 
				
			||||||
                            <Marker
 | 
					                            <Marker
 | 
				
			||||||
                                key={sighting.id}
 | 
					                                key={sighting.id}
 | 
				
			||||||
                                position={{ lat: sighting.lat, lng: sighting.lng }}
 | 
					                                position={{ lat: sighting.lat, lng: sighting.lng }}
 | 
				
			||||||
                                onClick={this.onMarkerClick}
 | 
					                                onClick={this.onMarkerClick}
 | 
				
			||||||
                                type={'Type: ' + this.getType(sighting.type)}
 | 
					                                type={'Type: ' + this.getType(sighting.type)}
 | 
				
			||||||
                                confidence={<Fragment><b>Confidence:</b> {this.getConfidence(sighting.confidence)}</Fragment>}
 | 
					 | 
				
			||||||
                                date={<Fragment><b>Date:</b> {this.formatDate(sighting.date)}</Fragment>}
 | 
					                                date={<Fragment><b>Date:</b> {this.formatDate(sighting.date)}</Fragment>}
 | 
				
			||||||
                                time={<Fragment><b>Time:</b> {this.getTime(sighting.time)}</Fragment>}
 | 
					                                time={<Fragment><b>Time:</b> {this.getTime(sighting.time)}</Fragment>}
 | 
				
			||||||
 | 
					                                confidence={<Fragment><b>I am confident of my sighting:</b> {this.getConfidence(sighting.confidence)}</Fragment>}
 | 
				
			||||||
                                description={<Fragment><b>Description:</b> {sighting.desc}</Fragment>}
 | 
					                                description={<Fragment><b>Description:</b> {sighting.desc}</Fragment>}
 | 
				
			||||||
 | 
					                                icon={{
 | 
				
			||||||
 | 
					                                    url: pinIcon,
 | 
				
			||||||
 | 
					                                    anchor: new google.maps.Point(32,32),
 | 
				
			||||||
 | 
					                                    scaledSize: new google.maps.Size(32,32)
 | 
				
			||||||
 | 
					                                }}
 | 
				
			||||||
                            />
 | 
					                            />
 | 
				
			||||||
                        )
 | 
					                        )
 | 
				
			||||||
                    })}
 | 
					                    })}
 | 
				
			||||||
@ -268,15 +318,15 @@ export class MapContainer extends Component {
 | 
				
			|||||||
                            <Typography variant="display1" gutterBottom>
 | 
					                            <Typography variant="display1" gutterBottom>
 | 
				
			||||||
                                {this.state.selectedPlace.type}
 | 
					                                {this.state.selectedPlace.type}
 | 
				
			||||||
                            </Typography>
 | 
					                            </Typography>
 | 
				
			||||||
                            <Typography variant="subheading" gutterBottom>
 | 
					 | 
				
			||||||
                                {this.state.selectedPlace.confidence}
 | 
					 | 
				
			||||||
                            </Typography>
 | 
					 | 
				
			||||||
                            <Typography variant="subheading" gutterBottom>
 | 
					                            <Typography variant="subheading" gutterBottom>
 | 
				
			||||||
                                {this.state.selectedPlace.date}
 | 
					                                {this.state.selectedPlace.date}
 | 
				
			||||||
                            </Typography>
 | 
					                            </Typography>
 | 
				
			||||||
                            <Typography variant="subheading" gutterBottom>
 | 
					                            <Typography variant="subheading" gutterBottom>
 | 
				
			||||||
                                {this.state.selectedPlace.time}
 | 
					                                {this.state.selectedPlace.time}
 | 
				
			||||||
                            </Typography>
 | 
					                            </Typography>
 | 
				
			||||||
 | 
					                            <Typography variant="subheading" gutterBottom>
 | 
				
			||||||
 | 
					                                {this.state.selectedPlace.confidence}
 | 
				
			||||||
 | 
					                            </Typography>
 | 
				
			||||||
                            <Typography variant="subheading" gutterBottom>
 | 
					                            <Typography variant="subheading" gutterBottom>
 | 
				
			||||||
                                {this.state.selectedPlace.description}
 | 
					                                {this.state.selectedPlace.description}
 | 
				
			||||||
                            </Typography>
 | 
					                            </Typography>
 | 
				
			||||||
@ -289,6 +339,4 @@ export class MapContainer extends Component {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Send the Google Map API Key with the MapContainer component
 | 
					// Send the Google Map API Key with the MapContainer component
 | 
				
			||||||
export default GoogleApiWrapper({
 | 
					export default GoogleApiWrapper({ apiKey: (API_KEY) })(MapContainer);
 | 
				
			||||||
    apiKey: (API_KEY)
 | 
					 | 
				
			||||||
})(MapContainer)
 | 
					 | 
				
			||||||
@ -16,7 +16,7 @@ class ViewSightings extends Component {
 | 
				
			|||||||
            let newState = [];
 | 
					            let newState = [];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            for (let sighting in sightings) {
 | 
					            for (let sighting in sightings) {
 | 
				
			||||||
                newState.push({
 | 
					                newState.unshift({
 | 
				
			||||||
                    id: sighting,
 | 
					                    id: sighting,
 | 
				
			||||||
                    lat: sightings[sighting].lat,
 | 
					                    lat: sightings[sighting].lat,
 | 
				
			||||||
                    lng: sightings[sighting].lng,
 | 
					                    lng: sightings[sighting].lng,
 | 
				
			||||||
@ -62,7 +62,7 @@ class ViewSightings extends Component {
 | 
				
			|||||||
            time: null
 | 
					            time: null
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        clicked: false
 | 
					        clicked: false
 | 
				
			||||||
    }
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    render() {
 | 
					    render() {
 | 
				
			||||||
        return (
 | 
					        return (
 | 
				
			||||||
@ -77,7 +77,7 @@ class ViewSightings extends Component {
 | 
				
			|||||||
                                        <ListItem button key={ sighting.id } onClick={() => this.getDetail(sighting.id, sighting.lat, sighting.lng, sighting.desc, sighting.type, sighting.confidence, sighting.date, sighting.time)}>
 | 
					                                        <ListItem button key={ sighting.id } onClick={() => this.getDetail(sighting.id, sighting.lat, sighting.lng, sighting.desc, sighting.type, sighting.confidence, sighting.date, sighting.time)}>
 | 
				
			||||||
                                            <ListItemText primary={`${sighting.desc}`}/>
 | 
					                                            <ListItemText primary={`${sighting.desc}`}/>
 | 
				
			||||||
                                        </ListItem>
 | 
					                                        </ListItem>
 | 
				
			||||||
                                    )
 | 
					                                    );
 | 
				
			||||||
                                })
 | 
					                                })
 | 
				
			||||||
                            }
 | 
					                            }
 | 
				
			||||||
                            </List>
 | 
					                            </List>
 | 
				
			||||||
 | 
				
			|||||||
@ -6,4 +6,6 @@ import registerServiceWorker from './registerServiceWorker';
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
ReactDOM.render(<App/>, document.getElementById('root'));
 | 
					ReactDOM.render(<App/>, document.getElementById('root'));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					document.title = "Marten Tracker | Home";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
registerServiceWorker();
 | 
					registerServiceWorker();
 | 
				
			||||||
 | 
				
			|||||||
@ -1,15 +1,30 @@
 | 
				
			|||||||
import React, { Component } from 'react';
 | 
					import React, { Component } from 'react';
 | 
				
			||||||
import Typography from '@material-ui/core/Typography';
 | 
					import FlameLinkComponentCreations from '../components/FlameLinkComponentCreations';
 | 
				
			||||||
 | 
					import flamelinkApp from '../flamelink';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Home extends Component {
 | 
					class Home extends Component {
 | 
				
			||||||
 | 
					    constructor() {
 | 
				
			||||||
 | 
					        super();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        global.schemaName = 'martenHome';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        this.state = {
 | 
				
			||||||
 | 
					            schemaDetails: '',
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        flamelinkApp.schemas.getFields(global.schemaName, { fields: ['title', 'key', 'type', 'gridColumns', 'description', 'options'] })
 | 
				
			||||||
 | 
					            .then(result => this.setState({
 | 
				
			||||||
 | 
					                schemaDetails: result
 | 
				
			||||||
 | 
					            }))
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    componentDidMount() {
 | 
				
			||||||
 | 
					        document.title = 'Marten Tracker | Home';
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    render() {
 | 
					    render() {
 | 
				
			||||||
        return (
 | 
					        return (
 | 
				
			||||||
            <div>
 | 
					            <FlameLinkComponentCreations schemaDetails={this.state.schemaDetails} />
 | 
				
			||||||
                <Typography variant='display1' align='center' gutterBottom>
 | 
					 | 
				
			||||||
                    Home
 | 
					 | 
				
			||||||
                </Typography>
 | 
					 | 
				
			||||||
            </div>
 | 
					 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -1,17 +1,34 @@
 | 
				
			|||||||
import React, { Component } from 'react';
 | 
					import React, { Component, Fragment } from 'react';
 | 
				
			||||||
import Typography from '@material-ui/core/Typography';
 | 
					import FlameLinkComponentCreations from '../components/FlameLinkComponentCreations';
 | 
				
			||||||
import Flamelink from '../components/Flamelink';
 | 
					import flamelinkApp from '../flamelink.js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Info extends Component {
 | 
					class Info extends Component {
 | 
				
			||||||
 | 
					    constructor() {
 | 
				
			||||||
 | 
					        super();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        global.schemaName = 'martenSchemaDemo';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        this.state = {
 | 
				
			||||||
 | 
					            schemaDetails: '',
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        flamelinkApp.schemas.getFields(global.schemaName, { fields: ['title', 'key', 'type', 'gridColumns', 'description', 'options'] })
 | 
				
			||||||
 | 
					            .then(result => this.setState({
 | 
				
			||||||
 | 
					                schemaDetails: result
 | 
				
			||||||
 | 
					            }))
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    componentDidMount() {
 | 
				
			||||||
 | 
					        document.title = 'Marten Tracker | Info';
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    render() {
 | 
					    render() {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return (
 | 
					        return (
 | 
				
			||||||
            <div>
 | 
					            <div>
 | 
				
			||||||
                <Flamelink flamelinkApp={this.props.flamelinkApp}/>
 | 
					                <Fragment>
 | 
				
			||||||
                <Typography variant='display1' align='center' gutterBottom>
 | 
					                    <FlameLinkComponentCreations schemaDetails={this.state.schemaDetails} />
 | 
				
			||||||
                    Info
 | 
					                </Fragment>
 | 
				
			||||||
                </Typography>
 | 
					 | 
				
			||||||
                <p id="flamelinkDemo"></p>
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
 | 
				
			|||||||
@ -3,6 +3,10 @@ import QuizGame from '../components/QuizGame';
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class QuizPage extends Component {
 | 
					class QuizPage extends Component {
 | 
				
			||||||
 | 
					    componentDidMount() {
 | 
				
			||||||
 | 
					        document.title = 'Marten Tracker | Quiz';
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    render() {
 | 
					    render() {
 | 
				
			||||||
        return (
 | 
					        return (
 | 
				
			||||||
            <QuizGame difficulty={this.props.difficulty}/>
 | 
					            <QuizGame difficulty={this.props.difficulty}/>
 | 
				
			||||||
 | 
				
			|||||||
@ -2,6 +2,10 @@ import React, { Component } from 'react';
 | 
				
			|||||||
import ReportForm from '../components/ReportForm';
 | 
					import ReportForm from '../components/ReportForm';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Report extends Component {
 | 
					class Report extends Component {
 | 
				
			||||||
 | 
					    componentDidMount() {
 | 
				
			||||||
 | 
					        document.title = 'Marten Tracker | Report';
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    render() {
 | 
					    render() {
 | 
				
			||||||
        return (
 | 
					        return (
 | 
				
			||||||
            <ReportForm/>
 | 
					            <ReportForm/>
 | 
				
			||||||
 | 
				
			|||||||
@ -2,6 +2,10 @@ import React, { Component } from 'react';
 | 
				
			|||||||
import ViewSightings from '../components/ViewSightings.js';
 | 
					import ViewSightings from '../components/ViewSightings.js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Sighting extends Component {
 | 
					class Sighting extends Component {
 | 
				
			||||||
 | 
					    componentDidMount() {
 | 
				
			||||||
 | 
					        document.title = 'Marten Tracker | List';
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    render() {
 | 
					    render() {
 | 
				
			||||||
        return (
 | 
					        return (
 | 
				
			||||||
            <ViewSightings/>
 | 
					            <ViewSightings/>
 | 
				
			||||||
 | 
				
			|||||||
@ -2,6 +2,10 @@ import React, { Component } from 'react';
 | 
				
			|||||||
import GoogleMap from '../components/SightingMap';
 | 
					import GoogleMap from '../components/SightingMap';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Sighting extends Component {
 | 
					class Sighting extends Component {
 | 
				
			||||||
 | 
					    componentDidMount() {
 | 
				
			||||||
 | 
					        document.title = 'Marten Tracker | Map';
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    render() {
 | 
					    render() {
 | 
				
			||||||
        return (
 | 
					        return (
 | 
				
			||||||
            <div className='sighting-map'>
 | 
					            <div className='sighting-map'>
 | 
				
			||||||
 | 
				
			|||||||