Client: activities navigation

This commit is contained in:
Sam 2018-05-17 15:13:53 +02:00
parent f744eb0769
commit 948e49beef
5 changed files with 187 additions and 121 deletions

View File

@ -21,6 +21,13 @@ class ActivityDisplay extends React.Component {
this.props.loadActivity(this.props.match.params.activityId) this.props.loadActivity(this.props.match.params.activityId)
} }
componentDidUpdate(prevProps) {
if (prevProps.match.params.activityId !==
this.props.match.params.activityId) {
this.props.loadActivity(this.props.match.params.activityId)
}
}
render() { render() {
const { activities, message, onDeleteActivity, sports } = this.props const { activities, message, onDeleteActivity, sports } = this.props
const { displayModal } = this.state const { displayModal } = this.state
@ -57,6 +64,24 @@ class ActivityDisplay extends React.Component {
<div className="card"> <div className="card">
<div className="card-header"> <div className="card-header">
<div className="row"> <div className="row">
<div className="col-auto">
{activity.previous_activity ? (
<Link
className="unlink"
to={`/activities/${activity.previous_activity}`}
>
<i
className="fa fa-chevron-left"
aria-hidden="true"
/>
</Link>
) : (
<i
className="fa fa-chevron-left inactive-link"
aria-hidden="true"
/>
)}
</div>
<div className="col-auto col-activity-logo"> <div className="col-auto col-activity-logo">
<img <img
className="sport-img-medium" className="sport-img-medium"
@ -78,7 +103,9 @@ class ActivityDisplay extends React.Component {
<i <i
className="fa fa-trash custom-fa" className="fa fa-trash custom-fa"
aria-hidden="true" aria-hidden="true"
onClick={() => this.setState({ displayModal: true })} onClick={
() => this.setState({ displayModal: true })
}
/><br /> /><br />
{activityDate && ( {activityDate && (
<span className="activity-date"> <span className="activity-date">
@ -87,6 +114,24 @@ class ActivityDisplay extends React.Component {
</span> </span>
)} )}
</div> </div>
<div className="col-auto">
{activity.next_activity ? (
<Link
className="unlink"
to={`/activities/${activity.next_activity}`}
>
<i
className="fa fa-chevron-right"
aria-hidden="true"
/>
</Link>
) : (
<i
className="fa fa-chevron-right inactive-link"
aria-hidden="true"
/>
)}
</div>
</div> </div>
</div> </div>
<div className="card-body"> <div className="card-body">
@ -103,7 +148,8 @@ class ActivityDisplay extends React.Component {
aria-hidden="true" aria-hidden="true"
/> />
Duration: {activity.duration} Duration: {activity.duration}
{activity.records.find(r => r.record_type === 'LD') && ( {activity.records.find(r => r.record_type === 'LD'
) && (
<sup> <sup>
<i <i
className="fa fa-trophy custom-fa" className="fa fa-trophy custom-fa"
@ -122,7 +168,8 @@ class ActivityDisplay extends React.Component {
aria-hidden="true" aria-hidden="true"
/> />
Distance: {activity.distance} km Distance: {activity.distance} km
{activity.records.find(r => r.record_type === 'FD') && ( {activity.records.find(r => r.record_type === 'FD'
) && (
<sup> <sup>
<i <i
className="fa fa-trophy custom-fa" className="fa fa-trophy custom-fa"
@ -137,7 +184,8 @@ class ActivityDisplay extends React.Component {
aria-hidden="true" aria-hidden="true"
/> />
Average speed: {activity.ave_speed} km/h Average speed: {activity.ave_speed} km/h
{activity.records.find(r => r.record_type === 'AS') && ( {activity.records.find(r => r.record_type === 'AS'
) && (
<sup> <sup>
<i <i
className="fa fa-trophy custom-fa" className="fa fa-trophy custom-fa"
@ -147,7 +195,8 @@ class ActivityDisplay extends React.Component {
)} )}
<br /> <br />
Max speed : {activity.max_speed} km/h Max speed : {activity.max_speed} km/h
{activity.records.find(r => r.record_type === 'MS') && ( {activity.records.find(r => r.record_type === 'MS'
) && (
<sup> <sup>
<i <i
className="fa fa-trophy custom-fa" className="fa fa-trophy custom-fa"

View File

@ -1,3 +1,4 @@
import hash from 'object-hash'
import React from 'react' import React from 'react'
import { GeoJSON, Map, TileLayer } from 'react-leaflet' import { GeoJSON, Map, TileLayer } from 'react-leaflet'
import { connect } from 'react-redux' import { connect } from 'react-redux'
@ -18,6 +19,13 @@ class ActivityMap extends React.Component {
this.props.loadActivityGpx(this.props.activity.id) this.props.loadActivityGpx(this.props.activity.id)
} }
componentDidUpdate(prevProps) {
if (prevProps.activity.id !==
this.props.activity.id) {
this.props.loadActivityGpx(this.props.activity.id)
}
}
componentWillUnmount() { componentWillUnmount() {
this.props.loadActivityGpx(null) this.props.loadActivityGpx(null)
} }
@ -44,7 +52,11 @@ class ActivityMap extends React.Component {
// eslint-disable-next-line max-len // eslint-disable-next-line max-len
url={`https://{s}.tile.thunderforest.com/outdoors/{z}/{x}/{y}.png?apikey=${thunderforestApiKey}`} url={`https://{s}.tile.thunderforest.com/outdoors/{z}/{x}/{y}.png?apikey=${thunderforestApiKey}`}
/> />
<GeoJSON data={jsonData} /> <GeoJSON
// hash as a key to force re-rendering
key={hash(jsonData)}
data={jsonData}
/>
</Map> </Map>
)} )}
</div> </div>

View File

@ -124,6 +124,10 @@ input, textarea {
max-height: 35px; max-height: 35px;
} }
.inactive-link {
color: lightgrey;
}
.sport-img-medium { .sport-img-medium {
max-width: 45px; max-width: 45px;
max-height: 45px; max-height: 45px;

View File

@ -8,6 +8,7 @@
"date-fns": "^1.29.0", "date-fns": "^1.29.0",
"history": "^4.7.2", "history": "^4.7.2",
"leaflet": "^1.3.1", "leaflet": "^1.3.1",
"object-hash": "^1.3.0",
"react": "^16.3.2", "react": "^16.3.2",
"react-dom": "^16.3.2", "react-dom": "^16.3.2",
"react-helmet": "^5.2.0", "react-helmet": "^5.2.0",

View File

@ -6146,7 +6146,7 @@ object-copy@^0.1.0:
define-property "^0.2.5" define-property "^0.2.5"
kind-of "^3.0.3" kind-of "^3.0.3"
object-hash@^1.1.4: object-hash@^1.1.4, object-hash@^1.3.0:
version "1.3.0" version "1.3.0"
resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-1.3.0.tgz#76d9ba6ff113cf8efc0d996102851fe6723963e2" resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-1.3.0.tgz#76d9ba6ff113cf8efc0d996102851fe6723963e2"