added sighting list, and custom comment thread
This commit is contained in:
parent
16f6dde825
commit
4d0188d144
|
@ -3051,6 +3051,16 @@
|
||||||
"sha.js": "^2.4.8"
|
"sha.js": "^2.4.8"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"create-react-class": {
|
||||||
|
"version": "15.6.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.6.3.tgz",
|
||||||
|
"integrity": "sha512-M+/3Q6E6DLO6Yx3OwrWjwHBnvfXXYA7W+dFjt/ZDBemHO1DDZhsalX/NUtnTYclN6GfnBDRh4qRHjcDHmlJBJg==",
|
||||||
|
"requires": {
|
||||||
|
"fbjs": "^0.8.9",
|
||||||
|
"loose-envify": "^1.3.1",
|
||||||
|
"object-assign": "^4.1.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
"cross-spawn": {
|
"cross-spawn": {
|
||||||
"version": "5.1.0",
|
"version": "5.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
|
||||||
|
@ -3567,6 +3577,40 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"disqus-react": {
|
||||||
|
"version": "1.0.5",
|
||||||
|
"resolved": "https://registry.npmjs.org/disqus-react/-/disqus-react-1.0.5.tgz",
|
||||||
|
"integrity": "sha1-go6hhr0kHF4qbf66tRNeUqLZHRE=",
|
||||||
|
"requires": {
|
||||||
|
"react": "^15.6.1",
|
||||||
|
"react-dom": "^15.6.1"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"react": {
|
||||||
|
"version": "15.6.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/react/-/react-15.6.2.tgz",
|
||||||
|
"integrity": "sha1-26BDSrQ5z+gvEI8PURZjkIF5qnI=",
|
||||||
|
"requires": {
|
||||||
|
"create-react-class": "^15.6.0",
|
||||||
|
"fbjs": "^0.8.9",
|
||||||
|
"loose-envify": "^1.1.0",
|
||||||
|
"object-assign": "^4.1.0",
|
||||||
|
"prop-types": "^15.5.10"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"react-dom": {
|
||||||
|
"version": "15.6.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/react-dom/-/react-dom-15.6.2.tgz",
|
||||||
|
"integrity": "sha1-Qc+t9pO3V/rycIRDodH9WgK+9zA=",
|
||||||
|
"requires": {
|
||||||
|
"fbjs": "^0.8.9",
|
||||||
|
"loose-envify": "^1.1.0",
|
||||||
|
"object-assign": "^4.1.0",
|
||||||
|
"prop-types": "^15.5.10"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"dns-equal": {
|
"dns-equal": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz",
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
"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",
|
||||||
|
"disqus-react": "^1.0.5",
|
||||||
"firebase": "^5.5.2",
|
"firebase": "^5.5.2",
|
||||||
"firebase-admin": "^6.0.0",
|
"firebase-admin": "^6.0.0",
|
||||||
"flamelink": "^0.19.2",
|
"flamelink": "^0.19.2",
|
||||||
|
|
|
@ -0,0 +1,27 @@
|
||||||
|
import React, { Component, Fragment } from 'react';
|
||||||
|
import Disqus from 'disqus-react';
|
||||||
|
|
||||||
|
class SightingDetail extends Component {
|
||||||
|
|
||||||
|
componentDidUpdate() {
|
||||||
|
window.history.pushState("", "", this.props.detail.id);
|
||||||
|
}
|
||||||
|
|
||||||
|
render() {
|
||||||
|
const disqusShortname = 'https-marten-application-netlify-com';
|
||||||
|
const disqusConfig = {
|
||||||
|
url: `http://localhost:3000/${this.props.detail.id}`,
|
||||||
|
identifier: this.props.detail.id,
|
||||||
|
title: this.props.detail.id
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Fragment>
|
||||||
|
<p>{this.props.detail.type}</p>
|
||||||
|
<Disqus.DiscussionEmbed shortname={disqusShortname} config={disqusConfig} />
|
||||||
|
</Fragment>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default SightingDetail;
|
|
@ -1,232 +1,97 @@
|
||||||
import React, {Fragment} from 'react';
|
import React, { Component, Fragment } from 'react';
|
||||||
import PropTypes from 'prop-types';
|
|
||||||
import Grid from '@material-ui/core/Grid';
|
import Grid from '@material-ui/core/Grid';
|
||||||
import TextField from '@material-ui/core/TextField'
|
|
||||||
import Button from '@material-ui/core/Button'
|
|
||||||
import Paper from '@material-ui/core/Paper'
|
|
||||||
import { withStyles } from '@material-ui/core/styles';
|
|
||||||
import Typography from '@material-ui/core/Typography';
|
|
||||||
import firebase from '../firebase.js';
|
import firebase from '../firebase.js';
|
||||||
|
import List from '@material-ui/core/List';
|
||||||
|
import ListItem from '@material-ui/core/ListItem';
|
||||||
|
import ListItemIcon from '@material-ui/core/ListItemIcon';
|
||||||
|
import ListItemText from '@material-ui/core/ListItemText';
|
||||||
|
import HomeIcon from '@material-ui/icons/Home';
|
||||||
|
import SightingDetail from './SightingDetail';
|
||||||
|
|
||||||
const styles = theme => ({
|
class ViewSightings extends Component {
|
||||||
root: {
|
|
||||||
...theme.mixins.gutters(),
|
|
||||||
paddingTop: theme.spacing.unit * 2,
|
|
||||||
paddingBottom: theme.spacing.unit * 2,
|
|
||||||
},
|
|
||||||
container: {
|
|
||||||
display: 'flex',
|
|
||||||
flexWrap: 'wrap',
|
|
||||||
},
|
|
||||||
textField: {
|
|
||||||
marginLeft: theme.spacing.unit * 2,
|
|
||||||
marginRight: theme.spacing.unit * 2,
|
|
||||||
marginTop: theme.spacing.unit * 2,
|
|
||||||
flexBasis: 280,
|
|
||||||
},
|
|
||||||
button: {
|
|
||||||
marginLeft: theme.spacing.unit * 3,
|
|
||||||
marginRight: theme.spacing.unit * 3,
|
|
||||||
marginTop: theme.spacing.unit * 3,
|
|
||||||
},
|
|
||||||
paper: {
|
|
||||||
marginLeft: theme.spacing.unit * 2,
|
|
||||||
marginRight: theme.spacing.unit,
|
|
||||||
marginTop: theme.spacing.unit * 2,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
/**
|
componentDidMount() {
|
||||||
* Types of sightings. Label is what is
|
const sightingsRef = firebase.database().ref('sightings');
|
||||||
* 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',
|
|
||||||
},
|
|
||||||
];
|
|
||||||
|
|
||||||
/**
|
sightingsRef.on('value', (snapshot) => {
|
||||||
* Levels of confidence. Label is what is
|
let sightings = snapshot.val();
|
||||||
* viewed in the application, value is
|
let newState = [];
|
||||||
* what is stored in the database.
|
|
||||||
*/
|
|
||||||
const confidenceLevels = [
|
|
||||||
{
|
|
||||||
value: '1',
|
|
||||||
label: '1 - Strongly unconfident',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
value: '2',
|
|
||||||
label: '2 - Unconfident',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
value: '3',
|
|
||||||
label: '3 - Somewhat confident',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
value: '4',
|
|
||||||
label: '4 - Confident',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
value: '5',
|
|
||||||
label: '5 - Very confident',
|
|
||||||
},
|
|
||||||
];
|
|
||||||
|
|
||||||
/**
|
for (let sighting in sightings) {
|
||||||
* Gets formatted confidence value.
|
newState.push({
|
||||||
*/
|
id: sighting,
|
||||||
function getConfidence(item) {
|
lat: sightings[sighting].lat,
|
||||||
for (var i = 0; i < confidenceLevels.length; i++) {
|
lng: sightings[sighting].lng,
|
||||||
if (confidenceLevels[i].value === item) {
|
desc: sightings[sighting].desc,
|
||||||
return confidenceLevels[i].label;
|
type: sightings[sighting].type,
|
||||||
|
confidence: sightings[sighting].confidence,
|
||||||
|
date: sightings[sighting].date,
|
||||||
|
time: sightings[sighting].time
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
this.setState({
|
||||||
|
sightings: newState
|
||||||
|
});
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
getDetail = (id, lat, lng, desc, type, confidence, date, time) => {
|
||||||
* Gets formatted type value.
|
this.setState({
|
||||||
*/
|
selectedSighting: {
|
||||||
function getType(item) {
|
id: id,
|
||||||
for (var i = 0; i < sightingTypes.length; i++) {
|
lat: lat,
|
||||||
if (sightingTypes[i].value === item) {
|
lng: lng,
|
||||||
return sightingTypes[i].label;
|
desc: desc,
|
||||||
}
|
type: type,
|
||||||
}
|
confidence: confidence,
|
||||||
}
|
date: date,
|
||||||
|
time: time
|
||||||
class ViewSightings extends React.Component {
|
},
|
||||||
constructor(props){
|
clicked: true
|
||||||
super(props);
|
})
|
||||||
|
|
||||||
this.handleSubmit = this.handleSubmit.bind(this);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
state = {
|
state = {
|
||||||
id: '',
|
sightings: [],
|
||||||
type: 'N/A',
|
selectedSighting: {
|
||||||
confidence: 'N/A',
|
id: null,
|
||||||
date: 'N/A',
|
lat: null,
|
||||||
time: 'N/A',
|
lng: null,
|
||||||
desc: 'N/A',
|
desc: null,
|
||||||
lat: 'N/A',
|
type: null,
|
||||||
lng: 'N/A'
|
confidence: null,
|
||||||
};
|
date: null,
|
||||||
|
time: null
|
||||||
|
},
|
||||||
|
clicked: false
|
||||||
|
}
|
||||||
|
|
||||||
|
render() {
|
||||||
/**
|
|
||||||
* Handles state change.
|
|
||||||
*/
|
|
||||||
handleChange = name => event => {
|
|
||||||
this.setState({
|
|
||||||
[name]: event.target.value,
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handles submit on search.
|
|
||||||
*/
|
|
||||||
handleSubmit(e){
|
|
||||||
e.preventDefault();
|
|
||||||
const itemSighting = firebase.database().ref("sightings/" + this.state.id);
|
|
||||||
itemSighting.once("value").then((snapshot) => {
|
|
||||||
// Die if there's no data for that ID.
|
|
||||||
if (!snapshot.exists()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
let data = snapshot.val();
|
|
||||||
|
|
||||||
this.setState({
|
|
||||||
date: data.date,
|
|
||||||
time: data.time,
|
|
||||||
type: getType(data.type),
|
|
||||||
confidence: getConfidence(data.confidence),
|
|
||||||
desc: data.desc,
|
|
||||||
lat: data.lat,
|
|
||||||
lng: data.lng
|
|
||||||
});
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
render(){
|
|
||||||
const { classes } = this.props;
|
|
||||||
return (
|
return (
|
||||||
/**
|
|
||||||
* The below houses the search
|
|
||||||
* and submit button along with
|
|
||||||
* the sighting information
|
|
||||||
* it pulls.
|
|
||||||
*/
|
|
||||||
<Fragment>
|
<Fragment>
|
||||||
<Grid container justify="center">
|
<Grid container>
|
||||||
<form className={classes.container} onSubmit={this.handleSubmit}>
|
<Grid item xs={12} md={6}>
|
||||||
<Grid item xs={6}>
|
<Fragment>
|
||||||
<TextField
|
<List>
|
||||||
id="sighting-id"
|
{
|
||||||
name="sighting-id"
|
this.state.sightings.map((sighting) => {
|
||||||
label="Input ID"
|
return (
|
||||||
value={this.state.id}
|
<ListItem button key={ sighting.id } onClick={() => this.getDetail(sighting.id, sighting.lat, sighting.lng, sighting.desc, sighting.type, sighting.confidence, sighting.date, sighting.time)}>
|
||||||
margin="normal"
|
<ListItemIcon><HomeIcon/></ListItemIcon>
|
||||||
onChange={this.handleChange('id')}
|
<ListItemText primary={`Type: ${sighting.type}`}/>
|
||||||
/>
|
</ListItem>
|
||||||
|
)
|
||||||
|
})}
|
||||||
|
</List>
|
||||||
|
</Fragment>
|
||||||
</Grid>
|
</Grid>
|
||||||
<Grid item xs={6}>
|
<Grid item xs={12} md={6}>
|
||||||
<Button variant="contained" type="submit" color="primary" className={classes.button}>
|
{this.state.clicked === true && <SightingDetail detail={ this.state.selectedSighting }/>}
|
||||||
Submit
|
|
||||||
</Button>
|
|
||||||
</Grid>
|
|
||||||
</form>
|
|
||||||
<Grid item xs={12}>
|
|
||||||
<Paper elevation={2}>
|
|
||||||
<Typography variant="headline" component="h3">
|
|
||||||
Sighting
|
|
||||||
</Typography>
|
|
||||||
<Typography component="p">
|
|
||||||
<b>Type:</b> {this.state.type} {<br/>}
|
|
||||||
<b>Confidence:</b> {this.state.confidence} {<br/>}
|
|
||||||
<b>Date:</b> {this.state.date} {<br/>}
|
|
||||||
<b>Time:</b> {this.state.time} {<br/>}
|
|
||||||
<b>Latitude:</b> {this.state.lat} {<br/>}
|
|
||||||
<b>Longitude:</b> {this.state.lng} {<br/>}
|
|
||||||
<b>Description:</b> {this.state.desc}
|
|
||||||
</Typography>
|
|
||||||
</Paper>
|
|
||||||
</Grid>
|
</Grid>
|
||||||
</Grid>
|
</Grid>
|
||||||
</Fragment>
|
</Fragment>
|
||||||
)
|
);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ViewSightings.propTypes = {
|
export default ViewSightings;
|
||||||
classes: PropTypes.object.isRequired,
|
|
||||||
};
|
|
||||||
|
|
||||||
export default withStyles(styles)(ViewSightings);
|
|
||||||
|
|
|
@ -1,13 +1,10 @@
|
||||||
import React, { Component } from 'react';
|
import React, { Component } from 'react';
|
||||||
import ViewSightings from '../components/ViewSightings.js';
|
import ViewSightings from '../components/ViewSightings.js';
|
||||||
import Typography from '@material-ui/core/Typography';
|
|
||||||
|
|
||||||
class Sighting extends Component {
|
class Sighting extends Component {
|
||||||
render() {
|
render() {
|
||||||
return (
|
return (
|
||||||
<Typography variant='display1' align='center' gutterBottom>
|
<ViewSightings/>
|
||||||
<ViewSightings/>
|
|
||||||
</Typography>
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue