2018-05-03 21:42:54 +02:00
|
|
|
import togeojson from '@mapbox/togeojson'
|
2018-06-06 20:17:37 +02:00
|
|
|
import { addDays, format, parse, startOfWeek, subHours } from 'date-fns'
|
2018-05-03 21:42:54 +02:00
|
|
|
|
2018-04-29 17:02:08 +02:00
|
|
|
export const apiUrl = `${process.env.REACT_APP_API_URL}/api/`
|
2018-05-03 14:07:31 +02:00
|
|
|
export const thunderforestApiKey = `${
|
|
|
|
process.env.REACT_APP_THUNDERFOREST_API_KEY
|
|
|
|
}`
|
2018-04-29 17:02:08 +02:00
|
|
|
|
2017-12-25 20:11:10 +01:00
|
|
|
export const isLoggedIn = () => !!window.localStorage.authToken
|
2018-01-14 12:48:52 +01:00
|
|
|
|
2018-05-04 23:04:44 +02:00
|
|
|
export const generateIds = arr => {
|
2018-01-14 12:48:52 +01:00
|
|
|
let i = 0
|
2018-01-14 17:19:02 +01:00
|
|
|
return arr.map(val => {
|
|
|
|
const obj = { id: i, value: val }
|
2018-01-14 12:48:52 +01:00
|
|
|
i++
|
|
|
|
return obj
|
|
|
|
})
|
|
|
|
}
|
2018-05-03 21:42:54 +02:00
|
|
|
|
2018-05-28 12:35:17 +02:00
|
|
|
|
|
|
|
export const createRequest = params => {
|
|
|
|
const headers = {}
|
|
|
|
if (!params.noAuthorization) {
|
|
|
|
headers.Authorization = `Bearer ${
|
|
|
|
window.localStorage.getItem('authToken')}`
|
|
|
|
}
|
|
|
|
if (params.type) {
|
|
|
|
headers['Content-Type'] = params.type
|
|
|
|
}
|
|
|
|
const requestParams = {
|
|
|
|
method: params.method,
|
|
|
|
headers: headers,
|
|
|
|
}
|
|
|
|
if (params.type === 'application/json' && params.body) {
|
|
|
|
requestParams.body = JSON.stringify(params.body)
|
|
|
|
} else if (params.body) {
|
|
|
|
requestParams.body = params.body
|
|
|
|
}
|
|
|
|
const request = new Request(params.url, requestParams)
|
|
|
|
return fetch(request)
|
2018-05-29 22:19:17 +02:00
|
|
|
.then(response => params.method === 'DELETE'
|
|
|
|
? response
|
|
|
|
: response.json())
|
2018-05-28 12:35:17 +02:00
|
|
|
.catch(error => error)
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2018-05-04 23:04:44 +02:00
|
|
|
export const getGeoJson = gpxContent => {
|
2018-05-14 14:51:03 +02:00
|
|
|
let jsonData
|
2018-05-03 21:42:54 +02:00
|
|
|
if (gpxContent) {
|
|
|
|
const gpx = new DOMParser().parseFromString(gpxContent, 'text/xml')
|
|
|
|
jsonData = togeojson.gpx(gpx)
|
|
|
|
}
|
2018-05-14 14:51:03 +02:00
|
|
|
return { jsonData }
|
2018-05-03 21:42:54 +02:00
|
|
|
}
|
2018-05-10 16:56:45 +02:00
|
|
|
|
|
|
|
export const formatActivityDate = activityDateTime => {
|
2018-05-16 23:52:55 +02:00
|
|
|
if (activityDateTime) {
|
|
|
|
const dateTime = parse(activityDateTime)
|
|
|
|
return {
|
2018-06-05 17:42:47 +02:00
|
|
|
activity_date: format(dateTime, 'DD/MM/YYYY'),
|
2018-05-16 23:52:55 +02:00
|
|
|
activity_time: activityDateTime.match(/[0-2][0-9]:[0-5][0-9]/)[0]
|
|
|
|
}
|
|
|
|
}
|
2018-05-10 16:56:45 +02:00
|
|
|
return {
|
2018-05-16 23:52:55 +02:00
|
|
|
activity_date: null,
|
|
|
|
activity_time: null,
|
2018-05-10 16:56:45 +02:00
|
|
|
}
|
|
|
|
}
|
2018-05-20 13:12:35 +02:00
|
|
|
|
|
|
|
export const formatRecord = record => {
|
|
|
|
let value, recordType = null
|
|
|
|
switch (record.record_type) {
|
|
|
|
case 'AS':
|
|
|
|
case 'MS':
|
|
|
|
value = `${record.value} km/h`
|
|
|
|
recordType = record.record_type === 'AS' ? 'Avg speed' : 'Max speed'
|
|
|
|
break
|
|
|
|
case 'FD':
|
|
|
|
value = `${record.value} km`
|
|
|
|
recordType = 'Farest distance'
|
|
|
|
break
|
|
|
|
default: // 'LD'
|
|
|
|
value = record.value // eslint-disable-line prefer-destructuring
|
|
|
|
recordType = 'Longest duration'
|
|
|
|
}
|
|
|
|
return {
|
|
|
|
activity_date: formatActivityDate(record.activity_date).activity_date,
|
|
|
|
activity_id: record.activity_id,
|
|
|
|
id: record.id,
|
|
|
|
record_type: recordType,
|
|
|
|
value: value,
|
|
|
|
}
|
|
|
|
}
|
2018-05-28 15:33:56 +02:00
|
|
|
|
|
|
|
const formatDuration = seconds => {
|
|
|
|
let newDate = new Date(0)
|
|
|
|
newDate = subHours(newDate.setSeconds(seconds), 1)
|
|
|
|
return newDate.getTime()
|
|
|
|
}
|
|
|
|
|
|
|
|
export const formatChartData = chartData => {
|
|
|
|
for (let i = 0; i < chartData.length; i++) {
|
|
|
|
chartData[i].time = new Date(chartData[i].time).getTime()
|
|
|
|
chartData[i].duration = formatDuration(chartData[i].duration)
|
|
|
|
}
|
|
|
|
return chartData
|
|
|
|
}
|
2018-06-06 20:17:37 +02:00
|
|
|
|
|
|
|
export const formatStats = (stats, sports, startDate, endDate) => {
|
|
|
|
const nbActivitiesStats = []
|
|
|
|
const distanceStats = []
|
|
|
|
const durationStats = []
|
|
|
|
|
|
|
|
for (let day = startOfWeek(startDate);
|
|
|
|
day <= endDate;
|
|
|
|
day = addDays(day, 7)
|
|
|
|
) {
|
|
|
|
const date = format(day, 'YYYY-MM-DD')
|
|
|
|
const dataNbActivities = { date }
|
|
|
|
const dataDistance = { date }
|
|
|
|
const dataDuration = { date }
|
|
|
|
|
|
|
|
if (stats[date]) {
|
|
|
|
Object.keys(stats[date]).map(sportId => {
|
|
|
|
const sportLabel = sports.filter(s => s.id === +sportId)[0].label
|
|
|
|
dataNbActivities[sportLabel] = stats[date][sportId].nb_activities
|
|
|
|
dataDistance[sportLabel] = stats[date][sportId].total_distance
|
|
|
|
dataDuration[sportLabel] = stats[date][sportId].total_duration
|
|
|
|
return null
|
|
|
|
})
|
|
|
|
}
|
|
|
|
nbActivitiesStats.push(dataNbActivities)
|
|
|
|
distanceStats.push(dataDistance)
|
|
|
|
durationStats.push(dataDuration)
|
|
|
|
}
|
|
|
|
|
|
|
|
return {
|
|
|
|
activities: nbActivitiesStats,
|
|
|
|
distance: distanceStats,
|
|
|
|
duration: durationStats
|
|
|
|
}
|
|
|
|
}
|