Client - replace 'Activity' with 'Workout' - fix #58

This commit is contained in:
Sam
2021-01-10 11:39:48 +01:00
parent 3a80e01cc2
commit 5c04db6c08
75 changed files with 986 additions and 1006 deletions

View File

@ -17,8 +17,8 @@ import { enGB, fr } from 'date-fns/locale'
import React from 'react'
import { connect } from 'react-redux'
import CalendarActivities from './CalendarActivities'
import { getMonthActivities } from '../../actions/activities'
import CalendarWorkouts from './CalendarWorkouts'
import { getMonthWorkouts } from '../../actions/workouts'
import { getDateWithTZ } from '../../utils'
const getStartAndEndMonth = (date, weekStartOnMonday) => {
@ -44,7 +44,7 @@ class Calendar extends React.Component {
}
componentDidMount() {
this.props.loadMonthActivities(this.state.startDate, this.state.endDate)
this.props.loadMonthWorkouts(this.state.startDate, this.state.endDate)
}
renderHeader(localeOptions) {
@ -81,11 +81,11 @@ class Calendar extends React.Component {
return <div className="days row">{days}</div>
}
filterActivities(day) {
const { activities, user } = this.props
if (activities) {
return activities.filter(act =>
isSameDay(getDateWithTZ(act.activity_date, user.timezone), day)
filterWorkouts(day) {
const { workouts, user } = this.props
if (workouts) {
return workouts.filter(act =>
isSameDay(getDateWithTZ(act.workout_date, user.timezone), day)
)
}
return []
@ -105,7 +105,7 @@ class Calendar extends React.Component {
while (day <= endDate) {
for (let i = 0; i < 7; i++) {
formattedDate = format(day, dateFormat)
const dayActivities = this.filterActivities(day)
const dayWorkouts = this.filterWorkouts(day)
const isDisabled = isSameMonth(day, currentMonth) ? '' : '-disabled'
const isWeekEnd = weekStartOnMonday
? [5, 6].includes(i)
@ -119,8 +119,8 @@ class Calendar extends React.Component {
>
<div className={`img${isDisabled}`}>
<span className="number">{formattedDate}</span>
<CalendarActivities
dayActivities={dayActivities}
<CalendarWorkouts
dayWorkouts={dayWorkouts}
isDisabled={isDisabled}
sports={sports}
/>
@ -149,7 +149,7 @@ class Calendar extends React.Component {
startDate: start,
endDate: end,
})
this.props.loadMonthActivities(start, end)
this.props.loadMonthWorkouts(start, end)
}
handleNextMonth() {
@ -167,7 +167,7 @@ class Calendar extends React.Component {
locale: this.props.language === 'fr' ? fr : enGB,
}
return (
<div className="card activity-card">
<div className="card workout-card">
<div className="calendar">
{this.renderHeader(localeOptions)}
{this.renderDays(localeOptions)}
@ -180,16 +180,16 @@ class Calendar extends React.Component {
export default connect(
state => ({
activities: state.calendarActivities.data,
workouts: state.calendarWorkouts.data,
language: state.language,
sports: state.sports.data,
user: state.user,
}),
dispatch => ({
loadMonthActivities: (start, end) => {
loadMonthWorkouts: (start, end) => {
const dateFormat = 'yyyy-MM-dd'
dispatch(
getMonthActivities(format(start, dateFormat), format(end, dateFormat))
getMonthWorkouts(format(start, dateFormat), format(end, dateFormat))
)
},
})

View File

@ -1,28 +1,28 @@
import React from 'react'
import { Link } from 'react-router-dom'
import { recordsLabels } from '../../utils/activities'
import { recordsLabels } from '../../utils/workouts'
export default function CalendarActivity(props) {
const { activity, isDisabled, isMore, sportImg } = props
export default function CalendarWorkout(props) {
const { isDisabled, isMore, sportImg, workout } = props
return (
<Link
className={`calendar-activity${isMore}`}
to={`/activities/${activity.id}`}
className={`calendar-workout${isMore}`}
to={`/workouts/${workout.id}`}
>
<>
<img
alt="activity sport logo"
className={`activity-sport ${isDisabled}`}
alt="workout sport logo"
className={`workout-sport ${isDisabled}`}
src={sportImg}
title={activity.title}
title={workout.title}
/>
{activity.records.length > 0 && (
{workout.records.length > 0 && (
<sup>
<i
className="fa fa-trophy custom-fa-small"
aria-hidden="true"
title={activity.records.map(
title={workout.records.map(
rec =>
` ${
recordsLabels.filter(

View File

@ -1,8 +1,8 @@
import React from 'react'
import CalendarActivity from './CalendarActivity'
import CalendarWorkout from './CalendarWorkout'
export default class CalendarActivities extends React.Component {
export default class CalendarWorkouts extends React.Component {
constructor(props, context) {
super(props, context)
this.state = {
@ -17,33 +17,33 @@ export default class CalendarActivities extends React.Component {
}
render() {
const { dayActivities, isDisabled, sports } = this.props
const { dayWorkouts, isDisabled, sports } = this.props
const { isHidden } = this.state
return (
<div>
{dayActivities.map(act => (
<CalendarActivity
{dayWorkouts.map(act => (
<CalendarWorkout
key={act.id}
activity={act}
workout={act}
isDisabled={isDisabled}
isMore=""
sportImg={sports.filter(s => s.id === act.sport_id).map(s => s.img)}
/>
))}
{dayActivities.length > 2 && (
{dayWorkouts.length > 2 && (
<i
className={`fa fa-${isHidden ? 'plus' : 'times'} calendar-more`}
aria-hidden="true"
onClick={() => this.handleDisplayMore()}
title="show more activities"
title="show more workouts"
/>
)}
{!isHidden && (
<div className="calendar-display-more">
{dayActivities.map(act => (
<CalendarActivity
{dayWorkouts.map(act => (
<CalendarWorkout
key={act.id}
activity={act}
workout={act}
isDisabled={isDisabled}
isMore="-more"
sportImg={sports

View File

@ -1,7 +1,7 @@
import React from 'react'
import { Link } from 'react-router-dom'
import { formatRecord, translateSports } from '../../utils/activities'
import { formatRecord, translateSports } from '../../utils/workouts'
export default function RecordsCard(props) {
const { records, sports, t, user } = props
@ -19,8 +19,8 @@ export default function RecordsCard(props) {
}, {})
return (
<div className="card activity-card">
<div className="card-header">{t('activities:Personal records')}</div>
<div className="card workout-card">
<div className="card-header">{t('workouts:Personal records')}</div>
<div className="card-body">
{Object.keys(recordsBySport).length === 0
? t('common:No records.')
@ -54,12 +54,12 @@ export default function RecordsCard(props) {
{recordsBySport[sportLabel].records.map(rec => (
<tr className="record-tr" key={rec.id}>
<td className="record-td">
{t(`activities:${rec.record_type}`)}
{t(`workouts:${rec.record_type}`)}
</td>
<td className="record-td text-right">{rec.value}</td>
<td className="record-td text-right">
<Link to={`/activities/${rec.activity_id}`}>
{rec.activity_date}
<Link to={`/workouts/${rec.workout_id}`}>
{rec.workout_date}
</Link>
</td>
</tr>

View File

@ -18,7 +18,7 @@ export default class Statistics extends React.Component {
render() {
const { t } = this.props
return (
<div className="card activity-card">
<div className="card workout-card">
<div className="card-header">{t('dashboard:This month')}</div>
<div className="card-body">
<Stats displayEmpty={false} statsParams={this.state} t={t} />

View File

@ -14,15 +14,15 @@ export default function UserStatistics(props) {
return (
<div className="row">
<div className="col-lg-3 col-md-6 col-sm-6">
<div className="card activity-card">
<div className="card workout-card">
<div className="card-body row">
<div className="col-3">
<i className="fa fa-calendar fa-3x fa-color" />
</div>
<div className="col-9 text-right">
<div className="huge">{user.nb_activities}</div>
<div className="huge">{user.nb_workouts}</div>
<div>{`${
user.nb_activities === 1
user.nb_workouts === 1
? t('common:workout')
: t('common:workouts')
}`}</div>
@ -31,7 +31,7 @@ export default function UserStatistics(props) {
</div>
</div>
<div className="col-lg-3 col-md-6 col-sm-6">
<div className="card activity-card">
<div className="card workout-card">
<div className="card-body row">
<div className="col-3">
<i className="fa fa-road fa-3x fa-color" />
@ -46,7 +46,7 @@ export default function UserStatistics(props) {
</div>
</div>
<div className="col-lg-3 col-md-6 col-sm-6">
<div className="card activity-card">
<div className="card workout-card">
<div className="card-body row">
<div className="col-3">
<i className="fa fa-clock-o fa-3x fa-color" />
@ -59,7 +59,7 @@ export default function UserStatistics(props) {
</div>
</div>
<div className="col-lg-3 col-md-6 col-sm-6">
<div className="card activity-card">
<div className="card workout-card">
<div className="card-body row">
<div className="col-3">
<i className="fa fa-tags fa-3x fa-color" />

View File

@ -5,35 +5,35 @@ import { Link } from 'react-router-dom'
import StaticMap from '../Common/StaticMap'
import { getDateWithTZ } from '../../utils'
export default function ActivityCard(props) {
const { activity, sports, t, user } = props
export default function WorkoutCard(props) {
const { sports, t, user, workout } = props
return (
<div className="card activity-card text-center">
<div className="card workout-card text-center">
<div className="card-header">
<Link to={`/activities/${activity.id}`}>
<Link to={`/workouts/${workout.id}`}>
{sports
.filter(sport => sport.id === activity.sport_id)
.filter(sport => sport.id === workout.sport_id)
.map(sport => t(`sports:${sport.label}`))}{' '}
-{' '}
{format(
getDateWithTZ(activity.activity_date, user.timezone),
getDateWithTZ(workout.workout_date, user.timezone),
'dd/MM/yyyy HH:mm'
)}
</Link>
</div>
<div className="card-body">
<div className="row">
{activity.map && (
{workout.map && (
<div className="col">
<StaticMap activity={activity} />
<StaticMap workout={workout} />
</div>
)}
<div className="col">
<p>
<i className="fa fa-clock-o" aria-hidden="true" />{' '}
{t('activities:Duration')}: {activity.moving}
{activity.map ? (
{t('workouts:Duration')}: {workout.moving}
{workout.map ? (
<span>
<br />
<br />
@ -42,7 +42,7 @@ export default function ActivityCard(props) {
' - '
)}
<i className="fa fa-road" aria-hidden="true" />{' '}
{t('activities:Distance')}: {activity.distance} km
{t('workouts:Distance')}: {workout.distance} km
</p>
</div>
</div>

View File

@ -3,15 +3,15 @@ import { Helmet } from 'react-helmet'
import { withTranslation } from 'react-i18next'
import { connect } from 'react-redux'
import ActivityCard from './ActivityCard'
import Calendar from './Calendar'
import Message from '../Common/Message'
import NoActivities from '../Common/NoActivities'
import NoWorkouts from '../Common/NoWorkouts'
import Records from './Records'
import Statistics from './Statistics'
import UserStatistics from './UserStatistics'
import WorkoutCard from './WorkoutCard'
import { getOrUpdateData } from '../../actions'
import { getMoreActivities } from '../../actions/activities'
import { getMoreWorkouts } from '../../actions/workouts'
class DashBoard extends React.Component {
constructor(props, context) {
@ -22,22 +22,22 @@ class DashBoard extends React.Component {
}
componentDidMount() {
this.props.loadActivities()
this.props.loadWorkouts()
}
render() {
const {
activities,
loadMoreActivities,
loadMoreWorkouts,
message,
records,
sports,
t,
user,
workouts,
} = this.props
const paginationEnd =
activities.length > 0
? activities[activities.length - 1].previous_activity === null
workouts.length > 0
? workouts[workouts.length - 1].previous_workout === null
: true
const { page } = this.state
return (
@ -48,7 +48,7 @@ class DashBoard extends React.Component {
{message ? (
<Message message={message} t={t} />
) : (
activities &&
workouts &&
user.total_duration &&
sports.length > 0 && (
<div className="container dashboard">
@ -65,26 +65,26 @@ class DashBoard extends React.Component {
</div>
<div className="col-md-8">
<Calendar weekm={user.weekm} />
{activities.length > 0 ? (
activities.map(activity => (
<ActivityCard
activity={activity}
key={activity.id}
{workouts.length > 0 ? (
workouts.map(workout => (
<WorkoutCard
workout={workout}
key={workout.id}
sports={sports}
t={t}
user={user}
/>
))
) : (
<NoActivities t={t} />
<NoWorkouts t={t} />
)}
{!paginationEnd && (
<input
type="submit"
className="btn btn-default btn-md btn-block"
value="Load more activities"
value="Load more workouts"
onClick={() => {
loadMoreActivities(page + 1)
loadMoreWorkouts(page + 1)
this.setState({ page: page + 1 })
}}
/>
@ -102,19 +102,19 @@ class DashBoard extends React.Component {
export default withTranslation()(
connect(
state => ({
activities: state.activities.data,
workouts: state.workouts.data,
message: state.message,
records: state.records.data,
sports: state.sports.data,
user: state.user,
}),
dispatch => ({
loadActivities: () => {
dispatch(getOrUpdateData('getData', 'activities', { page: 1 }))
loadWorkouts: () => {
dispatch(getOrUpdateData('getData', 'workouts', { page: 1 }))
dispatch(getOrUpdateData('getData', 'records'))
},
loadMoreActivities: page => {
dispatch(getMoreActivities({ page }))
loadMoreWorkouts: page => {
dispatch(getMoreWorkouts({ page }))
},
})
)(DashBoard)