194 lines
6.3 KiB
React
Raw Normal View History

2018-05-25 18:40:07 +02:00
import React from 'react'
import { Helmet } from 'react-helmet'
import { connect } from 'react-redux'
import ActivityCardHeader from './ActivityCardHeader'
import ActivityCharts from './ActivityCharts'
2018-05-25 18:40:07 +02:00
import ActivityDetails from './ActivityDetails'
import ActivityMap from './ActivityMap'
2018-06-15 09:36:14 +02:00
import ActivityNoMap from './ActivityNoMap'
import ActivityNotes from './ActivityNotes'
2019-08-25 20:23:11 +02:00
import ActivitySegments from './ActivitySegments'
2019-01-03 12:53:47 +01:00
import CustomModal from '../../Common/CustomModal'
2018-06-12 13:12:18 +02:00
import { getOrUpdateData } from '../../../actions'
2018-05-25 18:40:07 +02:00
import { deleteActivity } from '../../../actions/activities'
class ActivityDisplay extends React.Component {
constructor(props, context) {
super(props, context)
this.state = {
displayModal: false,
coordinates: {
latitude: null,
longitude: null,
},
2018-05-25 18:40:07 +02:00
}
}
componentDidMount() {
this.props.loadActivity(this.props.match.params.activityId)
}
componentDidUpdate(prevProps) {
2019-08-28 15:35:22 +02:00
if (
prevProps.match.params.activityId !== this.props.match.params.activityId
) {
2018-05-25 18:40:07 +02:00
this.props.loadActivity(this.props.match.params.activityId)
}
}
displayModal(value) {
this.setState(prevState => ({
...prevState,
2019-08-28 15:35:22 +02:00
displayModal: value,
}))
}
updateCoordinates(activePayload) {
2019-08-28 15:35:22 +02:00
const coordinates =
activePayload && activePayload.length > 0
? {
latitude: activePayload[0].payload.latitude,
longitude: activePayload[0].payload.longitude,
}
: {
latitude: null,
longitude: null,
}
this.setState(prevState => ({
...prevState,
2019-08-28 15:35:22 +02:00
coordinates,
}))
2018-05-25 18:40:07 +02:00
}
render() {
const { activities, message, onDeleteActivity, sports, user } = this.props
const { coordinates, displayModal } = this.state
2018-05-25 18:40:07 +02:00
const [activity] = activities
const title = activity ? activity.title : 'Activity'
const [sport] = activity
? sports.filter(s => s.id === activity.sport_id)
: []
2019-08-25 20:23:11 +02:00
const segmentId = parseInt(this.props.match.params.segmentId)
2019-08-28 15:35:22 +02:00
const dataType = segmentId >= 0 ? 'segment' : 'activity'
2018-05-25 18:40:07 +02:00
return (
<div className="activity-page">
<Helmet>
<title>FitTrackee - {title}</title>
2018-05-25 18:40:07 +02:00
</Helmet>
{message ? (
<code>{message}</code>
) : (
<div className="container">
2019-08-28 15:35:22 +02:00
{displayModal && (
<CustomModal
title="Confirmation"
text="Are you sure you want to delete this activity?"
confirm={() => {
onDeleteActivity(activity.id)
this.displayModal(false)
}}
close={() => this.displayModal(false)}
/>
)}
2018-05-25 18:40:07 +02:00
{activity && sport && activities.length === 1 && (
<div>
<div className="row">
<div className="col">
2018-06-13 20:35:31 +02:00
<div className="card activity-card">
<div className="card-header">
<ActivityCardHeader
activity={activity}
2019-08-25 20:23:11 +02:00
dataType={dataType}
segmentId={segmentId}
sport={sport}
title={title}
user={user}
displayModal={() => this.displayModal(true)}
/>
</div>
<div className="card-body">
<div className="row">
<div className="col-md-8">
2018-06-15 09:36:14 +02:00
{activity.with_gpx ? (
<ActivityMap
activity={activity}
coordinates={coordinates}
2019-08-25 20:23:11 +02:00
dataType={dataType}
segmentId={segmentId}
/>
2018-06-15 09:36:14 +02:00
) : (
<ActivityNoMap />
)}
</div>
<div className="col">
2019-08-25 20:23:11 +02:00
<ActivityDetails
2019-08-28 15:35:22 +02:00
activity={
dataType === 'activity'
? activity
: activity.segments[segmentId - 1]
}
2019-08-25 20:23:11 +02:00
/>
</div>
</div>
</div>
2018-05-25 18:40:07 +02:00
</div>
</div>
</div>
{activity.with_gpx && (
<div className="row">
<div className="col">
2018-06-13 20:35:31 +02:00
<div className="card activity-card">
<div className="card-body">
<div className="row">
<div className="col">
<div className="chart-title">Chart</div>
<ActivityCharts
activity={activity}
2019-08-25 20:23:11 +02:00
dataType={dataType}
segmentId={segmentId}
2019-08-28 15:35:22 +02:00
updateCoordinates={e =>
this.updateCoordinates(e)
}
/>
</div>
2018-05-25 18:40:07 +02:00
</div>
</div>
</div>
</div>
</div>
)}
2019-08-25 20:23:11 +02:00
{dataType === 'activity' && (
<>
<ActivityNotes notes={activity.notes} />
{activity.segments.length > 1 && (
<ActivitySegments segments={activity.segments} />
)}
</>
)}
2018-05-25 18:40:07 +02:00
</div>
)}
</div>
)}
</div>
)
}
}
export default connect(
state => ({
activities: state.activities.data,
message: state.message,
sports: state.sports.data,
user: state.user,
}),
dispatch => ({
loadActivity: activityId => {
2018-06-12 13:12:18 +02:00
dispatch(getOrUpdateData('getData', 'activities', { id: activityId }))
2018-05-25 18:40:07 +02:00
},
onDeleteActivity: activityId => {
dispatch(deleteActivity(activityId))
},
})
)(ActivityDisplay)