FitTrackee/fittrackee/dist/static/js/main.75f806db.chunk.js.map

1 line
330 KiB
Plaintext

{"version":3,"sources":["locales/fr/resources.js","locales/index.js","locales/en/resources.js","i18n.js","components/Common/Message.jsx","utils/index.js","fitTrackeeApi/index.js","actions/index.js","actions/application.js","components/Admin/AdminApplication.jsx","components/Admin/AdminStats.jsx","components/Admin/AdminDashboard.jsx","components/Admin/AdminSports.jsx","components/Common/Pagination.jsx","components/Admin/AdminUsers.jsx","components/Others/NotFound.jsx","components/Admin/index.jsx","utils/workouts.js","fitTrackeeApi/auth.js","actions/user.js","actions/workouts.js","components/Workout/WorkoutForms/FormWithGpx.jsx","components/Workout/WorkoutForms/FormWithoutGpx.jsx","components/Workout/WorkoutAddOrEdit.jsx","components/Workout/WorkoutAdd.jsx","components/Common/CustomModal.jsx","components/Workout/WorkoutDisplay/WorkoutCardHeader.jsx","components/Workout/WorkoutDisplay/WorkoutCharts.jsx","components/Workout/WorkoutDisplay/WorkoutWeather.jsx","components/Workout/WorkoutDisplay/WorkoutDetails.jsx","components/Workout/WorkoutDisplay/Map.jsx","components/Workout/WorkoutDisplay/WorkoutMap.jsx","components/Workout/WorkoutDisplay/WorkoutNoMap.jsx","components/Workout/WorkoutDisplay/WorkoutNotes.jsx","components/Workout/WorkoutDisplay/WorkoutSegments.jsx","components/Workout/WorkoutDisplay/index.jsx","components/Workout/WorkoutEdit.jsx","components/Workout/index.jsx","components/Common/NoWorkouts.jsx","components/Workouts/WorkoutsFilter.jsx","components/Common/StaticMap.jsx","components/Workouts/WorkoutsList.jsx","components/Workouts/index.jsx","components/User/ProfileDetail.jsx","components/User/CurrentUserProfile.jsx","components/Dashboard/CalendarWorkout.jsx","components/Dashboard/CalendarWorkouts.jsx","components/Dashboard/Calendar.jsx","components/Dashboard/Records.jsx","utils/stats.js","components/Common/Stats/CustomTooltip.jsx","components/Common/Stats/CustomLabel.jsx","components/Common/Stats/StatsChart.jsx","components/Common/Stats/index.jsx","actions/stats.js","components/Dashboard/Statistics.jsx","components/Dashboard/UserStatistics.jsx","components/Dashboard/WorkoutCard.jsx","components/Dashboard/index.jsx","components/Footer/index.jsx","components/User/Logout.jsx","images/flags/en.svg","images/flags/fr.svg","components/NavBar/LanguageDropdown.jsx","components/NavBar/index.jsx","images/password.svg","images/mail-send.svg","components/User/PasswordReset.jsx","components/User/ProfileEdit.jsx","components/Statistics/index.jsx","components/User/Form.jsx","components/User/UserForm.jsx","components/User/UserProfile.jsx","components/App.jsx","components/Root.jsx","registerServiceWorker.js","reducers/initial.js","reducers/index.js","utils/history.js","index.js"],"names":["resources","en","workouts","administration","common","dashboard","messages","sports","statistics","user","fr","i18n","use","XHR","LanguageDetector","init","debug","process","lng","fallbackLng","keySeparator","interpolation","escapeValue","ns","defaultNS","Message","React","PureComponent","render","this","props","message","t","singleMessage","split","length","className","value","map","msg","id","suffixes","getFileSize","fileSize","asText","i","Math","floor","log","size","suffix","pow","toFixed","apiUrl","userFilters","key","label","sortOrders","isLoggedIn","window","localStorage","authToken","generateIds","arr","val","obj","createApiRequest","params","headers","noAuthorization","Authorization","getItem","type","requestParams","method","body","JSON","stringify","request","Request","url","fetch","then","response","status","json","catch","error","console","Error","getDateWithTZ","date","tz","dt","DateTime","fromISO","format","Date","setZone","parse","toFormat","sortValues","a","b","valueALabel","toLowerCase","valueBLabel","translateValues","values","sort","formatUrl","pathname","query","username","Object","keys","filter","index","FitTrackeeApi","target","data","setData","setError","setLoading","loading","getOrUpdateData","action","canDispatch","dispatch","isNaN","ret","pagination","setPaginatedData","updateSportsData","updateUsersData","users","updateLanguage","language","i18next","changeLanguage","setLanguage","setAppConfig","getAppData","FitTrackeeGenericApi","getData","AdminApplication","Component","constructor","context","super","state","formData","componentDidMount","initForm","componentDidUpdate","prevProps","appConfig","k","includes","setState","handleFormChange","e","name","isInEdition","loadAppConfig","onHandleConfigFormSubmit","onSubmit","preventDefault","htmlFor","aria-hidden","title","min","max_users","onChange","step","max_single_file_size","max_zip_file_size","gpx_limit_import","onClick","history","push","connect","assign","updateData","Array","isArray","updateAppConfig","AdminStats","loadAppStats","appStats","uploadDirSize","uploads_dir_size","withTranslation","application","AdminDashboard","to","is_registration_enabled","AdminSports","loadSports","updateSport","sport","src","img","alt","is_active","data-toggle","has_workouts","sportId","isActive","Pagination","getUrl","newQuery","page","aria-label","has_prev","aria-disabled","pages","from","_","has_next","AdminUsers","per_page","order_by","order","loadUsers","initState","location","updatePage","authUser","updateUser","translatedFilters","translatedSortOrders","picture","now","email","created_at","nb_workouts","admin","disabled","router","userName","isAdmin","NotFound","useTranslation","Helmet","config","exact","path","component","workoutColors","recordsLabels","record_type","formatWorkoutDate","dateTime","dateFormat","timeFormat","workout_date","workout_time","formatWorkoutDuration","seconds","newDate","subHours","setSeconds","getTime","formatChartData","chartData","time","duration","sortSports","sportALabel","sportBLabel","translateSports","onlyActive","PictureError","ProfileUpdateError","loadProfile","getProfile","isAuthenticated","profil","handleUserFormSubmit","formType","onlyPasswords","errMsg","password","password_conf","RegisterFormControl","loginOrRegisterOrPasswordReset","setItem","auth_token","deleteUser","deleteData","r","setGpx","gpxContent","setChartData","editWorkout","form","getMoreWorkouts","onAddWorkout","FormData","append","gpxFile","files","notes","addDataWithFile","addWorkout","onEditWorkout","workout","sport_id","translatedSports","zipTooltip","fileSizeLimit","encType","event","defaultValue","required","Trans","i18nKey","data-placement","accept","maxLength","onAddOrEdit","d","distance","addData","workoutDate","workoutTime","workoutDateTime","timezone","pattern","placeholder","WorkoutAddEdit","withGpx","handleRadioChange","changeEvent","with_gpx","checked","WorkoutAddOrEdit","CustomModal","close","text","confirm","WorkoutCardHeader","dataType","displayModal","segmentId","previousUrl","previous_workout","nextUrl","segments","next_workout","WorkoutCharts","displayDistance","dataToHide","loadWorkoutData","loadSegmentData","componentWillUnmount","handleLegendChange","find","splice","indexOf","displayData","updateCoordinates","xInterval","parseInt","xDataKey","xScale","height","margin","top","right","left","bottom","onMouseMove","activePayload","onMouseLeave","allowDecimals","dataKey","offset","position","scale","interval","tickFormatter","angle","yAxisId","orientation","fill","stroke","dot","unit","strokeWidth","labelFormatter","workoutId","chart_data","getWorkoutChartData","getSegmentChartData","WorkoutWeather","weather_start","weather_end","icon","summary","Number","temperature","humidity","wind","WorkoutDetails","withPauses","pauses","moving","records","record","ave_speed","max_speed","min_alt","max_alt","ascent","descent","Map","bounds","coordinates","jsonData","mapAttribution","useMap","fitBounds","TileLayer","attribution","GeoJSON","hash","latitude","Marker","longitude","WorkoutMap","zoom","loadWorkoutGpx","loadSegmentGpx","gpx","DOMParser","parseFromString","togeojson","getGeoJson","MapContainer","boundsOptions","padding","map_attribution","getWorkoutGpx","getSegmentGpx","WorkoutNoMap","WorkoutNotes","WorkoutSegments","segment","workout_id","WorkoutDisplay","loadWorkout","match","prevState","payload","onDeleteWorkout","s","Promise","resolve","WorkoutEdit","WorkoutAdd","NoWorkouts","WorkoutsFilter","loadWorkouts","updateParams","StaticMap","display","href","rel","WorkoutsList","scope","idx","Workouts","setParams","loadMoreWorkouts","paginationEnd","onDeletePicture","deletePicture","onUploadPicture","reset","uploadPicture","editable","isDeletable","createdAt","birthDate","birth_date","first_name","last_name","bio","weekm","go","CalendarWorkout","isDisabled","isMore","sportImg","rec","CalendarWorkouts","isHidden","handleDisplayMore","dayWorkouts","act","getStartAndEndMonth","weekStartOnMonday","monthStart","startOfMonth","monthEnd","endOfMonth","weekStartsOn","start","startOfWeek","end","endOfWeek","Calendar","calendarDate","currentMonth","startDate","endDate","loadMonthWorkouts","renderHeader","localeOptions","handlePrevMonth","handleNextMonth","renderDays","days","addDays","filterWorkouts","day","isSameDay","renderCells","rows","formattedDate","isSameMonth","isWeekEnd","isToday","updateStateDate","addMonths","subMonths","locale","enGB","calendarWorkouts","RecordsCard","recordsBySport","reduce","sportList","recordType","formatRecord","sportLabel","colSpan","xAxisFormats","xAxis","formatDuration","totalSeconds","formatWithDay","String","hours","padStart","minutes","formatValue","displayedData","dateIncrement","addYears","formatStats","stats","displayedSports","nbWorkoutsStats","distanceStats","durationStats","startOfYear","x","xAxisFormat","dataNbWorkouts","dataDistance","dataDuration","total_distance","total_duration","CustomTooltip","active","total","p","style","color","CustomLabel","y","width","formattedValue","fontSize","textAnchor","dominantBaseline","StatsCharts","content","isAnimationActive","stackId","Statistics","statsParams","displayEmpty","getStats","Stats","UserStatistics","nb_sports","WorkoutCard","DashBoard","Footer","Logout","UserLogout","_extends","arguments","source","prototype","hasOwnProperty","call","apply","_objectWithoutProperties","excluded","sourceKeys","_objectWithoutPropertiesLoose","getOwnPropertySymbols","sourceSymbolKeys","propertyIsEnumerable","_ref3","_ref4","_ref5","_ref6","_ref7","_ref8","_ref9","_ref10","_ref11","_ref12","_ref13","_ref14","SvgEn","_ref","svgRef","titleId","enableBackground","viewBox","xmlns","ref","ForwardRef","SvgFr","languages","selected","flag","Dropdown","isOpen","toggleDropdown","onUpdateLanguage","lang","NavBar","data-target","aria-controls","aria-expanded","LanguageDropdown","SvgPassword","xmlnsXlink","xmlSpace","SvgMailSend","PasswordReset","ProfileEdit","onDeleteUser","onHandleProfileFormSubmit","readOnly","postData","handleProfileFormSubmit","durations","updateDisplayedSports","handleOnChangeDuration","subYears","endOfYear","handleOnChangeSports","concat","handleOnClickArrows","forward","newStart","newEnd","subWeeks","addWeeks","sports_list","Form","pageTitle","charAt","toUpperCase","slice","isRegistrationAllowed","userForm","onHandleFormChange","UserForm","emptyForm","onHandleUserFormSubmit","token","UserProfile","loadUser","currentUser","App","Dashboard","CurrentUserProfile","Workout","Admin","Root","store","children","isLocalhost","Boolean","hostname","registerValidSW","swUrl","navigator","serviceWorker","register","registration","onupdatefound","installingWorker","installing","onstatechange","controller","emptyData","handleDataAndError","initial","removeItem","routesWithoutAuthentication","updatePath","toPath","newPath","pathInterceptor","originalHistory","createBrowserHistory","args","replace","listen","scrollTo","rootNode","document","getElementById","createStore","combineReducers","connectRouter","__STATE__","__REDUX_DEVTOOLS_EXTENSION_COMPOSE__","compose","applyMiddleware","routerMiddleware","thunk","ReactDOM","I18nextProvider","URL","origin","addEventListener","get","ready","unregister","reload","checkValidServiceWorker","registerServiceWorker"],"mappings":"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","file":"static/js/main.75f806db.chunk.js","sourcesContent":["import FrWorkoutsTranslations from './workouts.json'\nimport FrAdministrationTranslations from './administration.json'\nimport FrCommonTranslations from './common.json'\nimport FrDashboardTranslations from './dashboard.json'\nimport FrMessagesTranslations from './messages.json'\nimport FrSportsTranslations from './sports.json'\nimport FrStatisticsTranslations from './statistics.json'\nimport FrUserTranslations from './user.json'\n\nexport const frResources = {\n workouts: FrWorkoutsTranslations,\n administration: FrAdministrationTranslations,\n common: FrCommonTranslations,\n dashboard: FrDashboardTranslations,\n messages: FrMessagesTranslations,\n sports: FrSportsTranslations,\n statistics: FrStatisticsTranslations,\n user: FrUserTranslations,\n}\n","import { enResources } from './en/resources'\nimport { frResources } from './fr/resources'\n\nexport const resources = {\n en: enResources,\n fr: frResources,\n}\n","import EnWorkoutsTranslations from './workouts.json'\nimport EnAdministrationTranslations from './administration.json'\nimport EnCommonTranslations from './common.json'\nimport EnDashboardTranslations from './dashboard.json'\nimport EnMessagesTranslations from './messages.json'\nimport EnSportsTranslations from './sports.json'\nimport EnStatisticsTranslations from './statistics.json'\nimport EnUserTranslations from './user.json'\n\nexport const enResources = {\n workouts: EnWorkoutsTranslations,\n administration: EnAdministrationTranslations,\n common: EnCommonTranslations,\n dashboard: EnDashboardTranslations,\n messages: EnMessagesTranslations,\n sports: EnSportsTranslations,\n statistics: EnStatisticsTranslations,\n user: EnUserTranslations,\n}\n","import i18n from 'i18next'\nimport LanguageDetector from 'i18next-browser-languagedetector'\nimport XHR from 'i18next-xhr-backend'\n\nimport { resources } from './locales'\n\ni18n\n .use(XHR)\n .use(LanguageDetector)\n .init({\n debug: process.env.NODE_ENV === 'development',\n lng: 'en',\n fallbackLng: 'en',\n keySeparator: false,\n interpolation: {\n escapeValue: false,\n },\n resources,\n ns: ['common'],\n defaultNS: 'common',\n })\n\nexport default i18n\n","import React from 'react'\n\nexport default class Message extends React.PureComponent {\n render() {\n const { message, messages, t } = this.props\n const singleMessage =\n message === '' || !message\n ? ''\n : message.split('|').length > 1\n ? `${t(`messages:${message.split('|')[0]}`)}: ${t(\n `messages:${message.split('|')[1]}`\n )}`\n : t(`messages:${message}`)\n return (\n <div className=\"error-message\">\n {singleMessage !== '' && <code>{singleMessage}</code>}\n {messages &&\n messages.length > 0 &&\n (messages.length === 1 ? (\n <code>{messages[0].value}</code>\n ) : (\n <code>\n <ul>\n {messages.map(msg => (\n <li key={msg.id}>{t(`messages:${msg.value}`)}</li>\n ))}\n </ul>\n </code>\n ))}\n </div>\n )\n }\n}\n","import { format, parse } from 'date-fns'\nimport { DateTime } from 'luxon'\n\nconst suffixes = ['bytes', 'KB', 'MB', 'GB', 'TB']\nexport const getFileSize = (fileSize, asText = true) => {\n const i = Math.floor(Math.log(fileSize) / Math.log(1024))\n if (!fileSize) {\n return asText ? '0 bytes' : { size: 0, suffix: 'bytes' }\n }\n const size = (fileSize / Math.pow(1024, i)).toFixed(1)\n const suffix = suffixes[i]\n return asText ? `${size}${suffix}` : { size, suffix }\n}\n\nexport const getFileSizeInMB = fileSize => {\n const value = fileSize / 1048576\n return (!fileSize && 0) || +value.toFixed(2)\n}\n\nexport const version = '0.4.5' // version stored in 'utils' for now\nexport const apiUrl =\n process.env.NODE_ENV === 'production'\n ? '/api/'\n : `${process.env.REACT_APP_API_URL}/api/`\n\nexport const userFilters = [\n { key: 'workouts_count', label: 'workouts count' },\n { key: 'admin', label: 'admin rights' },\n { key: 'created_at', label: 'registration date' },\n { key: 'username', label: 'user name' },\n]\n\nexport const sortOrders = [\n { key: 'asc', label: 'ascending' },\n { key: 'desc', label: 'descending' },\n]\n\nexport const isLoggedIn = () => !!window.localStorage.authToken\n\nexport const generateIds = arr => {\n let i = 0\n return arr.map(val => {\n const obj = { id: i, value: val }\n i++\n return obj\n })\n}\n\nexport const createApiRequest = params => {\n const headers = {}\n if (!params.noAuthorization) {\n headers.Authorization = `Bearer ${window.localStorage.getItem('authToken')}`\n }\n if (params.type) {\n headers['Content-Type'] = params.type\n }\n const requestParams = {\n method: params.method,\n headers: headers,\n }\n if (params.type === 'application/json' && params.body) {\n requestParams.body = JSON.stringify(params.body)\n } else if (params.body) {\n requestParams.body = params.body\n }\n const request = new Request(`${apiUrl}${params.url}`, requestParams)\n return fetch(request)\n .then(response =>\n params.method === 'DELETE' || response.status === 413\n ? response\n : response.json()\n )\n .catch(error => {\n console.error(error)\n return new Error('An error occurred. Please contact the administrator.')\n })\n}\n\nexport const getDateWithTZ = (date, tz) => {\n if (!date) {\n return ''\n }\n const dt = DateTime.fromISO(\n format(new Date(date), \"yyyy-MM-dd'T'HH:mm:ss.SSSxxx\")\n ).setZone(tz)\n return parse(\n dt.toFormat('yyyy-MM-dd HH:mm:ss'),\n 'yyyy-MM-dd HH:mm:ss',\n new Date()\n )\n}\n\nexport const capitalize = target =>\n target.charAt(0).toUpperCase() + target.slice(1)\n\nexport const rangePagination = pages =>\n Array.from({ length: pages }, (_, i) => i + 1)\n\nconst sortValues = (a, b) => {\n const valueALabel = a.label.toLowerCase()\n const valueBLabel = b.label.toLowerCase()\n return valueALabel > valueBLabel ? 1 : valueALabel < valueBLabel ? -1 : 0\n}\n\nexport const translateValues = (t, values, key = 'common') =>\n values\n .map(value => ({\n ...value,\n label: t(`${key}:${value.label}`),\n }))\n .sort(sortValues)\n\nexport const formatUrl = (pathname, query) => {\n let url = pathname\n if (query.id || (pathname === 'users' && query.username)) {\n url = `${url}/${query.username ? query.username : query.id}`\n } else if (Object.keys(query).length > 0) {\n url += '?'\n Object.keys(query)\n .filter(key => query[key])\n .map(\n (key, index) => (url += `${index === 0 ? '' : '&'}${key}=${query[key]}`)\n )\n }\n return url\n}\n","import { createApiRequest, formatUrl } from '../utils'\n\nexport default class FitTrackeeApi {\n static getData(target, data = {}) {\n const url = formatUrl(target, data)\n const params = {\n url: url,\n method: 'GET',\n type: 'application/json',\n }\n return createApiRequest(params)\n }\n\n static addData(target, data) {\n const params = {\n url: target,\n method: 'POST',\n body: data,\n type: 'application/json',\n }\n return createApiRequest(params)\n }\n\n static addDataWithFile(target, data) {\n const params = {\n url: target,\n method: 'POST',\n body: data,\n }\n return createApiRequest(params)\n }\n\n static postData(target, data) {\n const params = {\n url: `${target}${data.id ? `/${data.id}` : ''}`,\n method: 'POST',\n body: data,\n type: 'application/json',\n }\n return createApiRequest(params)\n }\n\n static updateData(target, data) {\n const params = {\n url: `${target}${\n data.id ? `/${data.id}` : data.username ? `/${data.username}` : ''\n }`,\n method: 'PATCH',\n body: data,\n type: 'application/json',\n }\n return createApiRequest(params)\n }\n\n static deleteData(target, id) {\n const params = {\n url: `${target}/${id}`,\n method: 'DELETE',\n type: 'application/json',\n }\n return createApiRequest(params)\n }\n}\n","import i18next from 'i18next'\n\nimport FitTrackeeApi from '../fitTrackeeApi/index'\nimport { history } from '../index'\n\nexport const emptyMessages = () => ({\n type: 'CLEAN_ALL_MESSAGES',\n})\n\nexport const setData = (target, data) => ({\n type: 'SET_DATA',\n data,\n target,\n})\n\nexport const setPaginatedData = (target, data, pagination) => ({\n type: 'SET_PAGINATED_DATA',\n data,\n pagination,\n target,\n})\n\nexport const setError = message => ({\n type: 'SET_ERROR',\n message,\n})\n\nexport const setLanguage = language => ({\n type: 'SET_LANGUAGE',\n language,\n})\n\nexport const setLoading = loading => ({\n type: 'SET_LOADING',\n loading,\n})\n\nexport const updateSportsData = data => ({\n type: 'UPDATE_SPORT_DATA',\n data,\n})\n\nexport const updateUsersData = data => ({\n type: 'UPDATE_USER_DATA',\n data,\n})\n\nexport const getOrUpdateData = (\n action,\n target,\n data,\n canDispatch = true\n) => dispatch => {\n dispatch(setLoading(true))\n if (data && data.id && target !== 'workouts' && isNaN(data.id)) {\n dispatch(setLoading(false))\n return dispatch(setError(`${target}|Incorrect id`))\n }\n dispatch(emptyMessages())\n return FitTrackeeApi[action](target, data)\n .then(ret => {\n if (ret.status === 'success') {\n if (canDispatch) {\n if (target === 'users' && action === 'getData') {\n return dispatch(setPaginatedData(target, ret.data, ret.pagination))\n }\n dispatch(setData(target, ret.data))\n } else if (action === 'updateData' && target === 'sports') {\n dispatch(updateSportsData(ret.data.sports[0]))\n } else if (action === 'updateData' && target === 'users') {\n dispatch(updateUsersData(ret.data.users[0]))\n }\n } else {\n dispatch(setError(`${target}|${ret.message || ret.status}`))\n }\n dispatch(setLoading(false))\n })\n .catch(error => {\n dispatch(setLoading(false))\n dispatch(setError(`${target}|${error}`))\n })\n}\n\nexport const addData = (target, data) => dispatch =>\n FitTrackeeApi.addData(target, data)\n .then(ret => {\n if (ret.status === 'created') {\n history.push(`/admin/${target}`)\n } else {\n dispatch(setError(`${target}|${ret.status}`))\n }\n })\n .catch(error => dispatch(setError(`${target}|${error}`)))\n\nexport const deleteData = (target, id) => dispatch => {\n if (isNaN(id)) {\n return dispatch(setError(target, `${target}|Incorrect id`))\n }\n return FitTrackeeApi.deleteData(target, id)\n .then(ret => {\n if (ret.status === 204) {\n history.push(`/admin/${target}`)\n } else {\n dispatch(setError(`${target}|${ret.message || ret.status}`))\n }\n })\n .catch(error => dispatch(setError(`${target}|${error}`)))\n}\n\nexport const updateLanguage = language => dispatch => {\n i18next.changeLanguage(language).then(dispatch(setLanguage(language)))\n}\n","import FitTrackeeGenericApi from '../fitTrackeeApi'\nimport { history } from '../index'\nimport { generateIds } from '../utils'\nimport { emptyMessages, setError } from './index'\n\nexport const setAppConfig = data => ({\n type: 'SET_APP_CONFIG',\n data,\n})\n\nexport const setAppStats = data => ({\n type: 'SET_APP_STATS',\n data,\n})\n\nconst SetAppErrors = messages => ({ type: 'APP_ERRORS', messages })\n\nexport const getAppData = target => dispatch =>\n FitTrackeeGenericApi.getData(target)\n .then(ret => {\n if (ret.status === 'success') {\n if (target === 'config') {\n dispatch(setAppConfig(ret.data))\n } else if (target === 'stats/all') {\n dispatch(setAppStats(ret.data))\n }\n } else {\n dispatch(setError(`application|${ret.message}`))\n }\n })\n .catch(error => dispatch(setError(`application|${error}`)))\n\nexport const updateAppConfig = formData => dispatch => {\n dispatch(emptyMessages())\n FitTrackeeGenericApi.updateData('config', formData)\n .then(ret => {\n if (ret.status === 'success') {\n dispatch(setAppConfig(ret.data))\n history.push('/admin/application')\n } else if (Array.isArray(ret.message)) {\n dispatch(SetAppErrors(generateIds(ret.message)))\n } else {\n dispatch(setError(ret.message))\n }\n })\n .catch(error => dispatch(setError(`application|${error}`)))\n}\n","import React from 'react'\nimport { connect } from 'react-redux'\n\nimport Message from '../Common/Message'\nimport { getAppData, updateAppConfig } from '../../actions/application'\nimport { history } from '../../index'\nimport { getFileSizeInMB } from '../../utils'\n\nclass AdminApplication extends React.Component {\n constructor(props, context) {\n super(props, context)\n this.state = {\n formData: {},\n }\n }\n\n componentDidMount() {\n this.initForm()\n }\n\n componentDidUpdate(prevProps) {\n if (this.props.appConfig !== prevProps.appConfig) {\n this.initForm()\n }\n }\n\n initForm() {\n const { appConfig } = this.props\n const formData = {}\n Object.keys(appConfig).map(k =>\n appConfig[k] === null\n ? (formData[k] = '')\n : ['max_single_file_size', 'max_zip_file_size'].includes(k)\n ? (formData[k] = getFileSizeInMB(appConfig[k]))\n : (formData[k] = appConfig[k])\n )\n this.setState({ formData })\n }\n\n handleFormChange(e) {\n const { formData } = this.state\n formData[e.target.name] = +e.target.value\n this.setState(formData)\n }\n\n render() {\n const {\n isInEdition,\n loadAppConfig,\n message,\n messages,\n onHandleConfigFormSubmit,\n t,\n } = this.props\n const { formData } = this.state\n return (\n <div>\n {(message || messages) && (\n <Message message={message} messages={messages} t={t} />\n )}\n {Object.keys(formData).length > 0 && (\n <div className=\"row\">\n <div className=\"col-md-12\">\n <div className=\"card\">\n <div className=\"card-header\">\n <strong>\n {t('administration:Application configuration')}\n </strong>\n </div>\n <div className=\"card-body\">\n <form\n className={`app-config-form ${\n isInEdition ? '' : 'form-disabled'\n }`}\n onSubmit={e => {\n e.preventDefault()\n onHandleConfigFormSubmit(formData)\n }}\n >\n <div className=\"form-group row\">\n <label\n className=\"col-sm-6 col-form-label\"\n htmlFor=\"max_users\"\n >\n {t(\n // eslint-disable-next-line max-len\n 'administration:Max. number of active users'\n )}\n <sup>\n <i\n className=\"fa fa-question-circle\"\n aria-hidden=\"true\"\n title={t('administration:if 0, no limitation')}\n />\n </sup>\n :\n </label>\n <input\n className=\"col-sm-5\"\n id=\"max_users\"\n name=\"max_users\"\n type=\"number\"\n min=\"0\"\n value={formData.max_users}\n onChange={e => this.handleFormChange(e)}\n />\n </div>\n <div className=\"form-group row\">\n <label\n className=\"col-sm-6 col-form-label\"\n htmlFor=\"max_single_file_size\"\n >\n {t(\n 'administration:Max. size of uploaded files (in Mb)'\n )}\n :\n </label>\n <input\n className=\"col-sm-5\"\n id=\"max_single_file_size\"\n name=\"max_single_file_size\"\n type=\"number\"\n step=\"0.1\"\n min=\"0\"\n value={formData.max_single_file_size}\n onChange={e => this.handleFormChange(e)}\n />\n </div>\n <div className=\"form-group row\">\n <label\n className=\"col-sm-6 col-form-label\"\n htmlFor=\"max_zip_file_size\"\n >\n {t('administration:Max. size of zip archive (in Mb)')}:\n </label>\n <input\n className=\"col-sm-5\"\n id=\"max_zip_file_size\"\n name=\"max_zip_file_size\"\n type=\"number\"\n step=\"0.1\"\n min=\"0\"\n value={formData.max_zip_file_size}\n onChange={e => this.handleFormChange(e)}\n />\n </div>\n <div className=\"form-group row\">\n <label\n className=\"col-sm-6 col-form-label\"\n htmlFor=\"gpx_limit_import\"\n >\n {t('administration:Max. files of zip archive')}\n </label>\n <input\n className=\"col-sm-5\"\n id=\"gpx_limit_import\"\n name=\"gpx_limit_import\"\n type=\"number\"\n min=\"0\"\n value={formData.gpx_limit_import}\n onChange={e => this.handleFormChange(e)}\n />\n </div>\n {isInEdition ? (\n <>\n <input\n type=\"submit\"\n className=\"btn btn-primary\"\n value={t('common:Submit')}\n />\n <input\n type=\"submit\"\n className=\"btn btn-secondary\"\n onClick={e => {\n e.preventDefault()\n loadAppConfig()\n history.push('/admin/application')\n }}\n value={t('common:Cancel')}\n />\n </>\n ) : (\n <>\n <input\n type=\"submit\"\n className=\"btn btn-primary\"\n onClick={e => {\n e.preventDefault()\n history.push('/admin/application/edit')\n }}\n value={t('common:Edit')}\n />\n <input\n type=\"submit\"\n className=\"btn btn-secondary\"\n onClick={() => history.push('/admin')}\n value={t('common:Back')}\n />\n </>\n )}\n </form>\n </div>\n </div>\n </div>\n </div>\n )}\n </div>\n )\n }\n}\n\nexport default connect(\n state => ({\n message: state.message,\n messages: state.messages,\n }),\n dispatch => ({\n loadAppConfig: () => {\n dispatch(getAppData('config'))\n },\n onHandleConfigFormSubmit: formData => {\n const data = Object.assign({}, formData)\n data.max_single_file_size *= 1048576\n data.max_zip_file_size *= 1048576\n dispatch(updateAppConfig(data))\n },\n })\n)(AdminApplication)\n","import React from 'react'\nimport { withTranslation } from 'react-i18next'\nimport { connect } from 'react-redux'\n\nimport { getAppData } from '../../actions/application'\nimport { getFileSize } from '../../utils'\n\nclass AdminStats extends React.Component {\n componentDidMount() {\n this.props.loadAppStats()\n }\n\n render() {\n const { appStats, t } = this.props\n const uploadDirSize = getFileSize(appStats.uploads_dir_size, false)\n return (\n <div className=\"row\">\n <div className=\"col-lg-3 col-md-6 col-sm-6\">\n <div className=\"card workout-card\">\n <div className=\"card-body row\">\n <div className=\"col-3\">\n <i className=\"fa fa-users fa-3x fa-color\" />\n </div>\n <div className=\"col-9 text-right\">\n <div className=\"huge\">\n {appStats.users ? appStats.users : 0}\n </div>\n <div>{`${\n appStats.users === 1\n ? t('administration:user')\n : t('administration:users')\n }`}</div>\n </div>\n </div>\n </div>\n </div>\n <div className=\"col-lg-3 col-md-6 col-sm-6\">\n <div className=\"card workout-card\">\n <div className=\"card-body row\">\n <div className=\"col-3\">\n <i className=\"fa fa-tags fa-3x fa-color\" />\n </div>\n <div className=\"col-9 text-right\">\n <div className=\"huge\">\n {appStats.sports ? appStats.sports : 0}\n </div>\n <div>{`${\n appStats.sports === 1 ? t('common:sport') : t('common:sports')\n }`}</div>\n </div>\n </div>\n </div>\n </div>\n <div className=\"col-lg-3 col-md-6 col-sm-6\">\n <div className=\"card workout-card\">\n <div className=\"card-body row\">\n <div className=\"col-3\">\n <i className=\"fa fa-calendar fa-3x fa-color\" />\n </div>\n <div className=\"col-9 text-right\">\n <div className=\"huge\">\n {appStats.workouts ? appStats.workouts : 0}\n </div>\n <div>{`${\n appStats.workouts === 1\n ? t('common:workout')\n : t('common:workouts')\n }`}</div>\n </div>\n </div>\n </div>\n </div>\n <div className=\"col-lg-3 col-md-6 col-sm-6\">\n <div className=\"card workout-card\">\n <div className=\"card-body row\">\n <div className=\"col-3\">\n <i className=\"fa fa-folder-open fa-3x fa-color\" />\n </div>\n <div className=\"col-9 text-right\">\n <div className=\"huge\">{uploadDirSize.size}</div>\n <div>\n {uploadDirSize.suffix} ({t('administration:uploads')})\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n )\n }\n}\n\nexport default withTranslation()(\n connect(\n state => ({\n appStats: state.application.statistics,\n }),\n dispatch => ({\n loadAppStats: () => {\n dispatch(getAppData('stats/all'))\n },\n })\n )(AdminStats)\n)\n","import React from 'react'\nimport { Link } from 'react-router-dom'\n\nimport AdminStats from './AdminStats'\n\nexport default function AdminDashboard(props) {\n const { appConfig, t } = props\n return (\n <div className=\"card workout-card\">\n <div className=\"card-header\">\n <strong>{t('administration:Administration')}</strong>\n </div>\n <div className=\"card-body\">\n <AdminStats />\n <br />\n <dl className=\"admin-items\">\n <dt>\n <Link\n to={{\n pathname: '/admin/application',\n }}\n >\n {t('administration:Application')}\n </Link>\n </dt>\n <dd>\n {t(\n 'administration:Update application configuration ' +\n '(maximum number of registered users, maximum files size).'\n )}\n <br />\n <strong>\n {t(\n `administration:Registration is currently ${\n appConfig.is_registration_enabled ? 'enabled' : 'disabled'\n }.`\n )}\n </strong>\n </dd>\n <br />\n <dt>\n <Link\n to={{\n pathname: '/admin/sports',\n }}\n >\n {t('administration:Sports')}\n </Link>\n </dt>\n <dd>{t('administration:Enable/disable sports.')}</dd>\n <br />\n <dt>\n <Link\n to={{\n pathname: '/admin/users',\n }}\n >\n {t('administration:Users')}\n </Link>\n </dt>\n <dd>\n {t(\n 'administration:Add/remove admin rights, ' +\n 'delete user account.'\n )}\n </dd>\n </dl>\n </div>\n </div>\n )\n}\n","import React from 'react'\nimport { connect } from 'react-redux'\n\nimport Message from '../Common/Message'\nimport { getOrUpdateData } from '../../actions'\nimport { history } from '../../index'\n\nclass AdminSports extends React.Component {\n componentDidMount() {\n this.props.loadSports()\n }\n\n render() {\n const { message, sports, t, updateSport } = this.props\n return (\n <div>\n {message && <Message message={message} t={t} />}\n <div className=\"row\">\n <div className=\"col\">\n <div className=\"card\">\n <div className=\"card-header\">\n <strong>{t('administration:Sports')}</strong>\n </div>\n <div className=\"card-body\">\n {sports.length > 0 && (\n <table className=\"table\">\n <thead>\n <tr>\n <th>{t('administration:id')}</th>\n <th>{t('administration:Image')}</th>\n <th>{t('administration:Label')}</th>\n <th>{t('administration:Active')}</th>\n <th>{t('administration:Actions')}</th>\n </tr>\n </thead>\n <tbody>\n {sports.map(sport => (\n <tr key={sport.id}>\n <td>\n <span className=\"heading-span-absolute\">\n {t('administration:id')}\n </span>\n {sport.id}\n </td>\n <td>\n <span className=\"heading-span-absolute\">\n {t('administration:Image')}\n </span>\n <img\n className=\"admin-img\"\n src={sport.img ? sport.img : '/img/photo.png'}\n alt=\"sport logo\"\n />\n </td>\n <td>\n <span className=\"heading-span-absolute\">\n {t('administration:Label')}\n </span>\n {t(`sports:${sport.label}`)}\n </td>\n <td>\n <span className=\"heading-span-absolute\">\n {t('administration:Active')}\n </span>\n {sport.is_active ? (\n <i\n className=\"fa fa-check-square-o custom-fa\"\n aria-hidden=\"true\"\n data-toggle=\"tooltip\"\n />\n ) : (\n <i\n className=\"fa fa-square-o custom-fa\"\n aria-hidden=\"true\"\n data-toggle=\"tooltip\"\n />\n )}\n </td>\n <td>\n <span className=\"heading-span-absolute\">\n {t('administration:Actions')}\n </span>\n <input\n type=\"submit\"\n className={`btn btn-${\n sport.is_active ? 'dark' : 'primary'\n } btn-sm`}\n value={\n sport.is_active\n ? t('administration:Disable')\n : t('administration:Enable')\n }\n onClick={() =>\n updateSport(sport.id, !sport.is_active)\n }\n />\n {sport.has_workouts && (\n <span className=\"admin-message\">\n <i\n className=\"fa fa-warning custom-fa\"\n aria-hidden=\"true\"\n />\n {t('administration:workouts exist')}\n </span>\n )}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n )}\n <input\n type=\"submit\"\n className=\"btn btn-secondary\"\n onClick={() => history.push('/admin/')}\n value={t('common:Back')}\n />\n </div>\n </div>\n </div>\n </div>\n </div>\n )\n }\n}\n\nexport default connect(\n state => ({\n message: state.message,\n sports: state.sports.data,\n user: state.user,\n }),\n dispatch => ({\n loadSports: () => {\n dispatch(getOrUpdateData('getData', 'sports'))\n },\n updateSport: (sportId, isActive) => {\n const data = { id: sportId, is_active: isActive }\n dispatch(getOrUpdateData('updateData', 'sports', data, false))\n },\n })\n)(AdminSports)\n","import React from 'react'\nimport { Link } from 'react-router-dom'\n\nimport { formatUrl, rangePagination } from '../../utils'\n\nexport default class Pagination extends React.PureComponent {\n getUrl(value) {\n const { query, pathname } = this.props\n const newQuery = Object.assign({}, query)\n let page = query.page ? +query.page : 1\n switch (value) {\n case 'prev':\n page -= 1\n break\n case 'next':\n page += 1\n break\n default:\n page = +value\n }\n newQuery.page = page\n return formatUrl(pathname, newQuery)\n }\n\n render() {\n const { pagination, t } = this.props\n return (\n <>\n {pagination && Object.keys(pagination).length > 0 && (\n <nav aria-label=\"Page navigation example\">\n <ul className=\"pagination justify-content-center\">\n <li\n className={`page-item ${pagination.has_prev ? '' : 'disabled'}`}\n >\n <Link\n className=\"page-link\"\n to={this.getUrl('prev')}\n aria-disabled={!pagination.has_prev}\n >\n {t('common:Previous')}\n </Link>\n </li>\n {rangePagination(pagination.pages).map(page => (\n <li\n key={page}\n className={`page-item ${\n page === pagination.page ? 'active' : ''\n }`}\n >\n <Link className=\"page-link\" to={this.getUrl(page)}>\n {page}\n </Link>\n </li>\n ))}\n <li\n className={`page-item ${pagination.has_next ? '' : 'disabled'}`}\n >\n <Link\n className=\"page-link\"\n to={this.getUrl('next')}\n aria-disabled={!pagination.has_next}\n >\n {t('common:Next')}\n </Link>\n </li>\n </ul>\n </nav>\n )}\n </>\n )\n }\n}\n","import { format } from 'date-fns'\nimport React from 'react'\nimport { connect } from 'react-redux'\nimport { Link } from 'react-router-dom'\n\nimport Message from '../Common/Message'\nimport Pagination from '../Common/Pagination'\nimport { history } from '../../index'\nimport { getOrUpdateData } from '../../actions'\nimport {\n apiUrl,\n formatUrl,\n sortOrders,\n translateValues,\n userFilters,\n} from '../../utils'\n\nclass AdminUsers extends React.Component {\n constructor(props, context) {\n super(props, context)\n this.state = {\n page: null,\n per_page: null,\n order_by: 'created_at',\n order: 'asc',\n }\n }\n\n componentDidMount() {\n this.props.loadUsers(this.initState())\n }\n\n componentDidUpdate(prevProps) {\n if (prevProps.location.query !== this.props.location.query) {\n this.props.loadUsers(this.props.location.query)\n }\n }\n\n initState() {\n const { query } = this.props.location\n const newQuery = {\n page: query.page,\n per_page: query.per_page,\n order_by: query.order_by ? query.order_by : 'created_at',\n order: query.order ? query.order : 'asc',\n }\n this.setState(newQuery)\n return newQuery\n }\n\n updatePage(key, value) {\n const query = Object.assign({}, this.state)\n query[key] = value\n this.setState(query)\n const url = formatUrl(this.props.location.pathname, query)\n history.push(url)\n }\n\n render() {\n const {\n authUser,\n location,\n message,\n t,\n pagination,\n updateUser,\n users,\n } = this.props\n const translatedFilters = translateValues(t, userFilters)\n const translatedSortOrders = translateValues(t, sortOrders)\n return (\n <div>\n {message && <Message message={message} t={t} />}\n <div className=\"container\">\n <div className=\"row\">\n <div className=\"col\">\n <div className=\"card\">\n <div className=\"card-header\">\n <strong>{t('administration:Users')}</strong>\n </div>\n <div className=\"card-body\">\n <div className=\"row user-filters\">\n <div className=\"col-lg-4 col-md-6 col-sm-12\">\n <label htmlFor=\"order_by\">\n {t('common:Sort by')}:{' '}\n <select\n id=\"order_by\"\n name=\"order_by\"\n value={this.state.order_by}\n onChange={e =>\n this.updatePage('order_by', e.target.value)\n }\n >\n {translatedFilters.map(filter => (\n <option key={filter.key} value={filter.key}>\n {filter.label}\n </option>\n ))}\n </select>{' '}\n </label>\n </div>\n <div className=\"col-lg-4 col-md-6 col-sm-12\">\n <label htmlFor=\"sort\">\n {t('common:Sort')}:{' '}\n <select\n id=\"sort\"\n name=\"sort\"\n value={this.state.order}\n onChange={e =>\n this.updatePage('order', e.target.value)\n }\n >\n {translatedSortOrders.map(sort => (\n <option key={sort.key} value={sort.key}>\n {sort.label}\n </option>\n ))}\n </select>{' '}\n </label>\n </div>\n </div>\n <table className=\"table\">\n <thead>\n <tr>\n <th>#</th>\n <th>{t('user:Username')}</th>\n <th>{t('user:Email')}</th>\n <th>{t('user:Registration Date')}</th>\n <th>{t('workouts:Workouts')}</th>\n <th>{t('user:Admin')}</th>\n <th>{t('administration:Actions')}</th>\n </tr>\n </thead>\n <tbody>\n {users.map(user => (\n <tr key={user.username}>\n <td>\n <span className=\"heading-span-absolute\">#</span>\n {user.picture === true ? (\n <img\n alt=\"Avatar\"\n src={`${apiUrl}users/${\n user.username\n }/picture?${Date.now()}`}\n className=\"img-fluid App-nav-profile-img\"\n />\n ) : (\n <i\n className=\"fa fa-user-circle-o fa-2x no-picture\"\n aria-hidden=\"true\"\n />\n )}\n </td>\n <td>\n <span className=\"heading-span-absolute\">\n {t('user:Username')}\n </span>\n <Link to={`/users/${user.username}`}>\n {user.username}\n </Link>\n </td>\n <td>\n <span className=\"heading-span-absolute\">\n {t('user:Email')}\n </span>\n {user.email}\n </td>\n <td>\n <span className=\"heading-span-absolute\">\n {t('user:Registration Date')}\n </span>\n {format(\n new Date(user.created_at),\n 'dd/MM/yyyy HH:mm'\n )}\n </td>\n <td>\n <span className=\"heading-span-absolute\">\n {t('workouts:Workouts')}\n </span>\n {user.nb_workouts}\n </td>\n <td>\n <span className=\"heading-span-absolute\">\n {t('user:Admin')}\n </span>\n {user.admin ? (\n <i\n className=\"fa fa-check-square-o custom-fa\"\n aria-hidden=\"true\"\n data-toggle=\"tooltip\"\n />\n ) : (\n <i\n className=\"fa fa-square-o custom-fa\"\n aria-hidden=\"true\"\n data-toggle=\"tooltip\"\n />\n )}\n </td>\n <td>\n <span className=\"heading-span-absolute\">\n {t('administration:Actions')}\n </span>\n <input\n type=\"submit\"\n className={`btn btn-${\n user.admin ? 'dark' : 'primary'\n } btn-sm`}\n disabled={user.username === authUser.username}\n value={\n user.admin\n ? t('administration:Remove admin rights')\n : t('administration:Add admin rights')\n }\n onClick={() =>\n updateUser(user.username, !user.admin)\n }\n />\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n <Pagination\n pagination={pagination}\n pathname={location.pathname}\n query={this.state}\n t={t}\n />\n <input\n type=\"submit\"\n className=\"btn btn-secondary\"\n onClick={() => history.push('/admin/')}\n value={t('common:Back')}\n />\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n )\n }\n}\n\nexport default connect(\n state => ({\n authUser: state.user,\n location: state.router.location,\n message: state.message,\n pagination: state.users.pagination,\n users: state.users.data,\n }),\n dispatch => ({\n loadUsers: query => {\n dispatch(getOrUpdateData('getData', 'users', query))\n },\n updateUser: (userName, isAdmin) => {\n const data = { username: userName, admin: isAdmin }\n dispatch(getOrUpdateData('updateData', 'users', data, false))\n },\n })\n)(AdminUsers)\n","import React from 'react'\nimport { Helmet } from 'react-helmet'\nimport { useTranslation } from 'react-i18next'\n\nexport default function NotFound() {\n const { t } = useTranslation()\n return (\n <div>\n <Helmet>\n <title>fittrackee - 404</title>\n </Helmet>\n <h1 className=\"page-title\">{t('Page not found')}</h1>\n </div>\n )\n}\n","import React from 'react'\nimport { Helmet } from 'react-helmet'\nimport { withTranslation } from 'react-i18next'\nimport { connect } from 'react-redux'\nimport { Route, Switch } from 'react-router-dom'\n\nimport AdminApplication from './AdminApplication'\nimport AdminDashboard from './AdminDashboard'\nimport AdminSports from './AdminSports'\nimport AdminUsers from './AdminUsers'\nimport NotFound from './../Others/NotFound'\n\nfunction Admin(props) {\n const { appConfig, t, user } = props\n return (\n <>\n <Helmet>\n <title>FitTrackee - {t('administration:Administration')}</title>\n </Helmet>\n <div className=\"container dashboard\">\n {user.admin ? (\n <Switch>\n <Route\n exact\n path=\"/admin\"\n render={() => <AdminDashboard appConfig={appConfig} t={t} />}\n />\n <Route\n exact\n path=\"/admin/application\"\n render={() => (\n <AdminApplication\n appConfig={appConfig}\n t={t}\n isInEdition={false}\n />\n )}\n />\n <Route\n exact\n path=\"/admin/application/edit\"\n render={() => (\n <AdminApplication appConfig={appConfig} t={t} isInEdition />\n )}\n />\n <Route\n exact\n path=\"/admin/sports\"\n render={() => <AdminSports t={t} />}\n />\n <Route\n exact\n path=\"/admin/users\"\n render={() => <AdminUsers t={t} />}\n />\n <Route component={NotFound} />\n </Switch>\n ) : (\n <NotFound />\n )}\n </div>\n </>\n )\n}\n\nexport default withTranslation()(\n connect(state => ({\n appConfig: state.application.config,\n user: state.user,\n }))(Admin)\n)\n","import { format, subHours } from 'date-fns'\nimport togeojson from '@mapbox/togeojson'\n\nimport { getDateWithTZ } from './index'\n\nexport const workoutColors = [\n '#55a8a3',\n '#98C3A9',\n '#D0838A',\n '#ECC77E',\n '#926692',\n '#929292',\n '#428bca',\n]\n\nexport const recordsLabels = [\n { record_type: 'AS', label: 'Ave. speed' },\n { record_type: 'FD', label: 'Farest distance' },\n { record_type: 'LD', label: 'Longest duration' },\n { record_type: 'MS', label: 'Max. speed' },\n]\n\nexport const getGeoJson = gpxContent => {\n let jsonData\n if (gpxContent) {\n const gpx = new DOMParser().parseFromString(gpxContent, 'text/xml')\n jsonData = togeojson.gpx(gpx)\n }\n return { jsonData }\n}\n\nexport const formatWorkoutDate = (\n dateTime,\n dateFormat = null,\n timeFormat = null\n) => {\n if (!dateFormat) {\n dateFormat = 'yyyy/MM/dd'\n }\n if (!timeFormat) {\n timeFormat = 'HH:mm'\n }\n return {\n workout_date: dateTime ? format(dateTime, dateFormat) : null,\n workout_time: dateTime ? format(dateTime, timeFormat) : null,\n }\n}\n\nexport const formatWorkoutDuration = seconds => {\n let newDate = new Date(0)\n newDate = subHours(newDate.setSeconds(seconds), 1)\n return newDate.getTime()\n}\n\nexport const formatChartData = chartData => {\n for (let i = 0; i < chartData.length; i++) {\n chartData[i].time = new Date(chartData[i].time).getTime()\n chartData[i].duration = formatWorkoutDuration(chartData[i].duration)\n }\n return chartData\n}\n\nexport const formatRecord = (record, tz) => {\n let value\n switch (record.record_type) {\n case 'AS':\n case 'MS':\n value = `${record.value} km/h`\n break\n case 'FD':\n value = `${record.value} km`\n break\n default:\n // 'LD'\n value = record.value // eslint-disable-line prefer-destructuring\n }\n const [recordType] = recordsLabels.filter(\n r => r.record_type === record.record_type\n )\n return {\n workout_date: formatWorkoutDate(getDateWithTZ(record.workout_date, tz))\n .workout_date,\n workout_id: record.workout_id,\n id: record.id,\n record_type: recordType.label,\n value: value,\n }\n}\n\nconst sortSports = (a, b) => {\n const sportALabel = a.label.toLowerCase()\n const sportBLabel = b.label.toLowerCase()\n return sportALabel > sportBLabel ? 1 : sportALabel < sportBLabel ? -1 : 0\n}\n\nexport const translateSports = (sports, t, onlyActive = false) =>\n sports\n .filter(sport => (onlyActive ? sport.is_active : true))\n .map(sport => ({\n ...sport,\n label: t(`sports:${sport.label}`),\n }))\n .sort(sortSports)\n","import { createApiRequest } from '../utils'\n\nexport default class FitTrackeeApi {\n static loginOrRegisterOrPasswordReset(target, data) {\n const params = {\n url: `auth/${target}`,\n method: 'POST',\n noAuthorization: true,\n body: data,\n type: 'application/json',\n }\n return createApiRequest(params)\n }\n\n static deletePicture() {\n const params = {\n url: 'auth/picture',\n method: 'DELETE',\n }\n return createApiRequest(params)\n }\n}\n","import FitTrackeeGenericApi from '../fitTrackeeApi'\nimport FitTrackeeApi from '../fitTrackeeApi/auth'\nimport { history } from '../index'\nimport { generateIds } from '../utils'\nimport { getOrUpdateData, setError, updateLanguage } from './index'\nimport { getAppData } from './application'\n\nconst AuthError = message => ({ type: 'AUTH_ERROR', message })\n\nconst AuthErrors = messages => ({ type: 'AUTH_ERRORS', messages })\n\nconst PictureError = message => ({ type: 'PICTURE_ERROR', message })\n\nconst ProfileSuccess = profil => ({ type: 'PROFILE_SUCCESS', profil })\n\nconst ProfileError = message => ({ type: 'PROFILE_ERROR', message })\n\nconst ProfileUpdateError = message => ({\n type: 'PROFILE_UPDATE_ERROR',\n message,\n})\n\nexport const logout = () => ({ type: 'LOGOUT' })\n\nexport const loadProfile = () => dispatch => {\n if (window.localStorage.getItem('authToken')) {\n return dispatch(getProfile())\n }\n return { type: 'LOGOUT' }\n}\n\nexport const getProfile = () => dispatch =>\n FitTrackeeGenericApi.getData('auth/profile')\n .then(ret => {\n if (ret.status === 'success') {\n dispatch(getOrUpdateData('getData', 'sports'))\n ret.data.isAuthenticated = true\n if (ret.data.language) {\n dispatch(updateLanguage(ret.data.language))\n }\n return dispatch(ProfileSuccess(ret.data))\n }\n return dispatch(ProfileError(ret.message))\n })\n .catch(error => {\n throw error\n })\n\nexport const loginOrRegisterOrPasswordReset = (target, formData) => dispatch =>\n FitTrackeeApi.loginOrRegisterOrPasswordReset(target, formData)\n .then(ret => {\n if (ret.status === 'success') {\n if (target === 'password/reset-request') {\n return history.push({\n pathname: '/password-reset/sent',\n })\n }\n if (target === 'password/update') {\n return history.push({\n pathname: '/updated-password',\n })\n }\n if (target === 'login' || target === 'register') {\n window.localStorage.setItem('authToken', ret.auth_token)\n if (target === 'register') {\n dispatch(getAppData('config'))\n }\n return dispatch(getProfile())\n }\n }\n return dispatch(AuthError(ret.message))\n })\n .catch(error => {\n throw error\n })\n\nconst RegisterFormControl = (formData, onlyPasswords = false) => {\n const errMsg = []\n if (\n !onlyPasswords &&\n (formData.username.length < 3 || formData.username.length > 12)\n ) {\n errMsg.push('3 to 12 characters required for username.')\n }\n if (formData.password !== formData.password_conf) {\n errMsg.push(\"Password and password confirmation don't match.\")\n }\n if (formData.password.length < 8) {\n errMsg.push('8 characters required for password.')\n }\n return errMsg\n}\n\nexport const handleUserFormSubmit = (formData, formType) => dispatch => {\n if (formType === 'register' || formType === 'password/update') {\n const ret = RegisterFormControl(formData, formType === 'password/update')\n if (ret.length > 0) {\n return dispatch(AuthErrors(generateIds(ret)))\n }\n }\n return dispatch(loginOrRegisterOrPasswordReset(formType, formData))\n}\n\nexport const handleProfileFormSubmit = formData => dispatch => {\n if (!formData.password === formData.password_conf) {\n return dispatch(\n ProfileUpdateError(\"Password and password confirmation don't match.\")\n )\n }\n delete formData.id\n return FitTrackeeGenericApi.postData('auth/profile/edit', formData)\n .then(ret => {\n if (ret.status === 'success') {\n dispatch(getProfile())\n return history.push('/profile')\n }\n dispatch(ProfileUpdateError(ret.message))\n })\n .catch(error => {\n throw error\n })\n}\n\nexport const uploadPicture = event => dispatch => {\n event.preventDefault()\n const form = new FormData()\n form.append('file', event.target.picture.files[0])\n event.target.reset()\n return FitTrackeeGenericApi.addDataWithFile('auth/picture', form)\n .then(ret => {\n if (ret.status === 'success') {\n return dispatch(getProfile())\n }\n const msg =\n ret.status === 413\n ? 'Error during picture update, file size exceeds max size.'\n : ret.message\n return dispatch(PictureError(msg))\n })\n .catch(error => {\n throw error\n })\n}\n\nexport const deletePicture = () => dispatch =>\n FitTrackeeApi.deletePicture()\n .then(ret => {\n if (ret.status === 204) {\n return dispatch(getProfile())\n }\n return dispatch(PictureError(ret.message))\n })\n .catch(error => {\n throw error\n })\n\nexport const deleteUser = (username, isAdmin = false) => dispatch =>\n FitTrackeeGenericApi.deleteData('users', username)\n .then(ret => {\n if (ret.status === 204) {\n dispatch(getAppData('config'))\n if (isAdmin) {\n history.push('/admin/users')\n } else {\n dispatch(logout())\n history.push('/')\n }\n } else {\n ret.json().then(r => dispatch(setError(`${r.message}`)))\n }\n })\n .catch(error => dispatch(setError(`user|${error}`)))\n","import FitTrackeeGenericApi from '../fitTrackeeApi'\nimport { history } from '../index'\nimport { formatChartData } from '../utils/workouts'\nimport { setError, setLoading } from './index'\nimport { loadProfile } from './user'\n\nexport const pushWorkouts = workouts => ({\n type: 'PUSH_WORKOUTS',\n workouts,\n})\n\nexport const removeWorkout = workoutId => ({\n type: 'REMOVE_WORKOUT',\n workoutId,\n})\n\nexport const updateCalendar = workouts => ({\n type: 'UPDATE_CALENDAR',\n workouts,\n})\n\nexport const setGpx = gpxContent => ({\n type: 'SET_GPX',\n gpxContent,\n})\n\nexport const setChartData = chartData => ({\n type: 'SET_CHART_DATA',\n chartData,\n})\n\nexport const addWorkout = form => dispatch =>\n FitTrackeeGenericApi.addDataWithFile('workouts', form)\n .then(ret => {\n if (ret.status === 'created') {\n if (ret.data.workouts.length === 0) {\n dispatch(setError('workouts|no correct file.'))\n } else if (ret.data.workouts.length === 1) {\n dispatch(loadProfile())\n history.push(`/workouts/${ret.data.workouts[0].id}`)\n } else {\n // ret.data.workouts.length > 1\n dispatch(loadProfile())\n history.push('/')\n }\n } else if (ret.status === 413) {\n dispatch(\n setError('workouts|File size is greater than the allowed size')\n )\n } else {\n dispatch(setError(`workouts|${ret.message}`))\n }\n dispatch(setLoading(false))\n })\n .catch(error => {\n dispatch(setLoading(false))\n dispatch(setError(`workouts|${error}`))\n })\n\nexport const addWorkoutWithoutGpx = form => dispatch =>\n FitTrackeeGenericApi.addData('workouts/no_gpx', form)\n .then(ret => {\n if (ret.status === 'created') {\n dispatch(loadProfile())\n history.push(`/workouts/${ret.data.workouts[0].id}`)\n } else {\n dispatch(setError(`workouts|${ret.message}`))\n }\n })\n .catch(error => dispatch(setError(`workouts|${error}`)))\n\nexport const getWorkoutGpx = workoutId => dispatch => {\n if (workoutId) {\n return FitTrackeeGenericApi.getData(`workouts/${workoutId}/gpx`)\n .then(ret => {\n if (ret.status === 'success') {\n dispatch(setGpx(ret.data.gpx))\n } else {\n dispatch(setError(`workouts|${ret.message}`))\n }\n })\n .catch(error => dispatch(setError(`workouts|${error}`)))\n }\n dispatch(setGpx(null))\n}\n\nexport const getSegmentGpx = (workoutId, segmentId) => dispatch => {\n if (workoutId) {\n return FitTrackeeGenericApi.getData(\n `workouts/${workoutId}/gpx/segment/${segmentId}`\n )\n .then(ret => {\n if (ret.status === 'success') {\n dispatch(setGpx(ret.data.gpx))\n } else {\n dispatch(setError(`workouts|${ret.message}`))\n }\n })\n .catch(error => dispatch(setError(`workouts|${error}`)))\n }\n dispatch(setGpx(null))\n}\n\nexport const getWorkoutChartData = workoutId => dispatch => {\n if (workoutId) {\n return FitTrackeeGenericApi.getData(`workouts/${workoutId}/chart_data`)\n .then(ret => {\n if (ret.status === 'success') {\n dispatch(setChartData(formatChartData(ret.data.chart_data)))\n } else {\n dispatch(setError(`workouts|${ret.message}`))\n }\n })\n .catch(error => dispatch(setError(`workouts|${error}`)))\n }\n dispatch(setChartData(null))\n}\n\nexport const getSegmentChartData = (workoutId, segmentId) => dispatch => {\n if (workoutId) {\n return FitTrackeeGenericApi.getData(\n `workouts/${workoutId}/chart_data/segment/${segmentId}`\n )\n .then(ret => {\n if (ret.status === 'success') {\n dispatch(setChartData(formatChartData(ret.data.chart_data)))\n } else {\n dispatch(setError(`workouts|${ret.message}`))\n }\n })\n .catch(error => dispatch(setError(`workouts|${error}`)))\n }\n dispatch(setChartData(null))\n}\n\nexport const deleteWorkout = id => dispatch =>\n FitTrackeeGenericApi.deleteData('workouts', id)\n .then(ret => {\n if (ret.status === 204) {\n Promise.resolve(dispatch(removeWorkout(id)))\n .then(() => dispatch(loadProfile()))\n .then(() => history.push('/'))\n } else {\n dispatch(setError(`workouts|${ret.status}`))\n }\n })\n .catch(error => dispatch(setError(`workouts|${error}`)))\n\nexport const editWorkout = form => dispatch =>\n FitTrackeeGenericApi.updateData('workouts', form)\n .then(ret => {\n if (ret.status === 'success') {\n dispatch(loadProfile())\n history.push(`/workouts/${ret.data.workouts[0].id}`)\n } else {\n dispatch(setError(`workouts|${ret.message}`))\n }\n dispatch(setLoading(false))\n })\n .catch(error => {\n dispatch(setLoading(false))\n dispatch(setError(`workouts|${error}`))\n })\n\nexport const getMoreWorkouts = params => dispatch =>\n FitTrackeeGenericApi.getData('workouts', params)\n .then(ret => {\n if (ret.status === 'success') {\n if (ret.data.workouts.length > 0) {\n dispatch(pushWorkouts(ret.data.workouts))\n }\n } else {\n dispatch(setError(`workouts|${ret.message}`))\n }\n })\n .catch(error => dispatch(setError(`workouts|${error}`)))\n\nexport const getMonthWorkouts = (from, to) => dispatch =>\n FitTrackeeGenericApi.getData('workouts', {\n from,\n to,\n order: 'desc',\n per_page: 100,\n })\n .then(ret => {\n if (ret.status === 'success') {\n dispatch(updateCalendar(ret.data.workouts))\n } else {\n dispatch(setError(`workouts|${ret.message}`))\n }\n })\n .catch(error => dispatch(setError(`workouts|${error}`)))\n","import React from 'react'\nimport { Trans } from 'react-i18next'\nimport { connect } from 'react-redux'\n\nimport { setLoading } from '../../../actions/index'\nimport { addWorkout, editWorkout } from '../../../actions/workouts'\nimport { history } from '../../../index'\nimport { getFileSize } from '../../../utils'\nimport { translateSports } from '../../../utils/workouts'\n\nfunction FormWithGpx(props) {\n const {\n appConfig,\n loading,\n onAddWorkout,\n onEditWorkout,\n sports,\n t,\n workout,\n } = props\n const sportId = workout ? workout.sport_id : ''\n const translatedSports = translateSports(sports, t, true)\n const zipTooltip = `${t('workouts:no folder inside')}, ${\n appConfig.gpx_limit_import\n } ${t('workouts:files max')}, ${t('workouts:max size')}: ${getFileSize(\n appConfig.max_zip_file_size\n )}`\n const fileSizeLimit = getFileSize(appConfig.max_single_file_size)\n return (\n <form\n encType=\"multipart/form-data\"\n method=\"post\"\n onSubmit={event => event.preventDefault()}\n >\n <div className=\"form-group\">\n <label>\n {t('common:Sport')}:\n <select\n className=\"form-control input-lg\"\n defaultValue={sportId}\n disabled={loading}\n name=\"sport\"\n required\n >\n <option value=\"\" />\n {translatedSports.map(sport => (\n <option key={sport.id} value={sport.id}>\n {sport.label}\n </option>\n ))}\n </select>\n </label>\n </div>\n {workout ? (\n <div className=\"form-group\">\n <label>\n {t('workouts:Title')}:\n <input\n name=\"title\"\n defaultValue={workout ? workout.title : ''}\n disabled={loading}\n className=\"form-control input-lg\"\n />\n </label>\n </div>\n ) : (\n <div className=\"form-group\">\n <label>\n <Trans i18nKey=\"workouts:gpxFile\">\n <strong>gpx</strong> file\n </Trans>\n <sup>\n <i\n className=\"fa fa-question-circle\"\n aria-hidden=\"true\"\n data-toggle=\"tooltip\"\n title={`${t('workouts:max size')}: ${fileSizeLimit}`}\n />\n </sup>{' '}\n <Trans i18nKey=\"workouts:zipFile\">\n or <strong> zip</strong> file containing <strong>gpx </strong>\n files\n </Trans>\n <sup>\n <i\n className=\"fa fa-question-circle\"\n aria-hidden=\"true\"\n data-toggle=\"tooltip\"\n data-placement=\"top\"\n title={zipTooltip}\n />\n </sup>{' '}\n :\n <input\n accept=\".gpx, .zip\"\n className=\"form-control form-control-file gpx-file\"\n disabled={loading}\n name=\"gpxFile\"\n required\n type=\"file\"\n />\n </label>\n </div>\n )}\n <div className=\"form-group\">\n <label>\n {t('workouts:Notes')}:\n <textarea\n name=\"notes\"\n defaultValue={workout ? workout.notes : ''}\n disabled={loading}\n className=\"form-control input-lg\"\n maxLength=\"500\"\n />\n </label>\n </div>\n {loading ? (\n <div className=\"loader\" />\n ) : (\n <div>\n <input\n type=\"submit\"\n className=\"btn btn-primary\"\n onClick={event =>\n workout ? onEditWorkout(event, workout) : onAddWorkout(event)\n }\n value={t('common:Submit')}\n />\n <input\n type=\"submit\"\n className=\"btn btn-secondary\"\n onClick={() => history.push('/')}\n value={t('common:Cancel')}\n />\n </div>\n )}\n </form>\n )\n}\n\nexport default connect(\n state => ({\n appConfig: state.application.config,\n loading: state.loading,\n }),\n dispatch => ({\n onAddWorkout: e => {\n dispatch(setLoading(true))\n const form = new FormData()\n form.append('file', e.target.form.gpxFile.files[0])\n /* prettier-ignore */\n form.append(\n 'data',\n `{\"sport_id\": ${e.target.form.sport.value\n }, \"notes\": \"${e.target.form.notes.value}\"}`\n )\n dispatch(addWorkout(form))\n },\n onEditWorkout: (e, workout) => {\n dispatch(\n editWorkout({\n id: workout.id,\n notes: e.target.form.notes.value,\n sport_id: +e.target.form.sport.value,\n title: e.target.form.title.value,\n })\n )\n },\n })\n)(FormWithGpx)\n","import React from 'react'\nimport { connect } from 'react-redux'\n\nimport { addWorkoutWithoutGpx, editWorkout } from '../../../actions/workouts'\nimport { history } from '../../../index'\nimport { getDateWithTZ } from '../../../utils'\nimport { formatWorkoutDate, translateSports } from '../../../utils/workouts'\n\nfunction FormWithoutGpx(props) {\n const { onAddOrEdit, sports, t, user, workout } = props\n const translatedSports = translateSports(sports, t, true)\n let workoutDate,\n workoutTime,\n sportId = ''\n if (workout) {\n const workoutDateTime = formatWorkoutDate(\n getDateWithTZ(workout.workout_date, user.timezone),\n 'yyyy-MM-dd'\n )\n workoutDate = workoutDateTime.workout_date\n workoutTime = workoutDateTime.workout_time\n sportId = workout.sport_id\n }\n\n return (\n <form onSubmit={event => event.preventDefault()}>\n <div className=\"form-group\">\n <label>\n {t('workouts:Title')}:\n <input\n name=\"title\"\n defaultValue={workout ? workout.title : ''}\n className=\"form-control input-lg\"\n />\n </label>\n </div>\n <div className=\"form-group\">\n <label>\n {t('common:Sport')}:\n <select\n className=\"form-control input-lg\"\n defaultValue={sportId}\n name=\"sport_id\"\n required\n >\n <option value=\"\" />\n {translatedSports.map(sport => (\n <option key={sport.id} value={sport.id}>\n {sport.label}\n </option>\n ))}\n </select>\n </label>\n </div>\n <div className=\"form-group\">\n <label>\n {t('workouts:Workout Date')}:\n <div className=\"container\">\n <div className=\"row\">\n <input\n name=\"workout_date\"\n defaultValue={workoutDate}\n className=\"form-control col-md\"\n required\n type=\"date\"\n />\n <input\n name=\"workout_time\"\n defaultValue={workoutTime}\n className=\"form-control col-md\"\n required\n type=\"time\"\n />\n </div>\n </div>\n </label>\n </div>\n <div className=\"form-group\">\n <label>\n {t('workouts:Duration')}:\n <input\n name=\"duration\"\n defaultValue={workout ? workout.duration : ''}\n className=\"form-control col-xs-4\"\n pattern=\"^([0-9]*[0-9]):([0-5][0-9]):([0-5][0-9])$\"\n placeholder=\"hh:mm:ss\"\n required\n type=\"text\"\n />\n </label>\n </div>\n <div className=\"form-group\">\n <label>\n {t('workouts:Distance')} (km):\n <input\n name=\"distance\"\n defaultValue={workout ? workout.distance : ''}\n className=\"form-control input-lg\"\n min={0}\n required\n step=\"0.001\"\n type=\"number\"\n />\n </label>\n </div>\n <div className=\"form-group\">\n <label>\n {t('workouts:Notes')}:\n <textarea\n name=\"notes\"\n defaultValue={workout ? workout.notes : ''}\n className=\"form-control input-lg\"\n maxLength=\"500\"\n />\n </label>\n </div>\n <input\n type=\"submit\"\n className=\"btn btn-primary\"\n onClick={event => onAddOrEdit(event, workout)}\n value={t('common:Submit')}\n />\n <input\n type=\"submit\"\n className=\"btn btn-secondary\"\n onClick={() => history.push('/')}\n value={t('common:Cancel')}\n />\n </form>\n )\n}\n\nexport default connect(\n state => ({\n user: state.user,\n }),\n dispatch => ({\n onAddOrEdit: (e, workout) => {\n const d = e.target.form.duration.value.split(':')\n const duration = +d[0] * 60 * 60 + +d[1] * 60 + +d[2]\n\n /* prettier-ignore */\n const workoutDate = `${e.target.form.workout_date.value\n } ${ e.target.form.workout_time.value}`\n\n const data = {\n workout_date: workoutDate,\n distance: +e.target.form.distance.value,\n duration,\n notes: e.target.form.notes.value,\n sport_id: +e.target.form.sport_id.value,\n title: e.target.form.title.value,\n }\n if (workout) {\n data.id = workout.id\n dispatch(editWorkout(data))\n } else {\n dispatch(addWorkoutWithoutGpx(data))\n }\n },\n })\n)(FormWithoutGpx)\n","import React from 'react'\nimport { Helmet } from 'react-helmet'\nimport { withTranslation } from 'react-i18next'\nimport { connect } from 'react-redux'\n\nimport FormWithGpx from './WorkoutForms/FormWithGpx'\nimport FormWithoutGpx from './WorkoutForms/FormWithoutGpx'\nimport Message from '../Common/Message'\n\nclass WorkoutAddEdit extends React.Component {\n constructor(props, context) {\n super(props, context)\n this.state = {\n withGpx: true,\n }\n }\n\n handleRadioChange(changeEvent) {\n this.setState({\n withGpx:\n changeEvent.target.name === 'withGpx'\n ? changeEvent.target.value\n : !changeEvent.target.value,\n })\n }\n\n render() {\n const { loading, message, sports, t, workout } = this.props\n const { withGpx } = this.state\n return (\n <div>\n <Helmet>\n <title>\n FitTrackee -{' '}\n {workout\n ? t('workouts:Edit a workout')\n : t('workouts:Add a workout')}\n </title>\n </Helmet>\n <br />\n <br />\n <Message message={message} t={t} />\n <div className=\"container\">\n <div className=\"row\">\n <div className=\"col-md-2\" />\n <div className=\"col-md-8\">\n <div className=\"card add-workout\">\n <h2 className=\"card-header text-center\">\n {workout\n ? t('workouts:Edit a workout')\n : t('workouts:Add a workout')}\n </h2>\n <div className=\"card-body\">\n {workout ? (\n workout.with_gpx ? (\n <FormWithGpx workout={workout} sports={sports} t={t} />\n ) : (\n <FormWithoutGpx workout={workout} sports={sports} t={t} />\n )\n ) : (\n <div>\n <form>\n <div className=\"form-group row\">\n <div className=\"col\">\n <label className=\"radioLabel\">\n <input\n className=\"add-workout-radio\"\n type=\"radio\"\n name=\"withGpx\"\n disabled={loading}\n checked={withGpx}\n onChange={event =>\n this.handleRadioChange(event)\n }\n />\n {t('workouts:with gpx file')}\n </label>\n </div>\n <div className=\"col\">\n <label className=\"radioLabel\">\n <input\n className=\"add-workout-radio\"\n type=\"radio\"\n name=\"withoutGpx\"\n disabled={loading}\n checked={!withGpx}\n onChange={event =>\n this.handleRadioChange(event)\n }\n />\n {t('workouts:without gpx file')}\n </label>\n </div>\n </div>\n </form>\n {withGpx ? (\n <FormWithGpx sports={sports} t={t} />\n ) : (\n <FormWithoutGpx sports={sports} t={t} />\n )}\n </div>\n )}\n </div>\n </div>\n </div>\n <div className=\"col-md-2\" />\n </div>\n </div>\n </div>\n )\n }\n}\n\nexport default withTranslation()(\n connect(state => ({\n loading: state.loading,\n }))(WorkoutAddEdit)\n)\n","import React from 'react'\nimport { connect } from 'react-redux'\n\nimport WorkoutAddOrEdit from './WorkoutAddOrEdit'\n\nfunction WorkoutAdd(props) {\n const { message, sports } = props\n return (\n <div>\n <WorkoutAddOrEdit workout={null} message={message} sports={sports} />\n </div>\n )\n}\n\nexport default connect(state => ({\n message: state.message,\n sports: state.sports.data,\n user: state.user,\n}))(WorkoutAdd)\n","import React from 'react'\nimport { useTranslation } from 'react-i18next'\n\nexport default function CustomModal(props) {\n const { t } = useTranslation()\n return (\n <div className=\"custom-modal-backdrop\">\n <div className=\"custom-modal\">\n <div className=\"modal-content\">\n <div className=\"modal-header\">\n <h5 className=\"modal-title\">{props.title}</h5>\n <button\n type=\"button\"\n className=\"close\"\n aria-label=\"Close\"\n onClick={() => props.close()}\n >\n <span aria-hidden=\"true\">&times;</span>\n </button>\n </div>\n <div className=\"modal-body\">\n <p>{props.text}</p>\n </div>\n <div className=\"modal-footer\">\n <button\n type=\"button\"\n className=\"btn btn-primary\"\n onClick={() => props.confirm()}\n >\n {t('common:Yes')}\n </button>\n <button\n type=\"button\"\n className=\"btn btn-secondary\"\n onClick={() => props.close()}\n >\n {t('common:No')}\n </button>\n </div>\n </div>\n </div>\n </div>\n )\n}\n","import React from 'react'\nimport { Link } from 'react-router-dom'\n\nimport { getDateWithTZ } from '../../../utils'\nimport { formatWorkoutDate } from '../../../utils/workouts'\n\nexport default function WorkoutCardHeader(props) {\n const {\n dataType,\n displayModal,\n segmentId,\n sport,\n t,\n title,\n user,\n workout,\n } = props\n const workoutDate = workout\n ? formatWorkoutDate(getDateWithTZ(workout.workout_date, user.timezone))\n : null\n\n const previousUrl =\n dataType === 'segment' && segmentId !== 1\n ? `/workouts/${workout.id}/segment/${segmentId - 1}`\n : dataType === 'workout' && workout.previous_workout\n ? `/workouts/${workout.previous_workout}`\n : null\n const nextUrl =\n dataType === 'segment' && segmentId < workout.segments.length\n ? `/workouts/${workout.id}/segment/${segmentId + 1}`\n : dataType === 'workout' && workout.next_workout\n ? `/workouts/${workout.next_workout}`\n : null\n\n return (\n <div className=\"container\">\n <div className=\"row\">\n <div className=\"col-auto\">\n {previousUrl ? (\n <Link className=\"unlink\" to={previousUrl}>\n <i\n className=\"fa fa-chevron-left\"\n aria-hidden=\"true\"\n title={t(`workouts:See previous ${dataType}`)}\n />\n </Link>\n ) : (\n <i\n className=\"fa fa-chevron-left inactive-link\"\n aria-hidden=\"true\"\n title={t(`workouts:No previous ${dataType}`)}\n />\n )}\n </div>\n <div className=\"col-auto col-workout-logo\">\n <img className=\"sport-img-medium\" src={sport.img} alt=\"sport logo\" />\n </div>\n <div className=\"col\">\n {dataType === 'workout' ? (\n <>\n {title}{' '}\n <Link className=\"unlink\" to={`/workouts/${workout.id}/edit`}>\n <i\n className=\"fa fa-edit custom-fa\"\n aria-hidden=\"true\"\n title={t('workouts:Edit workout')}\n />\n </Link>\n <i\n className=\"fa fa-trash custom-fa\"\n aria-hidden=\"true\"\n onClick={() => displayModal(true)}\n title={t('workouts:Delete workout')}\n />\n </>\n ) : (\n <>\n {/* prettier-ignore */}\n <Link\n to={`/workouts/${workout.id}`}\n >\n {title}\n </Link>{' '}\n - {t('workouts:segment')} {segmentId}\n </>\n )}\n <br />\n {workoutDate && (\n <span className=\"workout-date\">\n {`${workoutDate.workout_date} - ${workoutDate.workout_time}`}\n </span>\n )}\n </div>\n <div className=\"col-auto\">\n {nextUrl ? (\n <Link className=\"unlink\" to={nextUrl}>\n <i\n className=\"fa fa-chevron-right\"\n aria-hidden=\"true\"\n title={t(`workouts:See next ${dataType}`)}\n />\n </Link>\n ) : (\n <i\n className=\"fa fa-chevron-right inactive-link\"\n aria-hidden=\"true\"\n title={t(`workouts:No next ${dataType}`)}\n />\n )}\n </div>\n </div>\n </div>\n )\n}\n","import { format } from 'date-fns'\nimport React from 'react'\nimport { connect } from 'react-redux'\nimport {\n Area,\n ComposedChart,\n Line,\n ResponsiveContainer,\n Tooltip,\n XAxis,\n YAxis,\n} from 'recharts'\n\nimport {\n getSegmentChartData,\n getWorkoutChartData,\n} from '../../../actions/workouts'\n\nclass WorkoutCharts extends React.Component {\n constructor(props, context) {\n super(props, context)\n this.state = {\n displayDistance: true,\n dataToHide: [],\n }\n }\n\n componentDidMount() {\n if (this.props.dataType === 'workout') {\n this.props.loadWorkoutData(this.props.workout.id)\n } else {\n this.props.loadSegmentData(this.props.workout.id, this.props.segmentId)\n }\n }\n\n componentDidUpdate(prevProps) {\n if (\n (this.props.dataType === 'workout' &&\n prevProps.workout.id !== this.props.workout.id) ||\n (this.props.dataType === 'workout' && prevProps.dataType === 'segment')\n ) {\n this.props.loadWorkoutData(this.props.workout.id)\n }\n if (\n this.props.dataType === 'segment' &&\n prevProps.segmentId !== this.props.segmentId\n ) {\n this.props.loadSegmentData(this.props.workout.id, this.props.segmentId)\n }\n }\n\n componentWillUnmount() {\n this.props.loadWorkoutData(null)\n }\n\n handleRadioChange(changeEvent) {\n this.setState({\n displayDistance:\n changeEvent.target.name === 'distance'\n ? changeEvent.target.value\n : !changeEvent.target.value,\n })\n }\n\n handleLegendChange(e) {\n const { dataToHide } = this.state\n const name = e.target.name // eslint-disable-line prefer-destructuring\n if (dataToHide.find(d => d === name)) {\n dataToHide.splice(dataToHide.indexOf(name), 1)\n } else {\n dataToHide.push(name)\n }\n this.setState({ dataToHide })\n }\n\n displayData(name) {\n const { dataToHide } = this.state\n return !dataToHide.find(d => d === name)\n }\n\n render() {\n const { chartData, t, updateCoordinates } = this.props\n const { displayDistance } = this.state\n const xInterval = chartData ? parseInt(chartData.length / 10, 10) : 0\n let xDataKey, xScale\n if (displayDistance) {\n xDataKey = 'distance'\n xScale = 'linear'\n } else {\n xDataKey = 'duration'\n xScale = 'time'\n }\n return (\n <div className=\"container\">\n {chartData && chartData.length > 0 ? (\n <div>\n <div className=\"row chart-radio\">\n <label className=\"radioLabel col-md-1\">\n <input\n type=\"radio\"\n name=\"distance\"\n checked={displayDistance}\n onChange={e => this.handleRadioChange(e)}\n />\n {t('workouts:distance')}\n </label>\n <label className=\"radioLabel col-md-1\">\n <input\n type=\"radio\"\n name=\"duration\"\n checked={!displayDistance}\n onChange={e => this.handleRadioChange(e)}\n />\n {t('workouts:duration')}\n </label>\n </div>\n <div className=\"row chart-radio\">\n <div className=\"col-md-5\" />\n <label className=\"radioLabel col-md-1\">\n <input\n type=\"checkbox\"\n name=\"speed\"\n checked={this.displayData('speed')}\n onChange={e => this.handleLegendChange(e)}\n />\n {t('workouts:speed')}\n </label>\n <label className=\"radioLabel col-md-1\">\n <input\n type=\"checkbox\"\n name=\"elevation\"\n checked={this.displayData('elevation')}\n onChange={e => this.handleLegendChange(e)}\n />\n {t('workouts:elevation')}\n </label>\n <div className=\"col-md-5\" />\n </div>\n <div className=\"row chart\">\n <ResponsiveContainer height={300}>\n <ComposedChart\n data={chartData}\n margin={{ top: 15, right: 30, left: 20, bottom: 15 }}\n onMouseMove={e => updateCoordinates(e.activePayload)}\n onMouseLeave={() => updateCoordinates(null)}\n >\n <XAxis\n allowDecimals={false}\n dataKey={xDataKey}\n label={{\n value: t(`workouts:${xDataKey}`),\n offset: 0,\n position: 'bottom',\n }}\n scale={xScale}\n interval={xInterval}\n tickFormatter={value =>\n displayDistance ? value : format(value, 'HH:mm:ss')\n }\n type=\"number\"\n />\n <YAxis\n label={{\n value: `${t('workouts:speed')} (km/h)`,\n angle: -90,\n position: 'left',\n }}\n yAxisId=\"left\"\n />\n <YAxis\n label={{\n value: `${t('workouts:elevation')} (m)`,\n angle: -90,\n position: 'right',\n }}\n yAxisId=\"right\"\n orientation=\"right\"\n />\n {this.displayData('elevation') && (\n <Area\n yAxisId=\"right\"\n type=\"linear\"\n dataKey=\"elevation\"\n name={t('workouts:elevation')}\n fill=\"#e5e5e5\"\n stroke=\"#cccccc\"\n dot={false}\n unit=\" m\"\n />\n )}\n {this.displayData('speed') && (\n <Line\n yAxisId=\"left\"\n type=\"linear\"\n dataKey=\"speed\"\n name={t('workouts:speed')}\n stroke=\"#8884d8\"\n strokeWidth={2}\n dot={false}\n unit=\" km/h\"\n />\n )}\n <Tooltip\n labelFormatter={value =>\n displayDistance\n ? `${t('workouts:distance')}: ${value} km`\n : `${t('workouts:duration')}: ${format(\n value,\n 'HH:mm:ss'\n )}`\n }\n />\n </ComposedChart>\n </ResponsiveContainer>\n </div>\n <div className=\"chart-info\">\n {t('workouts:data from gpx, without any cleaning')}\n </div>\n </div>\n ) : (\n t('workouts:No data to display')\n )}\n </div>\n )\n }\n}\n\nexport default connect(\n state => ({\n chartData: state.chartData,\n }),\n dispatch => ({\n loadWorkoutData: workoutId => {\n dispatch(getWorkoutChartData(workoutId))\n },\n loadSegmentData: (workoutId, segmentId) => {\n dispatch(getSegmentChartData(workoutId, segmentId))\n },\n })\n)(WorkoutCharts)\n","import React from 'react'\n\nexport default function WorkoutWeather(props) {\n const { t, workout } = props\n return (\n <div className=\"container\">\n {workout.weather_start && workout.weather_end && (\n <table className=\"table table-borderless weather-table text-center\">\n <thead>\n <tr>\n <th />\n <th>\n {t('workouts:Start')}\n <br />\n <img\n className=\"weather-img\"\n src={`/img/weather/${workout.weather_start.icon}.png`}\n alt={`workout weather (${workout.weather_start.icon})`}\n title={workout.weather_start.summary}\n />\n </th>\n <th>\n {t('workouts:End')}\n <br />\n <img\n className=\"weather-img\"\n src={`/img/weather/${workout.weather_end.icon}.png`}\n alt={`workout weather (${workout.weather_end.icon})`}\n title={workout.weather_end.summary}\n />\n </th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <td>\n <img\n className=\"weather-img-small\"\n src=\"/img/weather/temperature.png\"\n alt=\"Temperatures\"\n />\n </td>\n <td>{Number(workout.weather_start.temperature).toFixed(1)}°C</td>\n <td>{Number(workout.weather_end.temperature).toFixed(1)}°C</td>\n </tr>\n <tr>\n <td>\n <img\n className=\"weather-img-small\"\n src=\"/img/weather/pour-rain.png\"\n alt=\"Temperatures\"\n />\n </td>\n <td>\n {Number(workout.weather_start.humidity * 100).toFixed(1)}%\n </td>\n <td>{Number(workout.weather_end.humidity * 100).toFixed(1)}%</td>\n </tr>\n <tr>\n <td>\n <img\n className=\"weather-img-small\"\n src=\"/img/weather/breeze.png\"\n alt=\"Temperatures\"\n />\n </td>\n <td>{Number(workout.weather_start.wind).toFixed(1)}m/s</td>\n <td>{Number(workout.weather_end.wind).toFixed(1)}m/s</td>\n </tr>\n </tbody>\n </table>\n )}\n </div>\n )\n}\n","import React from 'react'\n\nimport WorkoutWeather from './WorkoutWeather'\n\nexport default function WorkoutDetails(props) {\n const { t, workout } = props\n const withPauses = workout.pauses !== '0:00:00' && workout.pauses !== null\n return (\n <div className=\"workout-details\">\n <p>\n <i className=\"fa fa-clock-o custom-fa\" aria-hidden=\"true\" />\n {t('workouts:Duration')}: {workout.moving}\n {workout.records &&\n workout.records.find(record => record.record_type === 'LD') && (\n <sup>\n <i className=\"fa fa-trophy custom-fa\" aria-hidden=\"true\" />\n </sup>\n )}\n {withPauses && (\n <span>\n <br />({t('workouts:pauses')}: {workout.pauses},{' '}\n {t('workouts:total duration')}: {workout.duration})\n </span>\n )}\n </p>\n <p>\n <i className=\"fa fa-road custom-fa\" aria-hidden=\"true\" />\n {t('workouts:Distance')}: {workout.distance} km\n {workout.records &&\n workout.records.find(record => record.record_type === 'FD') && (\n <sup>\n <i className=\"fa fa-trophy custom-fa\" aria-hidden=\"true\" />\n </sup>\n )}\n </p>\n <p>\n <i className=\"fa fa-tachometer custom-fa\" aria-hidden=\"true\" />\n {t('workouts:Average speed')}: {workout.ave_speed} km/h\n {workout.records &&\n workout.records.find(record => record.record_type === 'AS') && (\n <sup>\n <i className=\"fa fa-trophy custom-fa\" aria-hidden=\"true\" />\n </sup>\n )}\n <br />\n {t('workouts:Max. speed')}: {workout.max_speed} km/h\n {workout.records &&\n workout.records.find(record => record.record_type === 'MS') && (\n <sup>\n <i className=\"fa fa-trophy custom-fa\" aria-hidden=\"true\" />\n </sup>\n )}\n </p>\n {workout.min_alt && workout.max_alt && (\n <p>\n <i className=\"fi-mountains custom-fa\" />\n {t('workouts:Min. altitude')}: {workout.min_alt}m\n <br />\n {t('workouts:Max. altitude')}: {workout.max_alt}m\n </p>\n )}\n {workout.ascent && workout.descent && (\n <p>\n <i className=\"fa fa-location-arrow custom-fa\" />\n {t('workouts:Ascent')}: {workout.ascent}m\n <br />\n {t('workouts:Descent')}: {workout.descent}m\n </p>\n )}\n <WorkoutWeather workout={workout} t={t} />\n </div>\n )\n}\n","import React from 'react'\nimport { GeoJSON, Marker, TileLayer, useMap } from 'react-leaflet'\nimport hash from 'object-hash'\n\nimport { apiUrl } from '../../../utils'\n\nexport default function Map({ bounds, coordinates, jsonData, mapAttribution }) {\n const map = useMap()\n map.fitBounds(bounds)\n return (\n <>\n <TileLayer\n // eslint-disable-next-line max-len\n attribution={mapAttribution}\n url={`${apiUrl}workouts/map_tile/{s}/{z}/{x}/{y}.png`}\n />\n <GeoJSON\n // hash as a key to force re-rendering\n key={hash(jsonData)}\n data={jsonData}\n />\n {coordinates.latitude && (\n <Marker position={[coordinates.latitude, coordinates.longitude]} />\n )}\n </>\n )\n}\n","import React from 'react'\nimport { MapContainer } from 'react-leaflet'\nimport { connect } from 'react-redux'\n\nimport Map from './Map'\nimport { getSegmentGpx, getWorkoutGpx } from '../../../actions/workouts'\nimport { getGeoJson } from '../../../utils/workouts'\n\nclass WorkoutMap extends React.Component {\n constructor(props, context) {\n super(props, context)\n this.state = {\n zoom: 13,\n }\n }\n\n componentDidMount() {\n if (this.props.dataType === 'workout') {\n this.props.loadWorkoutGpx(this.props.workout.id)\n } else {\n this.props.loadSegmentGpx(this.props.workout.id, this.props.segmentId)\n }\n }\n\n componentDidUpdate(prevProps) {\n if (\n (this.props.dataType === 'workout' &&\n prevProps.workout.id !== this.props.workout.id) ||\n (this.props.dataType === 'workout' && prevProps.dataType === 'segment')\n ) {\n this.props.loadWorkoutGpx(this.props.workout.id)\n }\n if (\n this.props.dataType === 'segment' &&\n prevProps.segmentId !== this.props.segmentId\n ) {\n this.props.loadSegmentGpx(this.props.workout.id, this.props.segmentId)\n }\n }\n\n componentWillUnmount() {\n this.props.loadWorkoutGpx(null)\n }\n\n render() {\n const { coordinates, gpxContent, mapAttribution, workout } = this.props\n const { jsonData } = getGeoJson(gpxContent)\n const bounds = [\n [workout.bounds[0], workout.bounds[1]],\n [workout.bounds[2], workout.bounds[3]],\n ]\n\n return (\n <div>\n {jsonData && (\n <MapContainer\n zoom={this.state.zoom}\n bounds={bounds}\n boundsOptions={{ padding: [10, 10] }}\n >\n <Map\n bounds={bounds}\n coordinates={coordinates}\n jsonData={jsonData}\n mapAttribution={mapAttribution}\n />\n </MapContainer>\n )}\n </div>\n )\n }\n}\n\nexport default connect(\n state => ({\n gpxContent: state.gpx,\n mapAttribution: state.application.config.map_attribution,\n }),\n dispatch => ({\n loadWorkoutGpx: workoutId => {\n dispatch(getWorkoutGpx(workoutId))\n },\n loadSegmentGpx: (workoutId, segmentId) => {\n dispatch(getSegmentGpx(workoutId, segmentId))\n },\n })\n)(WorkoutMap)\n","import React from 'react'\n\nexport default function WorkoutNoMap(props) {\n const { t } = props\n return (\n <div className=\"workout-no-map text-center\">{t('workouts:No Map')}</div>\n )\n}\n","import React from 'react'\n\nexport default function WorkoutNotes(props) {\n const { notes, t } = props\n return (\n <div className=\"row\">\n <div className=\"col\">\n <div className=\"card workout-card\">\n <div className=\"card-body\">\n Notes\n <div className=\"workout-notes\">\n {notes ? notes : t('workouts:No notes')}\n </div>\n </div>\n </div>\n </div>\n </div>\n )\n}\n","import React from 'react'\nimport { Link } from 'react-router-dom'\n\nexport default function WorkoutSegments(props) {\n const { segments, t } = props\n return (\n <div className=\"row\">\n <div className=\"col\">\n <div className=\"card workout-card\">\n <div className=\"card-body\">\n {t('workouts:Segments')}\n <div className=\"workout-segments\">\n <ul>\n {segments.map((segment, index) => (\n <li\n className=\"workout-segments-list\"\n // eslint-disable-next-line react/no-array-index-key\n key={`segment-${index}`}\n >\n <Link\n to={`/workouts/${segment.workout_id}/segment/${\n index + 1\n }`}\n >\n {t('workouts:segment')} {index + 1}\n </Link>{' '}\n ({t('workouts:distance')}: {segment.distance} km,{' '}\n {t('workouts:duration')}: {segment.duration})\n </li>\n ))}\n </ul>\n </div>\n </div>\n </div>\n </div>\n </div>\n )\n}\n","import React from 'react'\nimport { Helmet } from 'react-helmet'\nimport { withTranslation } from 'react-i18next'\nimport { connect } from 'react-redux'\n\nimport CustomModal from '../../Common/CustomModal'\nimport Message from '../../Common/Message'\nimport WorkoutCardHeader from './WorkoutCardHeader'\nimport WorkoutCharts from './WorkoutCharts'\nimport WorkoutDetails from './WorkoutDetails'\nimport WorkoutMap from './WorkoutMap'\nimport WorkoutNoMap from './WorkoutNoMap'\nimport WorkoutNotes from './WorkoutNotes'\nimport WorkoutSegments from './WorkoutSegments'\nimport { getOrUpdateData } from '../../../actions'\nimport { deleteWorkout } from '../../../actions/workouts'\n\nclass WorkoutDisplay extends React.Component {\n constructor(props, context) {\n super(props, context)\n this.state = {\n displayModal: false,\n coordinates: {\n latitude: null,\n longitude: null,\n },\n }\n }\n\n componentDidMount() {\n this.props.loadWorkout(this.props.match.params.workoutId)\n }\n\n componentDidUpdate(prevProps) {\n if (\n prevProps.match.params.workoutId !== this.props.match.params.workoutId\n ) {\n this.props.loadWorkout(this.props.match.params.workoutId)\n }\n }\n\n displayModal(value) {\n this.setState(prevState => ({\n ...prevState,\n displayModal: value,\n }))\n }\n\n updateCoordinates(activePayload) {\n const coordinates =\n activePayload && activePayload.length > 0\n ? {\n latitude: activePayload[0].payload.latitude,\n longitude: activePayload[0].payload.longitude,\n }\n : {\n latitude: null,\n longitude: null,\n }\n this.setState(prevState => ({\n ...prevState,\n coordinates,\n }))\n }\n\n render() {\n const { message, onDeleteWorkout, sports, t, user, workouts } = this.props\n const { coordinates, displayModal } = this.state\n const [workout] = workouts\n const title = workout ? workout.title : t('workouts:Workout')\n const [sport] = workout ? sports.filter(s => s.id === workout.sport_id) : []\n const segmentId = parseInt(this.props.match.params.segmentId)\n const dataType = segmentId >= 0 ? 'segment' : 'workout'\n return (\n <div className=\"workout-page\">\n <Helmet>\n <title>FitTrackee - {title}</title>\n </Helmet>\n {message ? (\n <Message message={message} t={t} />\n ) : (\n <div className=\"container\">\n {displayModal && (\n <CustomModal\n title={t('common:Confirmation')}\n text={t(\n 'workouts:Are you sure you want to delete this workout?'\n )}\n confirm={() => {\n onDeleteWorkout(workout.id)\n this.displayModal(false)\n }}\n close={() => this.displayModal(false)}\n />\n )}\n {workout && sport && workouts.length === 1 && (\n <div>\n <div className=\"row\">\n <div className=\"col\">\n <div className=\"card workout-card\">\n <div className=\"card-header\">\n <WorkoutCardHeader\n workout={workout}\n dataType={dataType}\n segmentId={segmentId}\n sport={sport}\n t={t}\n title={title}\n user={user}\n displayModal={() => this.displayModal(true)}\n />\n </div>\n <div className=\"card-body\">\n <div className=\"row\">\n <div className=\"col-md-8\">\n {workout.with_gpx ? (\n <WorkoutMap\n workout={workout}\n coordinates={coordinates}\n dataType={dataType}\n segmentId={segmentId}\n />\n ) : (\n <WorkoutNoMap t={t} />\n )}\n </div>\n <div className=\"col\">\n <WorkoutDetails\n workout={\n dataType === 'workout'\n ? workout\n : workout.segments[segmentId - 1]\n }\n t={t}\n />\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n {workout.with_gpx && (\n <div className=\"row\">\n <div className=\"col\">\n <div className=\"card workout-card\">\n <div className=\"card-body\">\n <div className=\"row\">\n <div className=\"col\">\n <div className=\"chart-title\">\n {t('workouts:Chart')}\n </div>\n <WorkoutCharts\n workout={workout}\n dataType={dataType}\n segmentId={segmentId}\n t={t}\n updateCoordinates={e =>\n this.updateCoordinates(e)\n }\n />\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n )}\n {dataType === 'workout' && (\n <>\n <WorkoutNotes notes={workout.notes} t={t} />\n {workout.segments.length > 1 && (\n <WorkoutSegments segments={workout.segments} t={t} />\n )}\n </>\n )}\n </div>\n )}\n </div>\n )}\n </div>\n )\n }\n}\n\nexport default withTranslation()(\n connect(\n state => ({\n workouts: state.workouts.data,\n message: state.message,\n sports: state.sports.data,\n user: state.user,\n }),\n dispatch => ({\n loadWorkout: workoutId => {\n dispatch(getOrUpdateData('getData', 'workouts', { id: workoutId }))\n },\n onDeleteWorkout: workoutId => {\n dispatch(deleteWorkout(workoutId))\n },\n })\n )(WorkoutDisplay)\n)\n","import React from 'react'\nimport { connect } from 'react-redux'\n\nimport WorkoutAddOrEdit from './WorkoutAddOrEdit'\nimport { getOrUpdateData } from '../../actions'\n\nclass WorkoutEdit extends React.Component {\n componentDidMount() {\n this.props.loadWorkout(this.props.match.params.workoutId)\n }\n\n render() {\n const { message, sports, workouts } = this.props\n const [workout] = workouts\n return (\n <div>\n {sports.length > 0 && (\n <WorkoutAddOrEdit\n workout={workout}\n message={message}\n sports={sports}\n />\n )}\n </div>\n )\n }\n}\n\nexport default connect(\n state => ({\n workouts: state.workouts.data,\n message: state.message,\n sports: state.sports.data,\n user: state.user,\n }),\n dispatch => ({\n loadWorkout: workoutId => {\n dispatch(getOrUpdateData('getData', 'workouts', { id: workoutId }))\n },\n })\n)(WorkoutEdit)\n","import React from 'react'\nimport { connect } from 'react-redux'\nimport { Redirect, Route, Switch } from 'react-router-dom'\n\nimport NotFound from './../Others/NotFound'\nimport WorkoutAdd from './WorkoutAdd'\nimport WorkoutDisplay from './WorkoutDisplay'\nimport WorkoutEdit from './WorkoutEdit'\nimport { isLoggedIn } from '../../utils'\n\nfunction Workout() {\n return (\n <div>\n {isLoggedIn() ? (\n <Switch>\n <Route exact path=\"/workouts/add\" component={WorkoutAdd} />\n <Route exact path=\"/workouts/:workoutId\" component={WorkoutDisplay} />\n <Route\n exact\n path=\"/workouts/:workoutId/edit\"\n component={WorkoutEdit}\n />\n <Route\n path=\"/workouts/:workoutId/segment/:segmentId\"\n component={WorkoutDisplay}\n />\n <Route component={NotFound} />\n </Switch>\n ) : (\n <Redirect to=\"/login\" />\n )}\n </div>\n )\n}\n\nexport default connect(state => ({\n user: state.user,\n}))(Workout)\n","import React from 'react'\nimport { Link } from 'react-router-dom'\n\nexport default class NoWorkouts extends React.PureComponent {\n render() {\n const { t } = this.props\n return (\n <div className=\"card text-center\">\n <div className=\"card-body\">\n {t('common:No workouts.')}{' '}\n <Link to={{ pathname: '/workouts/add' }}>\n {t('dashboard:Upload one !')}\n </Link>\n </div>\n </div>\n )\n }\n}\n","import React from 'react'\n\nimport { translateSports } from '../../utils/workouts'\n\nexport default class WorkoutsFilter extends React.PureComponent {\n render() {\n const { loadWorkouts, sports, t, updateParams } = this.props\n const translatedSports = translateSports(sports, t)\n return (\n <div className=\"card\">\n <div className=\"card-body workout-filter\">\n <form onSubmit={event => event.preventDefault()}>\n <div className=\"form-group\">\n <label>\n {t('workouts:From')}:\n <input\n className=\"form-control col-md\"\n name=\"from\"\n onChange={e => updateParams(e)}\n type=\"date\"\n />\n </label>\n <label>\n {t('workouts:To')}:\n <input\n className=\"form-control col-md\"\n name=\"to\"\n onChange={e => updateParams(e)}\n type=\"date\"\n />\n </label>\n </div>\n <div className=\"form-group\">\n <label>\n {t('common:Sport')}:\n <select\n className=\"form-control input-lg\"\n name=\"sport_id\"\n onChange={e => updateParams(e)}\n >\n <option value=\"\" />\n {translatedSports.map(sport => (\n <option key={sport.id} value={sport.id}>\n {sport.label}\n </option>\n ))}\n </select>\n </label>\n </div>\n <div className=\"form-group\">\n <label>\n {t('workouts:Distance')} (km):\n <div className=\"container\">\n <div className=\"row\">\n <div className=\"col-5\">\n <input\n className=\"form-control\"\n min={0}\n name=\"distance_from\"\n onChange={e => updateParams(e)}\n step=\"1\"\n type=\"number\"\n />\n </div>\n <div className=\"col-2 align-middle text-center\">\n {t('common:to')}\n </div>\n <div className=\"col-5\">\n <input\n className=\"form-control\"\n min={0}\n name=\"distance_to\"\n onChange={e => updateParams(e)}\n step=\"1\"\n type=\"number\"\n />\n </div>\n </div>\n </div>\n </label>\n </div>\n <div className=\"form-group\">\n <label>\n {t('workouts:Duration')}:\n <div className=\"container\">\n <div className=\"row\">\n <div className=\"col-5\">\n <input\n className=\"form-control\"\n name=\"duration_from\"\n onChange={e => updateParams(e)}\n pattern=\"^([0-9]*[0-9]):([0-5][0-9])$\"\n placeholder=\"hh:mm\"\n type=\"text\"\n />\n </div>\n <div className=\"col-2 align-middle text-center\">\n {t('common:to')}\n </div>\n <div className=\"col-5\">\n <input\n className=\"form-control\"\n name=\"duration_to\"\n onChange={e => updateParams(e)}\n pattern=\"^([0-9]*[0-9]):([0-5][0-9])$\"\n placeholder=\"hh:mm\"\n type=\"text\"\n />\n </div>\n </div>\n </div>\n </label>\n </div>\n <div className=\"form-group\">\n <label>\n {t('workouts:Average speed')} (km/h):\n <div className=\"container\">\n <div className=\"row\">\n <div className=\"col-5\">\n <input\n className=\"form-control\"\n min={0}\n name=\"ave_speed_from\"\n onChange={e => updateParams(e)}\n step=\"1\"\n type=\"number\"\n />\n </div>\n <div className=\"col-2 align-middle text-center\">\n {t('common:to')}\n </div>\n <div className=\"col-5\">\n <input\n className=\"form-control\"\n min={0}\n name=\"ave_speed_to\"\n onChange={e => updateParams(e)}\n step=\"1\"\n type=\"number\"\n />\n </div>\n </div>\n </div>\n </label>\n </div>\n <div className=\"form-group\">\n <label>\n {t('workouts:Max. speed')} (km/h):\n <div className=\"container\">\n <div className=\"row\">\n <div className=\"col-5\">\n <input\n className=\"form-control\"\n min={0}\n name=\"max_speed_from\"\n onChange={e => updateParams(e)}\n step=\"1\"\n type=\"number\"\n />\n </div>\n <div className=\"col-2 align-middle text-center\">\n {t('common:to')}\n </div>\n <div className=\"col-5\">\n <input\n className=\"form-control\"\n min={0}\n name=\"max_speed_to\"\n onChange={e => updateParams(e)}\n step=\"1\"\n type=\"number\"\n />\n </div>\n </div>\n </div>\n </label>\n </div>\n <input\n className=\"btn btn-primary btn-lg btn-block\"\n onClick={() => loadWorkouts()}\n type=\"submit\"\n value={t('workouts:Filter')}\n />\n </form>\n </div>\n </div>\n )\n }\n}\n","import React from 'react'\n\nimport { apiUrl } from '../../utils'\n\nexport default class StaticMap extends React.PureComponent {\n render() {\n const { display, workout } = this.props\n\n return (\n <div className={`workout-map${display === 'list' ? '-list' : ''}`}>\n <img\n src={`${apiUrl}workouts/map/${workout.map}?${Date.now()}`}\n alt=\"workout map\"\n />\n <div className={`map-attribution${display === 'list' ? '-list' : ''}`}>\n <span className=\"map-attribution-text\">©</span>\n <a\n className=\"map-attribution-text\"\n href=\"http://www.openstreetmap.org/copyright\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n OpenStreetMap\n </a>\n </div>\n </div>\n )\n }\n}\n","import { format } from 'date-fns'\nimport React from 'react'\nimport { Link } from 'react-router-dom'\n\nimport StaticMap from '../Common/StaticMap'\nimport { getDateWithTZ } from '../../utils'\n\nexport default class WorkoutsList extends React.PureComponent {\n render() {\n const { loading, sports, t, user, workouts } = this.props\n return (\n <div className=\"card workout-card\">\n <div className=\"card-body\">\n <table className=\"table\">\n <thead>\n <tr>\n <th scope=\"col\" />\n <th scope=\"col\">{t('common:Workout')}</th>\n <th scope=\"col\">{t('workouts:Date')}</th>\n <th scope=\"col\">{t('workouts:Distance')}</th>\n <th scope=\"col\">{t('workouts:Duration')}</th>\n <th scope=\"col\">{t('workouts:Ave. speed')}</th>\n <th scope=\"col\">{t('workouts:Max. speed')}</th>\n </tr>\n </thead>\n <tbody>\n {!loading &&\n sports &&\n workouts.map((workout, idx) => (\n // eslint-disable-next-line react/no-array-index-key\n <tr key={idx}>\n <td>\n <span className=\"heading-span-absolute\">\n {t('common:Sport')}\n </span>\n <img\n className=\"workout-sport\"\n src={sports\n .filter(s => s.id === workout.sport_id)\n .map(s => s.img)}\n alt=\"workout sport logo\"\n />\n </td>\n <td className=\"workout-title\">\n <span className=\"heading-span-absolute\">\n {t('common:Workout')}\n </span>\n <Link to={`/workouts/${workout.id}`}>\n {workout.title}\n </Link>\n {workout.map && (\n <StaticMap workout={workout} display=\"list\" />\n )}\n </td>\n <td>\n <span className=\"heading-span-absolute\">\n {t('workouts:Date')}\n </span>\n {format(\n getDateWithTZ(workout.workout_date, user.timezone),\n 'dd/MM/yyyy HH:mm'\n )}\n </td>\n <td className=\"text-right\">\n <span className=\"heading-span-absolute\">\n {t('workouts:Distance')}\n </span>\n {Number(workout.distance).toFixed(2)} km\n </td>\n <td className=\"text-right\">\n <span className=\"heading-span-absolute\">\n {t('workouts:Duration')}\n </span>\n {workout.moving}\n </td>\n <td className=\"text-right\">\n <span className=\"heading-span-absolute\">\n {t('workouts:Ave. speed')}\n </span>\n {workout.ave_speed} km/h\n </td>\n <td className=\"text-right\">\n <span className=\"heading-span-absolute\">\n {t('workouts:Max. speed')}\n </span>\n {workout.max_speed} km/h\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n {loading && <div className=\"loader\" />}\n </div>\n </div>\n )\n }\n}\n","import React from 'react'\nimport { Helmet } from 'react-helmet'\nimport { withTranslation } from 'react-i18next'\nimport { connect } from 'react-redux'\n\nimport Message from '../Common/Message'\nimport NoWorkouts from '../Common/NoWorkouts'\nimport WorkoutsFilter from './WorkoutsFilter'\nimport WorkoutsList from './WorkoutsList'\nimport { getOrUpdateData } from '../../actions'\nimport { getMoreWorkouts } from '../../actions/workouts'\n\nclass Workouts extends React.Component {\n constructor(props, context) {\n super(props, context)\n this.state = {\n params: {\n page: 1,\n per_page: 10,\n },\n }\n }\n\n componentDidMount() {\n this.props.loadWorkouts(this.state.params)\n }\n\n setParams(e) {\n const { params } = this.state\n if (e.target.value === '') {\n delete params[e.target.name]\n } else {\n params[e.target.name] = e.target.value\n }\n params.page = 1\n this.setState(params)\n }\n render() {\n const {\n loading,\n loadWorkouts,\n loadMoreWorkouts,\n message,\n sports,\n t,\n user,\n workouts,\n } = this.props\n const { params } = this.state\n const paginationEnd =\n workouts.length > 0\n ? workouts[workouts.length - 1].previous_workout === null\n : true\n return (\n <div>\n <Helmet>\n <title>FitTrackee - {t('common:Workouts')}</title>\n </Helmet>\n {message ? (\n <Message message={message} t={t} />\n ) : (\n <div className=\"container history\">\n <div className=\"row\">\n <div className=\"col-md-3\">\n <WorkoutsFilter\n sports={sports}\n loadWorkouts={() => loadWorkouts(params)}\n t={t}\n updateParams={e => this.setParams(e)}\n />\n </div>\n <div className=\"col-md-9 workouts-result\">\n <WorkoutsList\n workouts={workouts}\n loading={loading}\n sports={sports}\n t={t}\n user={user}\n />\n {!paginationEnd && (\n <input\n type=\"submit\"\n className=\"btn btn-default btn-md btn-block\"\n value=\"Load more workouts\"\n onClick={() => {\n params.page += 1\n loadMoreWorkouts(params)\n this.setState(params)\n }}\n />\n )}\n {workouts.length === 0 && <NoWorkouts t={t} />}\n </div>\n </div>\n </div>\n )}\n </div>\n )\n }\n}\n\nexport default withTranslation()(\n connect(\n state => ({\n workouts: state.workouts.data,\n loading: state.loading,\n message: state.message,\n sports: state.sports.data,\n user: state.user,\n }),\n dispatch => ({\n loadWorkouts: params => {\n dispatch(getOrUpdateData('getData', 'workouts', params))\n },\n loadMoreWorkouts: params => {\n dispatch(getMoreWorkouts(params))\n },\n })\n )(Workouts)\n)\n","import { format } from 'date-fns'\nimport React from 'react'\nimport { Helmet } from 'react-helmet'\nimport { withTranslation } from 'react-i18next'\nimport { connect } from 'react-redux'\n\nimport Message from '../Common/Message'\nimport { deletePicture, uploadPicture } from '../../actions/user'\nimport { apiUrl, getFileSize } from '../../utils'\nimport { history } from '../../index'\n\nfunction ProfileDetail({\n appConfig,\n displayModal,\n editable,\n isDeletable,\n message,\n onDeletePicture,\n onUploadPicture,\n pathname,\n t,\n user,\n}) {\n const createdAt = user.created_at\n ? format(new Date(user.created_at), 'dd/MM/yyyy HH:mm')\n : ''\n const birthDate = user.birth_date\n ? format(new Date(user.birth_date), 'dd/MM/yyyy')\n : ''\n const fileSizeLimit = getFileSize(appConfig.max_single_file_size)\n return (\n <div>\n <Helmet>\n <title>FitTrackee - {t('user:Profile')}</title>\n </Helmet>\n <Message message={message} t={t} />\n <div className=\"container\">\n <h1 className=\"page-title\">{t('user:Profile')}</h1>\n <div className=\"row\">\n <div className=\"col-md-12\">\n <div className=\"card\">\n <div className=\"card-header userName\">\n <strong>{user.username}</strong>\n </div>\n <div className=\"card-body\">\n <div className=\"row\">\n <div className=\"col-md-8\">\n <p>\n {/* eslint-disable-next-line max-len */}\n <span className=\"user-label\">\n {t('user:Email')}\n </span>: {user.email}\n </p>\n <p>\n <span className=\"user-label\">\n {t('user:Registration Date')}\n </span>\n : {createdAt}\n </p>\n <p>\n <span className=\"user-label\">{t('user:First Name')}</span>\n : {user.first_name}\n </p>\n <p>\n {/* eslint-disable-next-line max-len */}\n <span className=\"user-label\">\n {t('user:Last Name')}\n </span>: {user.last_name}\n </p>\n <p>\n <span className=\"user-label\">{t('user:Birth Date')}</span>\n : {birthDate}\n </p>\n <p>\n {/* eslint-disable-next-line max-len */}\n <span className=\"user-label\">\n {t('user:Location')}\n </span>: {user.location}\n </p>\n <p>\n <span className=\"user-label\">{t('user:Bio')}</span>:{' '}\n {user.bio}\n </p>\n <p>\n {/* eslint-disable-next-line max-len */}\n <span className=\"user-label\">\n {t('user:Language')}\n </span>: {user.language}\n </p>\n <p>\n {/* eslint-disable-next-line max-len */}\n <span className=\"user-label\">\n {t('user:Timezone')}\n </span>: {user.timezone}\n </p>\n <p>\n <span className=\"user-label\">\n {t('user:First day of week')}\n </span>\n : {user.weekm ? t('user:Monday') : t('user:Sunday')}\n </p>\n </div>\n <div className=\"col-md-4\">\n {user.picture === true && (\n <div>\n <img\n alt=\"Profile\"\n src={\n `${apiUrl}users/${user.username}/picture` +\n `?${Date.now()}`\n }\n className=\"img-fluid App-profile-img-small\"\n />\n {editable && (\n <>\n <br />\n <button\n type=\"submit\"\n onClick={() => onDeletePicture()}\n >\n {t('user:Delete picture')}\n </button>\n <br />\n <br />\n </>\n )}\n </div>\n )}\n {editable && (\n <form\n encType=\"multipart/form-data\"\n onSubmit={event => onUploadPicture(event)}\n >\n <input\n type=\"file\"\n name=\"picture\"\n accept=\".png,.jpg,.gif\"\n />\n <br />\n <button type=\"submit\">{t('user:Send')}</button>\n {` (max. size: ${fileSizeLimit})`}\n </form>\n )}{' '}\n </div>\n </div>\n {editable && (\n <button\n className=\"btn btn-primary\"\n onClick={() => history.push('/profile/edit')}\n >\n {t('common:Edit')}\n </button>\n )}\n {isDeletable && (\n <button\n className=\"btn btn-danger\"\n onClick={() => displayModal(true)}\n >\n {t('user:Delete user account')}\n </button>\n )}\n <button\n className=\"btn btn-secondary\"\n onClick={() =>\n pathname === '/profile' ? history.push('/') : history.go(-1)\n }\n >\n {t(\n pathname === '/profile'\n ? 'common:Back to home'\n : 'common:Back'\n )}\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n )\n}\n\nexport default withTranslation()(\n connect(\n state => ({\n appConfig: state.application.config,\n pathname: state.router.location.pathname,\n message: state.message,\n }),\n dispatch => ({\n onDeletePicture: () => {\n dispatch(deletePicture())\n },\n onUploadPicture: event => {\n dispatch(uploadPicture(event))\n },\n })\n )(ProfileDetail)\n)\n","import React from 'react'\nimport { withTranslation } from 'react-i18next'\nimport { connect } from 'react-redux'\n\nimport ProfileDetail from './ProfileDetail'\n\nfunction CurrentUserProfile({ t, user }) {\n return (\n <div>\n <ProfileDetail editable t={t} user={user} />\n </div>\n )\n}\n\nexport default withTranslation()(\n connect(state => ({\n user: state.user,\n }))(CurrentUserProfile)\n)\n","import React from 'react'\nimport { Link } from 'react-router-dom'\n\nimport { recordsLabels } from '../../utils/workouts'\n\nexport default function CalendarWorkout(props) {\n const { isDisabled, isMore, sportImg, workout } = props\n return (\n <Link\n className={`calendar-workout${isMore}`}\n to={`/workouts/${workout.id}`}\n >\n <>\n <img\n alt=\"workout sport logo\"\n className={`workout-sport ${isDisabled}`}\n src={sportImg}\n title={workout.title}\n />\n {workout.records.length > 0 && (\n <sup>\n <i\n className=\"fa fa-trophy custom-fa-small\"\n aria-hidden=\"true\"\n title={workout.records.map(\n rec =>\n ` ${\n recordsLabels.filter(\n r => r.record_type === rec.record_type\n )[0].label\n }`\n )}\n />\n </sup>\n )}\n </>\n </Link>\n )\n}\n","import React from 'react'\n\nimport CalendarWorkout from './CalendarWorkout'\n\nexport default class CalendarWorkouts extends React.Component {\n constructor(props, context) {\n super(props, context)\n this.state = {\n isHidden: true,\n }\n }\n\n handleDisplayMore() {\n this.setState({\n isHidden: !this.state.isHidden,\n })\n }\n\n render() {\n const { dayWorkouts, isDisabled, sports } = this.props\n const { isHidden } = this.state\n return (\n <div>\n {dayWorkouts.map(act => (\n <CalendarWorkout\n key={act.id}\n workout={act}\n isDisabled={isDisabled}\n isMore=\"\"\n sportImg={sports.filter(s => s.id === act.sport_id).map(s => s.img)}\n />\n ))}\n {dayWorkouts.length > 2 && (\n <i\n className={`fa fa-${isHidden ? 'plus' : 'times'} calendar-more`}\n aria-hidden=\"true\"\n onClick={() => this.handleDisplayMore()}\n title=\"show more workouts\"\n />\n )}\n {!isHidden && (\n <div className=\"calendar-display-more\">\n {dayWorkouts.map(act => (\n <CalendarWorkout\n key={act.id}\n workout={act}\n isDisabled={isDisabled}\n isMore=\"-more\"\n sportImg={sports\n .filter(s => s.id === act.sport_id)\n .map(s => s.img)}\n />\n ))}\n </div>\n )}\n </div>\n )\n }\n}\n","// eslint-disable-next-line max-len\n// source: https://blog.flowandform.agency/create-a-custom-calendar-in-react-3df1bfd0b728\nimport {\n addDays,\n addMonths,\n endOfMonth,\n endOfWeek,\n format,\n isSameDay,\n isSameMonth,\n isToday,\n startOfMonth,\n startOfWeek,\n subMonths,\n} from 'date-fns'\nimport { enGB, fr } from 'date-fns/locale'\nimport React from 'react'\nimport { connect } from 'react-redux'\n\nimport CalendarWorkouts from './CalendarWorkouts'\nimport { getMonthWorkouts } from '../../actions/workouts'\nimport { getDateWithTZ } from '../../utils'\n\nconst getStartAndEndMonth = (date, weekStartOnMonday) => {\n const monthStart = startOfMonth(date)\n const monthEnd = endOfMonth(date)\n const weekStartsOn = weekStartOnMonday ? 1 : 0\n return {\n start: startOfWeek(monthStart, { weekStartsOn }),\n end: endOfWeek(monthEnd),\n }\n}\n\nclass Calendar extends React.Component {\n constructor(props, context) {\n super(props, context)\n const calendarDate = new Date()\n this.state = {\n currentMonth: calendarDate,\n startDate: getStartAndEndMonth(calendarDate, props.weekm).start,\n endDate: getStartAndEndMonth(calendarDate, props.weekm).end,\n weekStartOnMonday: props.weekm,\n }\n }\n\n componentDidMount() {\n this.props.loadMonthWorkouts(this.state.startDate, this.state.endDate)\n }\n\n renderHeader(localeOptions) {\n const dateFormat = 'MMM yyyy'\n return (\n <div className=\"header row flex-middle\">\n <div className=\"col col-start\" onClick={() => this.handlePrevMonth()}>\n <i className=\"fa fa-chevron-left\" aria-hidden=\"true\" />\n </div>\n <div className=\"col col-center\">\n <span>\n {format(this.state.currentMonth, dateFormat, localeOptions)}\n </span>\n </div>\n <div className=\"col col-end\" onClick={() => this.handleNextMonth()}>\n <i className=\"fa fa-chevron-right\" aria-hidden=\"true\" />\n </div>\n </div>\n )\n }\n\n renderDays(localeOptions) {\n const dateFormat = 'EEE'\n const days = []\n const { startDate } = this.state\n\n for (let i = 0; i < 7; i++) {\n days.push(\n <div className=\"col col-center\" key={i}>\n {format(addDays(startDate, i), dateFormat, localeOptions)}\n </div>\n )\n }\n return <div className=\"days row\">{days}</div>\n }\n\n filterWorkouts(day) {\n const { workouts, user } = this.props\n if (workouts) {\n return workouts.filter(act =>\n isSameDay(getDateWithTZ(act.workout_date, user.timezone), day)\n )\n }\n return []\n }\n\n renderCells() {\n const { currentMonth, startDate, endDate, weekStartOnMonday } = this.state\n const { sports } = this.props\n\n const dateFormat = 'd'\n const rows = []\n\n let days = []\n let day = startDate\n let formattedDate = ''\n\n while (day <= endDate) {\n for (let i = 0; i < 7; i++) {\n formattedDate = format(day, dateFormat)\n const dayWorkouts = this.filterWorkouts(day)\n const isDisabled = isSameMonth(day, currentMonth) ? '' : '-disabled'\n const isWeekEnd = weekStartOnMonday\n ? [5, 6].includes(i)\n : [0, 6].includes(i)\n days.push(\n <div\n className={`col cell ${isWeekEnd ? ' weekend' : ''}${\n isToday(day) ? ' today' : ''\n }`}\n key={day}\n >\n <div className={`img${isDisabled}`}>\n <span className=\"number\">{formattedDate}</span>\n <CalendarWorkouts\n dayWorkouts={dayWorkouts}\n isDisabled={isDisabled}\n sports={sports}\n />\n </div>\n </div>\n )\n day = addDays(day, 1)\n }\n rows.push(\n <div className=\"row\" key={day}>\n {days}\n </div>\n )\n days = []\n }\n return <div className=\"body\">{rows}</div>\n }\n\n updateStateDate(calendarDate) {\n const { start, end } = getStartAndEndMonth(\n calendarDate,\n this.state.weekStartOnMonday\n )\n this.setState({\n currentMonth: calendarDate,\n startDate: start,\n endDate: end,\n })\n this.props.loadMonthWorkouts(start, end)\n }\n\n handleNextMonth() {\n const calendarDate = addMonths(this.state.currentMonth, 1)\n this.updateStateDate(calendarDate)\n }\n\n handlePrevMonth() {\n const calendarDate = subMonths(this.state.currentMonth, 1)\n this.updateStateDate(calendarDate)\n }\n\n render() {\n const localeOptions = {\n locale: this.props.language === 'fr' ? fr : enGB,\n }\n return (\n <div className=\"card workout-card\">\n <div className=\"calendar\">\n {this.renderHeader(localeOptions)}\n {this.renderDays(localeOptions)}\n {this.renderCells()}\n </div>\n </div>\n )\n }\n}\n\nexport default connect(\n state => ({\n workouts: state.calendarWorkouts.data,\n language: state.language,\n sports: state.sports.data,\n user: state.user,\n }),\n dispatch => ({\n loadMonthWorkouts: (start, end) => {\n const dateFormat = 'yyyy-MM-dd'\n dispatch(\n getMonthWorkouts(format(start, dateFormat), format(end, dateFormat))\n )\n },\n })\n)(Calendar)\n","import React from 'react'\nimport { Link } from 'react-router-dom'\n\nimport { formatRecord, translateSports } from '../../utils/workouts'\n\nexport default function RecordsCard(props) {\n const { records, sports, t, user } = props\n const translatedSports = translateSports(sports, t)\n const recordsBySport = records.reduce((sportList, record) => {\n const sport = translatedSports.find(s => s.id === record.sport_id)\n if (sportList[sport.label] === void 0) {\n sportList[sport.label] = {\n img: sport.img,\n records: [],\n }\n }\n sportList[sport.label].records.push(formatRecord(record, user.timezone))\n return sportList\n }, {})\n\n return (\n <div className=\"card workout-card\">\n <div className=\"card-header\">{t('workouts:Personal records')}</div>\n <div className=\"card-body\">\n {Object.keys(recordsBySport).length === 0\n ? t('common:No records.')\n : Object.keys(recordsBySport)\n .sort()\n .map(sportLabel => (\n <div key={sportLabel}>\n <span className=\"heading-span\">\n <img\n alt={`${sportLabel} logo`}\n className=\"record-logo\"\n src={recordsBySport[sportLabel].img}\n />\n {sportLabel}\n </span>\n {/* eslint-disable-next-line max-len */}\n <table className=\"table table-borderless table-sm record-table\">\n <thead>\n <tr>\n <th colSpan=\"3\">\n <img\n alt={`${sportLabel} logo`}\n className=\"record-logo\"\n src={recordsBySport[sportLabel].img}\n />\n {sportLabel}\n </th>\n </tr>\n </thead>\n <tbody>\n {recordsBySport[sportLabel].records.map(rec => (\n <tr className=\"record-tr\" key={rec.id}>\n <td className=\"record-td\">\n {t(`workouts:${rec.record_type}`)}\n </td>\n <td className=\"record-td text-right\">{rec.value}</td>\n <td className=\"record-td text-right\">\n <Link to={`/workouts/${rec.workout_id}`}>\n {rec.workout_date}\n </Link>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n ))}\n </div>\n </div>\n )\n}\n","import {\n addDays,\n addMonths,\n addYears,\n format,\n startOfMonth,\n startOfWeek,\n startOfYear,\n} from 'date-fns'\n\nconst xAxisFormats = [\n { duration: 'week', dateFormat: 'yyyy-MM-dd', xAxis: 'dd/MM' },\n { duration: 'month', dateFormat: 'yyyy-MM', xAxis: 'MM/yyyy' },\n { duration: 'year', dateFormat: 'yyyy', xAxis: 'yyyy' },\n]\n\nexport const formatDuration = (totalSeconds, formatWithDay = false) => {\n let days = '0'\n if (formatWithDay) {\n days = String(Math.floor(totalSeconds / 86400))\n totalSeconds %= 86400\n }\n const hours = String(Math.floor(totalSeconds / 3600)).padStart(2, '0')\n totalSeconds %= 3600\n const minutes = String(Math.floor(totalSeconds / 60)).padStart(2, '0')\n const seconds = String(totalSeconds % 60).padStart(2, '0')\n if (formatWithDay) {\n return `${days === '0' ? '' : `${days}d:`}${\n hours === '00' ? '' : `${hours}h:`\n }${minutes}m:${seconds}s`\n }\n return `${hours === '00' ? '' : `${hours}:`}${minutes}:${seconds}`\n}\n\nexport const formatValue = (displayedData, value) =>\n value === 0\n ? ''\n : displayedData === 'distance'\n ? `${value.toFixed(2)} km`\n : displayedData === 'duration'\n ? formatDuration(value)\n : value\n\nconst dateIncrement = (duration, day) => {\n switch (duration) {\n case 'week':\n return addDays(day, 7)\n case 'year':\n return addYears(day, 1)\n case 'month':\n default:\n return addMonths(day, 1)\n }\n}\n\nconst startDate = (duration, day, weekm) => {\n switch (duration) {\n case 'week':\n return startOfWeek(day, { weekStartsOn: weekm ? 1 : 0 })\n case 'year':\n return startOfYear(day)\n case 'month':\n default:\n return startOfMonth(day)\n }\n}\n\nexport const formatStats = (stats, sports, params, displayedSports, weekm) => {\n const nbWorkoutsStats = []\n const distanceStats = []\n const durationStats = []\n\n for (\n let day = startDate(params.duration, params.start, weekm);\n day <= params.end;\n day = dateIncrement(params.duration, day)\n ) {\n const [xAxisFormat] = xAxisFormats.filter(\n x => x.duration === params.duration\n )\n const date = format(day, xAxisFormat.dateFormat)\n const xAxis = format(day, xAxisFormat.xAxis)\n const dataNbWorkouts = { date: xAxis }\n const dataDistance = { date: xAxis }\n const dataDuration = { date: xAxis }\n\n if (stats[date]) {\n Object.keys(stats[date])\n .filter(sportId =>\n displayedSports ? displayedSports.includes(+sportId) : true\n )\n .map(sportId => {\n const sportLabel = sports.filter(s => s.id === +sportId)[0].label\n dataNbWorkouts[sportLabel] = stats[date][sportId].nb_workouts\n dataDistance[sportLabel] = stats[date][sportId].total_distance\n dataDuration[sportLabel] = stats[date][sportId].total_duration\n return null\n })\n }\n nbWorkoutsStats.push(dataNbWorkouts)\n distanceStats.push(dataDistance)\n durationStats.push(dataDuration)\n }\n\n return {\n workouts: nbWorkoutsStats,\n distance: distanceStats,\n duration: durationStats,\n }\n}\n","import React from 'react'\n\nimport { formatDuration } from '../../../utils/stats'\n\nconst formatValue = (displayedData, value) =>\n displayedData === 'duration'\n ? formatDuration(value, true)\n : displayedData === 'distance'\n ? value.toFixed(2)\n : value\n\n/**\n * @return {null}\n */\nexport default function CustomTooltip(props) {\n const { active } = props\n if (active) {\n const { displayedData, payload, label } = props\n let total = 0\n payload.map(p => (total += p.value))\n return (\n <div className=\"custom-tooltip\">\n <p className=\"custom-tooltip-label\">{label}</p>\n {payload.map(p => (\n <p key={p.name} style={{ color: p.fill }}>\n {p.name}: {formatValue(displayedData, p.value)} {p.unit}\n </p>\n ))}\n {payload.length > 0 && (\n <p>Total: {formatValue(displayedData, total)}</p>\n )}\n </div>\n )\n }\n return null\n}\n","import React from 'react'\n\nimport { formatValue } from '../../../utils/stats'\n\n/**\n * @return {null}\n */\nexport default function CustomLabel(props) {\n const { displayedData, x, y, width, value } = props\n if (!value) {\n return null\n }\n const radius = 10\n const formattedValue = formatValue(displayedData, value)\n\n return (\n <g>\n <text\n x={x + width / 2}\n y={y - radius}\n fill=\"#666\"\n fontSize=\"11\"\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n >\n {formattedValue}\n </text>\n </g>\n )\n}\n","import React from 'react'\nimport {\n Bar,\n BarChart,\n ResponsiveContainer,\n Tooltip,\n XAxis,\n YAxis,\n} from 'recharts'\n\nimport { formatValue } from '../../../utils/stats'\nimport { workoutColors } from '../../../utils/workouts'\nimport CustomTooltip from './CustomTooltip'\nimport CustomLabel from './CustomLabel'\n\nexport default class StatsCharts extends React.PureComponent {\n constructor(props, context) {\n super(props, context)\n this.state = {\n displayedData: 'distance',\n }\n }\n handleRadioChange(changeEvent) {\n this.setState({\n displayedData: changeEvent.target.name,\n })\n }\n\n render() {\n const { displayedData } = this.state\n const { sports, stats, t } = this.props\n if (Object.keys(stats).length === 0) {\n return t('common:No workouts.')\n }\n return (\n <div className=\"chart-stats\">\n <div className=\"row chart-radio\">\n <label className=\"radioLabel col\">\n <input\n type=\"radio\"\n name=\"distance\"\n checked={displayedData === 'distance'}\n onChange={e => this.handleRadioChange(e)}\n />\n {t('statistics:distance')}\n </label>\n <label className=\"radioLabel col\">\n <input\n type=\"radio\"\n name=\"duration\"\n checked={displayedData === 'duration'}\n onChange={e => this.handleRadioChange(e)}\n />\n {t('statistics:duration')}\n </label>\n <label className=\"radioLabel col\">\n <input\n type=\"radio\"\n name=\"workouts\"\n checked={displayedData === 'workouts'}\n onChange={e => this.handleRadioChange(e)}\n />\n {t('statistics:workouts')}\n </label>\n </div>\n <ResponsiveContainer height={300}>\n <BarChart data={stats[displayedData]} margin={{ top: 15, bottom: 0 }}>\n <XAxis\n dataKey=\"date\"\n interval={0} // to force to display all ticks\n />\n <YAxis tickFormatter={value => formatValue(displayedData, value)} />\n <Tooltip\n content={<CustomTooltip displayedData={displayedData} />}\n />\n {sports.map((s, i) => (\n <Bar\n // disable for now due to problems w/ CustomLabel\n // see https://github.com/recharts/recharts/issues/829\n isAnimationActive={false}\n key={s.id}\n dataKey={s.label}\n stackId=\"a\"\n fill={workoutColors[i]}\n label={\n i === sports.length - 1 ? (\n <CustomLabel displayedData={displayedData} />\n ) : (\n ''\n )\n }\n name={t(`sports:${s.label}`)}\n />\n ))}\n </BarChart>\n </ResponsiveContainer>\n </div>\n )\n }\n}\n","import { format } from 'date-fns'\nimport React from 'react'\nimport { connect } from 'react-redux'\n\nimport { getStats } from '../../../actions/stats'\nimport { formatStats } from '../../../utils/stats'\nimport StatsChart from './StatsChart'\n\nclass Statistics extends React.PureComponent {\n componentDidMount() {\n this.updateData()\n }\n\n componentDidUpdate(prevProps) {\n if (\n (this.props.user.username &&\n this.props.user.username !== prevProps.user.username) ||\n this.props.statsParams !== prevProps.statsParams\n ) {\n this.updateData()\n }\n }\n\n updateData() {\n if (this.props.user.username) {\n this.props.loadWorkouts(\n this.props.user.username,\n this.props.user.weekm,\n this.props.statsParams\n )\n }\n }\n\n render() {\n const {\n displayedSports,\n sports,\n statistics,\n statsParams,\n displayEmpty,\n t,\n user,\n } = this.props\n if (!displayEmpty && Object.keys(statistics).length === 0) {\n return <span>{t('common:No workouts.')}</span>\n }\n const stats = formatStats(\n statistics,\n sports,\n statsParams,\n displayedSports,\n user.weekm\n )\n return <StatsChart sports={sports} stats={stats} t={t} />\n }\n}\n\nexport default connect(\n state => ({\n sports: state.sports.data,\n statistics: state.statistics.data,\n user: state.user,\n }),\n dispatch => ({\n loadWorkouts: (userName, weekm, data) => {\n const dateFormat = 'yyyy-MM-dd'\n // depends on user config (first day of week)\n const time =\n data.duration === 'week'\n ? `${data.duration}${weekm ? 'm' : ''}`\n : data.duration\n const params = {\n from: format(data.start, dateFormat),\n to: format(data.end, dateFormat),\n time: time,\n }\n dispatch(getStats(userName, data.type, params))\n },\n })\n)(Statistics)\n","import FitTrackeeGenericApi from '../fitTrackeeApi'\nimport { setData, setError } from './index'\n\nexport const getStats = (userName, type, data) => dispatch =>\n FitTrackeeGenericApi.getData(`stats/${userName}/${type}`, data)\n .then(ret => {\n if (ret.status === 'success') {\n dispatch(setData('statistics', ret.data))\n } else {\n dispatch(setError(`statistics|${ret.message}`))\n }\n })\n .catch(error => dispatch(setError(`statistics|${error}`)))\n","import { endOfMonth, startOfMonth } from 'date-fns'\nimport React from 'react'\n\nimport Stats from '../Common/Stats'\n\nexport default class Statistics extends React.Component {\n constructor(props, context) {\n super(props, context)\n const date = new Date()\n this.state = {\n start: startOfMonth(date),\n end: endOfMonth(date),\n duration: 'week',\n type: 'by_time',\n }\n }\n\n render() {\n const { t } = this.props\n return (\n <div className=\"card workout-card\">\n <div className=\"card-header\">{t('dashboard:This month')}</div>\n <div className=\"card-body\">\n <Stats displayEmpty={false} statsParams={this.state} t={t} />\n </div>\n </div>\n )\n }\n}\n","import React from 'react'\n\nexport default function UserStatistics(props) {\n const { t, user } = props\n const days = user.total_duration.match(/day/g)\n ? `${user.total_duration.split(' ')[0]} ${\n user.total_duration.match(/days/g) ? t('common:days') : t('common:day')\n }`\n : `0 ${t('common:days')},`\n let duration = user.total_duration.match(/day/g)\n ? user.total_duration.split(', ')[1]\n : user.total_duration\n duration = `${duration.split(':')[0]}h ${duration.split(':')[1]}min`\n return (\n <div className=\"row\">\n <div className=\"col-lg-3 col-md-6 col-sm-6\">\n <div className=\"card workout-card\">\n <div className=\"card-body row\">\n <div className=\"col-3\">\n <i className=\"fa fa-calendar fa-3x fa-color\" />\n </div>\n <div className=\"col-9 text-right\">\n <div className=\"huge\">{user.nb_workouts}</div>\n <div>{`${\n user.nb_workouts === 1\n ? t('common:workout')\n : t('common:workouts')\n }`}</div>\n </div>\n </div>\n </div>\n </div>\n <div className=\"col-lg-3 col-md-6 col-sm-6\">\n <div className=\"card workout-card\">\n <div className=\"card-body row\">\n <div className=\"col-3\">\n <i className=\"fa fa-road fa-3x fa-color\" />\n </div>\n <div className=\"col-9 text-right\">\n <div className=\"huge\">\n {Number(user.total_distance).toFixed(2)}\n </div>\n <div>km</div>\n </div>\n </div>\n </div>\n </div>\n <div className=\"col-lg-3 col-md-6 col-sm-6\">\n <div className=\"card workout-card\">\n <div className=\"card-body row\">\n <div className=\"col-3\">\n <i className=\"fa fa-clock-o fa-3x fa-color\" />\n </div>\n <div className=\"col-9 text-right\">\n <div className=\"huge\">{days}</div>\n <div>{duration}</div>\n </div>\n </div>\n </div>\n </div>\n <div className=\"col-lg-3 col-md-6 col-sm-6\">\n <div className=\"card workout-card\">\n <div className=\"card-body row\">\n <div className=\"col-3\">\n <i className=\"fa fa-tags fa-3x fa-color\" />\n </div>\n <div className=\"col-9 text-right\">\n <div className=\"huge\">{user.nb_sports}</div>\n <div>{`${\n user.nb_sports === 1 ? t('common:sport') : t('common:sports')\n }`}</div>\n </div>\n </div>\n </div>\n </div>\n </div>\n )\n}\n","import { format } from 'date-fns'\nimport React from 'react'\nimport { Link } from 'react-router-dom'\n\nimport StaticMap from '../Common/StaticMap'\nimport { getDateWithTZ } from '../../utils'\n\nexport default function WorkoutCard(props) {\n const { sports, t, user, workout } = props\n\n return (\n <div className=\"card workout-card text-center\">\n <div className=\"card-header\">\n <Link to={`/workouts/${workout.id}`}>\n {sports\n .filter(sport => sport.id === workout.sport_id)\n .map(sport => t(`sports:${sport.label}`))}{' '}\n -{' '}\n {format(\n getDateWithTZ(workout.workout_date, user.timezone),\n 'dd/MM/yyyy HH:mm'\n )}\n </Link>\n </div>\n <div className=\"card-body\">\n <div className=\"row\">\n {workout.map && (\n <div className=\"col\">\n <StaticMap workout={workout} />\n </div>\n )}\n <div className=\"col\">\n <p>\n <i className=\"fa fa-clock-o\" aria-hidden=\"true\" />{' '}\n {t('workouts:Duration')}: {workout.moving}\n {workout.map ? (\n <span>\n <br />\n <br />\n </span>\n ) : (\n ' - '\n )}\n <i className=\"fa fa-road\" aria-hidden=\"true\" />{' '}\n {t('workouts:Distance')}: {workout.distance} km\n </p>\n </div>\n </div>\n </div>\n </div>\n )\n}\n","import React from 'react'\nimport { Helmet } from 'react-helmet'\nimport { withTranslation } from 'react-i18next'\nimport { connect } from 'react-redux'\n\nimport Calendar from './Calendar'\nimport Message from '../Common/Message'\nimport NoWorkouts from '../Common/NoWorkouts'\nimport Records from './Records'\nimport Statistics from './Statistics'\nimport UserStatistics from './UserStatistics'\nimport WorkoutCard from './WorkoutCard'\nimport { getOrUpdateData } from '../../actions'\nimport { getMoreWorkouts } from '../../actions/workouts'\n\nclass DashBoard extends React.Component {\n constructor(props, context) {\n super(props, context)\n this.state = {\n page: 1,\n }\n }\n\n componentDidMount() {\n this.props.loadWorkouts()\n }\n\n render() {\n const {\n loadMoreWorkouts,\n message,\n records,\n sports,\n t,\n user,\n workouts,\n } = this.props\n const paginationEnd =\n workouts.length > 0\n ? workouts[workouts.length - 1].previous_workout === null\n : true\n const { page } = this.state\n return (\n <div>\n <Helmet>\n <title>FitTrackee - {t('common:Dashboard')}</title>\n </Helmet>\n {message ? (\n <Message message={message} t={t} />\n ) : (\n workouts &&\n user.total_duration &&\n sports.length > 0 && (\n <div className=\"container dashboard\">\n <UserStatistics user={user} t={t} />\n <div className=\"row\">\n <div className=\"col-md-4\">\n <Statistics t={t} />\n <Records\n t={t}\n records={records}\n sports={sports}\n user={user}\n />\n </div>\n <div className=\"col-md-8\">\n <Calendar weekm={user.weekm} />\n {workouts.length > 0 ? (\n workouts.map(workout => (\n <WorkoutCard\n workout={workout}\n key={workout.id}\n sports={sports}\n t={t}\n user={user}\n />\n ))\n ) : (\n <NoWorkouts t={t} />\n )}\n {!paginationEnd && (\n <input\n type=\"submit\"\n className=\"btn btn-default btn-md btn-block\"\n value=\"Load more workouts\"\n onClick={() => {\n loadMoreWorkouts(page + 1)\n this.setState({ page: page + 1 })\n }}\n />\n )}\n </div>\n </div>\n </div>\n )\n )}\n </div>\n )\n }\n}\n\nexport default withTranslation()(\n connect(\n state => ({\n workouts: state.workouts.data,\n message: state.message,\n records: state.records.data,\n sports: state.sports.data,\n user: state.user,\n }),\n dispatch => ({\n loadWorkouts: () => {\n dispatch(getOrUpdateData('getData', 'workouts', { page: 1 }))\n dispatch(getOrUpdateData('getData', 'records'))\n },\n loadMoreWorkouts: page => {\n dispatch(getMoreWorkouts({ page }))\n },\n })\n )(DashBoard)\n)\n","import React from 'react'\n\nimport { version } from './../../utils'\n\nexport default function Footer() {\n return (\n <footer className=\"footer\">\n <div className=\"container\">\n <strong>FitTrackee</strong> v{version} -{' '}\n <a\n href=\"https://github.com/SamR1/FitTrackee\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n source code\n </a>{' '}\n under{' '}\n <a\n href=\"https://choosealicense.com/licenses/gpl-3.0/\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n GPLv3\n </a>{' '}\n license -{' '}\n <a\n href=\"https://samr1.github.io/FitTrackee/\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n documentation\n </a>\n </div>\n </footer>\n )\n}\n","import React from 'react'\nimport { Trans } from 'react-i18next'\nimport { connect } from 'react-redux'\nimport { Link } from 'react-router-dom'\n\nimport { logout } from '../../actions/user'\n\nclass Logout extends React.Component {\n componentDidMount() {\n this.props.UserLogout()\n }\n render() {\n return (\n <div className=\"container dashboard\">\n <div className=\"row\">\n <div className=\"col-2\" />\n <div className=\"card col-8\">\n <div className=\"card-body\">\n <div className=\"text-center\">\n <Trans i18nKey=\"user:loggedOut\">\n You are now logged out. Click <Link to=\"/login\">here</Link> to\n log back in.\n </Trans>\n </div>\n </div>\n </div>\n <div className=\"col-2\" />\n </div>\n </div>\n )\n }\n}\n\nexport default connect(\n state => ({\n user: state.user,\n }),\n dispatch => ({\n UserLogout: () => {\n dispatch(logout())\n },\n })\n)(Logout)\n","function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nimport * as React from \"react\";\n\nvar _ref2 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"m466.916 27.803h-421.832c-24.859 0-45.084 20.225-45.084 45.084v366.226c0 24.859 20.225 45.084 45.084 45.084h421.832c24.859 0 45.084-20.225 45.084-45.084v-366.226c0-24.859-20.225-45.084-45.084-45.084z\",\n fill: \"#f0f9ff\"\n});\n\nvar _ref3 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"m198.58 188.334-181.344-150.862c-7.75 6.107-13.456 14.691-15.905 24.554l164.142 136.551h33.102z\",\n fill: \"#f40055\"\n});\n\nvar _ref4 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"m313.425 198.576h33.93l163.447-135.973c-2.325-9.923-7.93-18.592-15.613-24.796l-181.764 151.211z\",\n fill: \"#c20044\"\n});\n\nvar _ref5 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"m165.472 313.425-164.141 136.549c2.449 9.863 8.155 18.447 15.905 24.553l181.344-150.861-.005-10.241z\",\n fill: \"#f40055\"\n});\n\nvar _ref6 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"m313.425 313.425v9.557l181.765 151.211c7.683-6.204 13.288-14.874 15.613-24.796l-163.446-135.971z\",\n fill: \"#c20044\"\n});\n\nvar _ref7 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"m53.273 27.803 145.302 120.879v-120.879z\",\n fill: \"#406bd4\"\n});\n\nvar _ref8 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"m313.425 150.571v-122.768h148.082z\",\n fill: \"#3257b0\"\n});\n\nvar _ref9 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"m394.732 198.575 117.268-97.556v97.556z\",\n fill: \"#3257b0\"\n});\n\nvar _ref10 = /*#__PURE__*/React.createElement(\"g\", {\n fill: \"#406bd4\"\n}, /*#__PURE__*/React.createElement(\"path\", {\n d: \"m0 99.317v99.258h119.313z\"\n}), /*#__PURE__*/React.createElement(\"path\", {\n d: \"m0 313.425v97.699l117.44-97.699z\"\n}), /*#__PURE__*/React.createElement(\"path\", {\n d: \"m50.49 484.197 148.085-122.676v122.676z\"\n}));\n\nvar _ref11 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"m313.425 484.197v-124.139l149.221 124.139z\",\n fill: \"#3257b0\"\n});\n\nvar _ref12 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"m512 409.423-115.395-95.998h115.395z\",\n fill: \"#3257b0\"\n});\n\nvar _ref13 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"m512 222.142h-222.142v-194.339h-67.716v194.339h-222.142v67.716h222.142v194.339h67.716v-194.339h222.142z\",\n fill: \"#f40055\"\n});\n\nvar _ref14 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"m289.858 222.142v-194.339h-33.858v456.394h33.858v-194.339h222.142v-67.716z\",\n fill: \"#c20044\"\n});\n\nfunction SvgEn(_ref, svgRef) {\n let title = _ref.title,\n titleId = _ref.titleId,\n props = _objectWithoutProperties(_ref, [\"title\", \"titleId\"]);\n\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n id: \"Capa_1\",\n enableBackground: \"new 0 0 512 512\",\n height: 512,\n viewBox: \"0 0 512 512\",\n width: 512,\n xmlns: \"http://www.w3.org/2000/svg\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, _ref2, _ref3, _ref4, _ref5, _ref6, _ref7, _ref8, _ref9, _ref10, _ref11, _ref12, _ref13, _ref14);\n}\n\nconst ForwardRef = /*#__PURE__*/React.forwardRef(SvgEn);\nexport default __webpack_public_path__ + \"static/media/en.9e6dbfb0.svg\";\nexport { ForwardRef as ReactComponent };","function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nimport * as React from \"react\";\n\nvar _ref2 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"m173.899 31.804h-8.707l-4.397-4h-115.711c-24.859-.001-45.084 20.224-45.084 45.083v366.226c0 24.859 20.225 45.084 45.084 45.084h115.711l6.348-4h6.755v-448.393z\",\n fill: \"#406bd4\"\n});\n\nvar _ref3 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"m466.916 27.803h-115.711l-4.523 4h-5.141v448.393h4.141l5.523 4h115.711c24.859 0 45.084-20.225 45.084-45.084v-366.225c0-24.859-20.225-45.084-45.084-45.084z\",\n fill: \"#c20044\"\n});\n\nvar _ref4 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"m160.795 27.803h190.409v456.394h-190.409z\",\n fill: \"#f0f9ff\"\n});\n\nvar _ref5 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"m256 27.803h95.205v456.394h-95.205z\",\n fill: \"#cee5f5\"\n});\n\nfunction SvgFr(_ref, svgRef) {\n let title = _ref.title,\n titleId = _ref.titleId,\n props = _objectWithoutProperties(_ref, [\"title\", \"titleId\"]);\n\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n id: \"Capa_1\",\n enableBackground: \"new 0 0 512 512\",\n height: 512,\n viewBox: \"0 0 512 512\",\n width: 512,\n xmlns: \"http://www.w3.org/2000/svg\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, _ref2, _ref3, _ref4, _ref5);\n}\n\nconst ForwardRef = /*#__PURE__*/React.forwardRef(SvgFr);\nexport default __webpack_public_path__ + \"static/media/fr.d0f9280c.svg\";\nexport { ForwardRef as ReactComponent };","import React, { Component } from 'react'\nimport { connect } from 'react-redux'\n\nimport { ReactComponent as EnFlag } from '../../images/flags/en.svg'\nimport { ReactComponent as FrFlag } from '../../images/flags/fr.svg'\nimport { updateLanguage } from '../../actions/index'\n\nexport const languages = [\n {\n name: 'en',\n selected: true,\n flag: <EnFlag />,\n },\n {\n name: 'fr',\n selected: false,\n flag: <FrFlag />,\n },\n]\n\nclass Dropdown extends Component {\n constructor(props) {\n super(props)\n this.state = {\n isOpen: false,\n }\n }\n\n toggleDropdown() {\n this.setState(prevState => ({\n isOpen: !prevState.isOpen,\n }))\n }\n\n render() {\n const { isOpen } = this.state\n const { language: selected, onUpdateLanguage } = this.props\n return (\n <div className=\"dropdown-wrapper\" onClick={() => this.toggleDropdown()}>\n <ul className=\"dropdown-list i18n-flag\">\n {languages\n .filter(language =>\n isOpen ? language : language.name === selected\n )\n .map(language => (\n <li\n className={`dropdown-item${\n language.name === selected && isOpen\n ? ' dropdown-item-selected'\n : ''\n }`}\n key={language.name}\n onClick={() => onUpdateLanguage(language.name, selected)}\n >\n {language.flag} {language.name}\n </li>\n ))}\n </ul>\n </div>\n )\n }\n}\n\nexport default connect(\n state => ({\n language: state.language,\n }),\n dispatch => ({\n onUpdateLanguage: (lang, selected) => {\n if (lang !== selected) {\n dispatch(updateLanguage(lang))\n }\n },\n })\n)(Dropdown)\n","import React from 'react'\nimport { connect } from 'react-redux'\nimport { withTranslation } from 'react-i18next'\nimport { Link } from 'react-router-dom'\n\nimport LanguageDropdown from './LanguageDropdown'\nimport { apiUrl } from '../../utils'\n\nclass NavBar extends React.PureComponent {\n render() {\n const { admin, isAuthenticated, picture, t, username } = this.props\n return (\n <header>\n <nav className=\"navbar navbar-expand-lg navbar-light bg-light\">\n <div className=\"container\">\n <span className=\"navbar-brand\">FitTrackee</span>\n <button\n className=\"navbar-toggler\"\n type=\"button\"\n data-toggle=\"collapse\"\n data-target=\"#navbarSupportedContent\"\n aria-controls=\"navbarSupportedContent\"\n aria-expanded=\"false\"\n aria-label=\"Toggle navigation\"\n >\n <span className=\"navbar-toggler-icon\" />\n </button>\n <div\n className=\"collapse navbar-collapse\"\n id=\"navbarSupportedContent\"\n >\n <ul className=\"navbar-nav mr-auto\">\n <li className=\"nav-item\">\n <Link\n className=\"nav-link\"\n to={{\n pathname: '/',\n }}\n >\n {t('common:Dashboard')}\n </Link>\n </li>\n {isAuthenticated && (\n <li className=\"nav-item\">\n <Link\n className=\"nav-link\"\n to={{\n pathname: '/workouts/history',\n }}\n >\n {t('Workouts')}\n </Link>\n </li>\n )}\n {isAuthenticated && (\n <li className=\"nav-item\">\n <Link\n className=\"nav-link\"\n to={{\n pathname: '/workouts/statistics',\n }}\n >\n {t('common:Statistics')}\n </Link>\n </li>\n )}\n {admin && (\n <li className=\"nav-item\">\n <Link\n className=\"nav-link\"\n to={{\n pathname: '/admin',\n }}\n >\n Admin\n </Link>\n </li>\n )}\n {isAuthenticated && (\n <li className=\"nav-item\">\n <Link\n className=\"nav-link\"\n to={{\n pathname: '/workouts/add',\n }}\n >\n <strong>{t('common:Add workout')}</strong>\n </Link>\n </li>\n )}\n </ul>\n {/* prettier-ignore */}\n <ul\n className=\"navbar-nav flex-row ml-md-auto d-none d-md-flex\"\n >\n {!isAuthenticated && (\n <li className=\"nav-item\">\n <Link\n className=\"nav-link\"\n to={{\n pathname: '/register',\n }}\n >\n {t('user:Register')}\n </Link>\n </li>\n )}\n {!isAuthenticated && (\n <li className=\"nav-item\">\n <Link\n className=\"nav-link\"\n to={{\n pathname: '/login',\n }}\n >\n {t('user:Login')}\n </Link>\n </li>\n )}\n {isAuthenticated && (\n <>\n {picture === true ? (\n <img\n alt=\"Avatar\"\n src={`${apiUrl}users/${username}/picture?${Date.now()}`}\n className=\"img-fluid App-nav-profile-img\"\n />\n ) : (\n <i\n className=\"fa fa-user-circle-o fa-2x no-picture\"\n aria-hidden=\"true\"\n />\n )}\n <li className=\"nav-item\">\n <Link\n className=\"nav-link\"\n to={{\n pathname: '/profile',\n }}\n >\n {username}\n </Link>\n </li>\n <li className=\"nav-item\">\n <Link\n className=\"nav-link\"\n to={{\n pathname: '/logout',\n }}\n >\n {t('user:Logout')}\n </Link>\n </li>\n </>\n )}\n <li><LanguageDropdown /></li>\n </ul>\n </div>\n </div>\n </nav>\n </header>\n )\n }\n}\n\nexport default withTranslation()(\n connect(({ user }) => ({\n admin: user.admin,\n isAuthenticated: user.isAuthenticated,\n picture: user.picture,\n username: user.username,\n }))(NavBar)\n)\n","function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nimport * as React from \"react\";\n\nvar _ref2 = /*#__PURE__*/React.createElement(\"g\", null, /*#__PURE__*/React.createElement(\"g\", null, /*#__PURE__*/React.createElement(\"path\", {\n d: \"M468.683,287.265h-69.07c-4.147,0-7.508,3.361-7.508,7.508c0,4.147,3.361,7.508,7.508,7.508h69.07 c4.147,0,7.508-3.361,7.508-7.508C476.191,290.626,472.83,287.265,468.683,287.265z\"\n})));\n\nvar _ref3 = /*#__PURE__*/React.createElement(\"g\", null, /*#__PURE__*/React.createElement(\"g\", null, /*#__PURE__*/React.createElement(\"path\", {\n d: \"M105.012,268.377L85.781,256l19.231-12.376c3.487-2.243,4.495-6.888,2.251-10.376c-2.244-3.486-6.888-4.497-10.376-2.25 l-17.471,11.243v-20.776c0-4.147-3.361-7.508-7.508-7.508c-4.147,0-7.508,3.361-7.508,7.508v20.775l-17.47-11.243 c-3.486-2.245-8.132-1.238-10.376,2.25c-2.245,3.487-1.237,8.133,2.25,10.376L58.034,256l-19.231,12.376 c-3.487,2.244-4.495,6.889-2.25,10.376c1.435,2.23,3.852,3.446,6.32,3.446c1.391,0,2.799-0.386,4.056-1.196l17.47-11.243v20.775 c0,4.147,3.361,7.508,7.508,7.508c4.147,0,7.508-3.361,7.508-7.508V269.76l17.471,11.243c1.257,0.809,2.664,1.196,4.056,1.196 c2.467,0,4.885-1.216,6.32-3.446C109.507,275.266,108.499,270.62,105.012,268.377z\"\n})));\n\nvar _ref4 = /*#__PURE__*/React.createElement(\"g\", null, /*#__PURE__*/React.createElement(\"g\", null, /*#__PURE__*/React.createElement(\"path\", {\n d: \"M194.441,268.377L175.21,256l19.231-12.376c3.487-2.244,4.495-6.889,2.25-10.376c-2.245-3.486-6.888-4.497-10.376-2.25 l-17.47,11.243v-20.775c0-4.147-3.361-7.508-7.508-7.508c-4.147,0-7.508,3.361-7.508,7.508v20.776l-17.471-11.243 c-3.487-2.245-8.133-1.238-10.376,2.25c-2.245,3.487-1.237,8.133,2.25,10.376L147.463,256l-19.231,12.376 c-3.487,2.244-4.495,6.889-2.25,10.376c1.435,2.23,3.852,3.446,6.32,3.446c1.391,0,2.799-0.386,4.056-1.196l17.471-11.243v20.776 c0,4.147,3.361,7.508,7.508,7.508c4.147,0,7.508-3.361,7.508-7.508V269.76l17.47,11.243c1.257,0.809,2.664,1.196,4.056,1.196 c2.467,0,4.885-1.216,6.32-3.446C198.936,275.266,197.928,270.62,194.441,268.377z\"\n})));\n\nvar _ref5 = /*#__PURE__*/React.createElement(\"g\", null, /*#__PURE__*/React.createElement(\"g\", null, /*#__PURE__*/React.createElement(\"path\", {\n d: \"M283.871,268.377L264.64,256l19.231-12.376c3.487-2.243,4.495-6.888,2.251-10.376c-2.245-3.486-6.888-4.497-10.376-2.25 l-17.471,11.243v-20.775c0-4.147-3.361-7.508-7.508-7.508c-4.147,0-7.508,3.361-7.508,7.508v20.775l-17.471-11.243 c-3.486-2.245-8.134-1.238-10.376,2.25c-2.245,3.487-1.237,8.133,2.25,10.376L236.892,256l-19.231,12.376 c-3.487,2.244-4.495,6.889-2.25,10.376c1.435,2.23,3.852,3.446,6.32,3.446c1.391,0,2.799-0.386,4.056-1.196l17.471-11.243v20.775 c0,4.147,3.361,7.508,7.508,7.508c4.147,0,7.508-3.361,7.508-7.508V269.76l17.471,11.243c1.257,0.809,2.664,1.196,4.056,1.196 c2.467,0,4.886-1.216,6.32-3.446C288.366,275.266,287.358,270.62,283.871,268.377z\"\n})));\n\nvar _ref6 = /*#__PURE__*/React.createElement(\"g\", null, /*#__PURE__*/React.createElement(\"g\", null, /*#__PURE__*/React.createElement(\"path\", {\n d: \"M373.3,268.377L354.069,256l19.231-12.376c3.487-2.244,4.495-6.889,2.25-10.376c-2.244-3.486-6.888-4.497-10.376-2.25 l-17.471,11.243v-20.776c0-4.147-3.361-7.508-7.508-7.508c-4.147,0-7.508,3.361-7.508,7.508v20.775l-17.47-11.243 c-3.486-2.245-8.132-1.238-10.376,2.25c-2.245,3.487-1.237,8.133,2.25,10.376L326.322,256l-19.231,12.376 c-3.487,2.244-4.495,6.889-2.25,10.376c1.435,2.23,3.852,3.446,6.32,3.446c1.391,0,2.799-0.386,4.056-1.196l17.47-11.243v20.776 c0,4.147,3.361,7.508,7.508,7.508c4.147,0,7.508-3.361,7.508-7.508V269.76l17.471,11.243c1.257,0.809,2.664,1.196,4.056,1.196 c2.467,0,4.885-1.216,6.32-3.446C377.795,275.266,376.787,270.62,373.3,268.377z\"\n})));\n\nvar _ref7 = /*#__PURE__*/React.createElement(\"g\", null, /*#__PURE__*/React.createElement(\"g\", null, /*#__PURE__*/React.createElement(\"path\", {\n d: \"M271.792,330.359H15.016V181.642h93.1c4.147,0,7.508-3.361,7.508-7.508c0-4.147-3.361-7.508-7.508-7.508H12.513 C5.613,166.626,0,172.24,0,179.14v153.722c0,6.9,5.613,12.513,12.513,12.513h259.278c4.147,0,7.508-3.361,7.508-7.508 C279.299,333.72,275.939,330.359,271.792,330.359z\"\n})));\n\nvar _ref8 = /*#__PURE__*/React.createElement(\"g\", null, /*#__PURE__*/React.createElement(\"g\", null, /*#__PURE__*/React.createElement(\"path\", {\n d: \"M499.487,166.626H162.174c-4.147,0-7.508,3.361-7.508,7.508c0,4.147,3.361,7.508,7.508,7.508h334.811v148.716H323.848 c-4.147,0-7.508,3.361-7.508,7.508c0,4.147,3.361,7.508,7.508,7.508h175.64c6.9,0,12.513-5.613,12.513-12.513V179.14 C512.001,172.24,506.387,166.626,499.487,166.626z\"\n})));\n\nfunction SvgPassword(_ref, svgRef) {\n let title = _ref.title,\n titleId = _ref.titleId,\n props = _objectWithoutProperties(_ref, [\"title\", \"titleId\"]);\n\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n id: \"Layer_1\",\n xmlns: \"http://www.w3.org/2000/svg\",\n xmlnsXlink: \"http://www.w3.org/1999/xlink\",\n x: \"0px\",\n y: \"0px\",\n viewBox: \"0 0 512.001 512.001\",\n style: {\n enableBackground: \"new 0 0 512.001 512.001\"\n },\n xmlSpace: \"preserve\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, _ref2, _ref3, _ref4, _ref5, _ref6, _ref7, _ref8);\n}\n\nconst ForwardRef = /*#__PURE__*/React.forwardRef(SvgPassword);\nexport default __webpack_public_path__ + \"static/media/password.afe6a2a5.svg\";\nexport { ForwardRef as ReactComponent };","function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nimport * as React from \"react\";\n\nvar _ref2 = /*#__PURE__*/React.createElement(\"g\", null, /*#__PURE__*/React.createElement(\"path\", {\n d: \"M339.798,260.429c0.13-0.026,0.257-0.061,0.385-0.094c0.109-0.028,0.219-0.051,0.326-0.084 c0.125-0.038,0.247-0.085,0.369-0.129c0.108-0.039,0.217-0.074,0.324-0.119c0.115-0.048,0.226-0.104,0.338-0.157 c0.109-0.052,0.22-0.1,0.327-0.158c0.107-0.057,0.208-0.122,0.312-0.184c0.107-0.064,0.215-0.124,0.319-0.194 c0.111-0.074,0.214-0.156,0.321-0.236c0.09-0.067,0.182-0.13,0.27-0.202c0.162-0.133,0.316-0.275,0.466-0.421 c0.027-0.026,0.056-0.048,0.083-0.075c0.028-0.028,0.052-0.059,0.079-0.088c0.144-0.148,0.284-0.3,0.416-0.46 c0.077-0.094,0.144-0.192,0.216-0.289c0.074-0.1,0.152-0.197,0.221-0.301c0.074-0.111,0.139-0.226,0.207-0.34 c0.057-0.096,0.118-0.19,0.171-0.289c0.062-0.115,0.114-0.234,0.169-0.351c0.049-0.104,0.101-0.207,0.146-0.314 c0.048-0.115,0.086-0.232,0.128-0.349c0.041-0.114,0.085-0.227,0.12-0.343c0.036-0.118,0.062-0.238,0.092-0.358 c0.029-0.118,0.063-0.234,0.086-0.353c0.028-0.141,0.045-0.283,0.065-0.425c0.014-0.1,0.033-0.199,0.043-0.3 c0.025-0.249,0.038-0.498,0.038-0.748V92.76c0-4.143-3.357-7.5-7.5-7.5h-236.25c-0.066,0-0.13,0.008-0.196,0.01 c-0.143,0.004-0.285,0.01-0.427,0.022c-0.113,0.009-0.225,0.022-0.337,0.037c-0.128,0.016-0.255,0.035-0.382,0.058 c-0.119,0.021-0.237,0.046-0.354,0.073c-0.119,0.028-0.238,0.058-0.356,0.092c-0.117,0.033-0.232,0.069-0.346,0.107 c-0.117,0.04-0.234,0.082-0.349,0.128c-0.109,0.043-0.216,0.087-0.322,0.135c-0.118,0.053-0.235,0.11-0.351,0.169 c-0.099,0.051-0.196,0.103-0.292,0.158c-0.116,0.066-0.23,0.136-0.343,0.208c-0.093,0.06-0.184,0.122-0.274,0.185 c-0.106,0.075-0.211,0.153-0.314,0.235c-0.094,0.075-0.186,0.152-0.277,0.231c-0.09,0.079-0.179,0.158-0.266,0.242 c-0.099,0.095-0.194,0.194-0.288,0.294c-0.047,0.05-0.097,0.094-0.142,0.145c-0.027,0.03-0.048,0.063-0.074,0.093 c-0.094,0.109-0.182,0.223-0.27,0.338c-0.064,0.084-0.13,0.168-0.19,0.254c-0.078,0.112-0.15,0.227-0.222,0.343 c-0.059,0.095-0.12,0.189-0.174,0.286c-0.063,0.112-0.118,0.227-0.175,0.342c-0.052,0.105-0.106,0.21-0.153,0.317 c-0.049,0.113-0.092,0.23-0.135,0.345c-0.043,0.113-0.087,0.225-0.124,0.339c-0.037,0.115-0.067,0.232-0.099,0.349 c-0.032,0.12-0.066,0.239-0.093,0.36c-0.025,0.113-0.042,0.228-0.062,0.342c-0.022,0.13-0.044,0.26-0.06,0.39 c-0.013,0.108-0.019,0.218-0.027,0.328c-0.01,0.14-0.019,0.28-0.021,0.421c-0.001,0.041-0.006,0.081-0.006,0.122v46.252 c0,4.143,3.357,7.5,7.5,7.5s7.5-3.357,7.5-7.5v-29.595l66.681,59.037c-0.348,0.245-0.683,0.516-0.995,0.827l-65.687,65.687v-49.288 c0-4.143-3.357-7.5-7.5-7.5s-7.5,3.357-7.5,7.5v9.164h-38.75c-4.143,0-7.5,3.357-7.5,7.5s3.357,7.5,7.5,7.5h38.75v43.231 c0,4.143,3.357,7.5,7.5,7.5h236.25c0.247,0,0.494-0.013,0.74-0.037c0.115-0.011,0.226-0.033,0.339-0.049 C339.542,260.469,339.67,260.454,339.798,260.429z M330.834,234.967l-65.688-65.687c-0.042-0.042-0.087-0.077-0.13-0.117 l49.383-41.897c3.158-2.68,3.546-7.412,0.866-10.571c-2.678-3.157-7.41-3.547-10.571-0.866l-84.381,71.59l-98.444-87.158h208.965 V234.967z M185.878,179.888c0.535-0.535,0.969-1.131,1.308-1.765l28.051,24.835c1.418,1.255,3.194,1.885,4.972,1.885 c1.726,0,3.451-0.593,4.853-1.781l28.587-24.254c0.26,0.38,0.553,0.743,0.89,1.08l65.687,65.687H120.191L185.878,179.888z\"\n}), /*#__PURE__*/React.createElement(\"path\", {\n d: \"M7.5,170.676h126.667c4.143,0,7.5-3.357,7.5-7.5s-3.357-7.5-7.5-7.5H7.5c-4.143,0-7.5,3.357-7.5,7.5 S3.357,170.676,7.5,170.676z\"\n}), /*#__PURE__*/React.createElement(\"path\", {\n d: \"M20.625,129.345H77.5c4.143,0,7.5-3.357,7.5-7.5s-3.357-7.5-7.5-7.5H20.625c-4.143,0-7.5,3.357-7.5,7.5 S16.482,129.345,20.625,129.345z\"\n}), /*#__PURE__*/React.createElement(\"path\", {\n d: \"M62.5,226.51h-55c-4.143,0-7.5,3.357-7.5,7.5s3.357,7.5,7.5,7.5h55c4.143,0,7.5-3.357,7.5-7.5S66.643,226.51,62.5,226.51z\"\n}));\n\nfunction SvgMailSend(_ref, svgRef) {\n let title = _ref.title,\n titleId = _ref.titleId,\n props = _objectWithoutProperties(_ref, [\"title\", \"titleId\"]);\n\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n id: \"Capa_1\",\n xmlns: \"http://www.w3.org/2000/svg\",\n xmlnsXlink: \"http://www.w3.org/1999/xlink\",\n x: \"0px\",\n y: \"0px\",\n viewBox: \"0 0 345.834 345.834\",\n style: {\n enableBackground: \"new 0 0 345.834 345.834\"\n },\n xmlSpace: \"preserve\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, _ref2);\n}\n\nconst ForwardRef = /*#__PURE__*/React.forwardRef(SvgMailSend);\nexport default __webpack_public_path__ + \"static/media/mail-send.619079f0.svg\";\nexport { ForwardRef as ReactComponent };","import React from 'react'\nimport { Trans, useTranslation } from 'react-i18next'\nimport { Link } from 'react-router-dom'\n\nimport { ReactComponent as Password } from '../../images/password.svg'\nimport { ReactComponent as MailSend } from '../../images/mail-send.svg'\n\nexport default function PasswordReset(props) {\n const { t } = useTranslation()\n const { action } = props\n return (\n <div className=\"container dashboard\">\n <div className=\"row\">\n <div className=\"col-2\" />\n <div className=\"card col-8\">\n <div className=\"card-body\">\n <div className=\"text-center \">\n {action === 'sent' && (\n <>\n <div className=\"svg-icon\">\n <MailSend />\n </div>\n {t(\n // eslint-disable-next-line max-len\n \"user:Check your email. If your address is in our database, you'll received an email with a link to reset your password.\"\n )}\n </>\n )}\n {action === 'updated' && (\n <>\n <div className=\"svg-icon\">\n <Password />\n </div>\n <Trans i18nKey=\"user:updatedPasswordText\">\n {/* prettier-ignore */}\n Your password have been updated. Click\n <Link to=\"/login\">here</Link> to log in.\n </Trans>\n </>\n )}\n </div>\n </div>\n </div>\n <div className=\"col-2\" />\n </div>\n </div>\n )\n}\n","import { format } from 'date-fns'\nimport React from 'react'\nimport { Helmet } from 'react-helmet'\nimport { withTranslation } from 'react-i18next'\nimport { connect } from 'react-redux'\nimport TimezonePicker from 'react-timezone'\n\nimport Message from '../Common/Message'\nimport { deleteUser, handleProfileFormSubmit } from '../../actions/user'\nimport { history } from '../../index'\nimport { languages } from '../NavBar/LanguageDropdown'\nimport CustomModal from '../Common/CustomModal'\n\nclass ProfileEdit extends React.Component {\n constructor(props, context) {\n super(props, context)\n this.state = {\n formData: {},\n displayModal: false,\n }\n }\n\n componentDidMount() {\n this.initForm()\n }\n\n componentDidUpdate(prevProps) {\n if (prevProps.user !== this.props.user) {\n this.initForm()\n }\n }\n\n initForm() {\n const { user } = this.props\n const formData = {}\n Object.keys(user).map(k =>\n user[k] === null\n ? (formData[k] = '')\n : k === 'birth_date'\n ? (formData[k] = format(new Date(user[k]), 'yyyy-MM-DD'))\n : (formData[k] = user[k])\n )\n this.setState({ formData })\n }\n\n handleFormChange(e) {\n const { formData } = this.state\n if (e.target.name === 'weekm') {\n formData.weekm = e.target.value === 'Monday'\n } else {\n formData[e.target.name] = e.target.value\n }\n this.setState(formData)\n }\n\n displayModal(value) {\n this.setState(prevState => ({\n ...prevState,\n displayModal: value,\n }))\n }\n\n render() {\n const {\n message,\n onDeleteUser,\n onHandleProfileFormSubmit,\n t,\n user,\n } = this.props\n const { displayModal, formData } = this.state\n return (\n <div>\n <Helmet>\n <title>FitTrackee - {t('user:Profile Edition')}</title>\n </Helmet>\n {formData.isAuthenticated && (\n <div className=\"container\">\n {displayModal && (\n <CustomModal\n title={t('common:Confirmation')}\n text={t(\n 'user:Are you sure you want to delete your account? ' +\n 'All data will be deleted, this cannot be undone.'\n )}\n confirm={() => {\n onDeleteUser(user.username)\n this.displayModal(false)\n }}\n close={() => this.displayModal(false)}\n />\n )}\n <h1 className=\"page-title\">{t('user:Profile Edition')}</h1>\n <div className=\"row\">\n <div className=\"col-md-2\" />\n <div className=\"col-md-8\">\n <div className=\"card\">\n <div className=\"card-header\">{user.username}</div>\n <div className=\"card-body\">\n <div className=\"row\">\n <div className=\"col-md-12\">\n <form\n onSubmit={event => {\n event.preventDefault()\n onHandleProfileFormSubmit(formData)\n }}\n >\n <div className=\"form-group\">\n <label>\n {t('user:Email')}:\n <input\n name=\"email\"\n className=\"form-control input-lg\"\n type=\"text\"\n value={formData.email}\n readOnly\n />\n </label>\n </div>\n <div className=\"form-group\">\n <label>\n {t('user:Registration Date')}:\n <input\n name=\"createdAt\"\n className=\"form-control input-lg\"\n type=\"text\"\n value={formData.created_at}\n disabled\n />\n </label>\n </div>\n <div className=\"form-group\">\n <label>\n {t('user:Password')}:\n <input\n name=\"password\"\n className=\"form-control input-lg\"\n type=\"password\"\n onChange={e => this.handleFormChange(e)}\n />\n </label>\n </div>\n <div className=\"form-group\">\n <label>\n {t('user:Password Confirmation')}:\n <input\n name=\"password_conf\"\n className=\"form-control input-lg\"\n type=\"password\"\n onChange={e => this.handleFormChange(e)}\n />\n </label>\n </div>\n <hr />\n <div className=\"form-group\">\n <label>\n {t('user:First Name')}:\n <input\n name=\"first_name\"\n className=\"form-control input-lg\"\n type=\"text\"\n value={formData.first_name}\n onChange={e => this.handleFormChange(e)}\n />\n </label>\n </div>\n <div className=\"form-group\">\n <label>\n {t('user:Last Name')}:\n <input\n name=\"last_name\"\n className=\"form-control input-lg\"\n type=\"text\"\n value={formData.last_name}\n onChange={e => this.handleFormChange(e)}\n />\n </label>\n </div>\n <div className=\"form-group\">\n <label>\n {t('user:Birth Date')}\n <input\n name=\"birth_date\"\n className=\"form-control input-lg\"\n type=\"date\"\n value={formData.birth_date}\n onChange={e => this.handleFormChange(e)}\n />\n </label>\n </div>\n <div className=\"form-group\">\n <label>\n {t('user:Location')}:\n <input\n name=\"location\"\n className=\"form-control input-lg\"\n type=\"text\"\n value={formData.location}\n onChange={e => this.handleFormChange(e)}\n />\n </label>\n </div>\n <div className=\"form-group\">\n <label>\n {t('user:Bio')}:\n <textarea\n name=\"bio\"\n className=\"form-control input-lg\"\n maxLength=\"200\"\n value={formData.bio}\n onChange={e => this.handleFormChange(e)}\n />\n </label>\n </div>\n <div className=\"form-group\">\n <label>\n {t('user:Language')}:\n <select\n name=\"language\"\n className=\"form-control input-lg\"\n value={formData.language}\n onChange={e => this.handleFormChange(e)}\n >\n {languages.map(lang => (\n <option value={lang.name} key={lang.name}>\n {lang.name}\n </option>\n ))}\n </select>\n </label>\n </div>\n <div className=\"form-group\">\n <label>\n {t('user:Timezone')}:\n <TimezonePicker\n className=\"form-control timezone-custom\"\n onChange={tz => {\n const e = {\n target: {\n name: 'timezone',\n value: tz ? tz : 'Europe/Paris',\n },\n }\n this.handleFormChange(e)\n }}\n value={formData.timezone}\n />\n </label>\n </div>\n <div className=\"form-group\">\n <label>\n {t('user:First day of week')}:\n <select\n name=\"weekm\"\n className=\"form-control input-lg\"\n value={formData.weekm ? 'Monday' : 'Sunday'}\n onChange={e => this.handleFormChange(e)}\n >\n <option value=\"Sunday\">\n {t('user:Sunday')}\n </option>\n <option value=\"Monday\">\n {t('user:Monday')}\n </option>\n </select>\n </label>\n </div>\n <button type=\"submit\" className=\"btn btn-primary\">\n {t('common:Submit')}\n </button>\n <button\n className=\"btn btn-danger\"\n onClick={event => {\n event.preventDefault()\n this.displayModal(true)\n }}\n >\n {t('user:Delete my account')}\n </button>\n <button\n type=\"submit\"\n className=\"btn btn-secondary\"\n onClick={() => history.push('/profile')}\n >\n {t('common:Cancel')}\n </button>\n </form>\n <Message message={message} t={t} />\n </div>\n </div>\n </div>\n </div>\n </div>\n <div className=\"col-md-2\" />\n </div>\n </div>\n )}\n </div>\n )\n }\n}\n\nexport default withTranslation()(\n connect(\n state => ({\n location: state.router.location,\n message: state.message,\n user: state.user,\n }),\n dispatch => ({\n onDeleteUser: username => {\n dispatch(deleteUser(username))\n },\n onHandleProfileFormSubmit: formData => {\n dispatch(handleProfileFormSubmit(formData))\n },\n })\n )(ProfileEdit)\n)\n","import {\n endOfMonth,\n endOfWeek,\n endOfYear,\n startOfMonth,\n startOfYear,\n startOfWeek,\n addMonths,\n addWeeks,\n addYears,\n subMonths,\n subWeeks,\n subYears,\n} from 'date-fns'\nimport React from 'react'\nimport { Helmet } from 'react-helmet'\nimport { withTranslation } from 'react-i18next'\nimport { connect } from 'react-redux'\n\nimport NoWorkouts from '../Common/NoWorkouts'\nimport Stats from '../Common/Stats'\nimport { workoutColors, translateSports } from '../../utils/workouts'\n\nconst durations = ['week', 'month', 'year']\n\nclass Statistics extends React.Component {\n constructor(props, context) {\n super(props, context)\n const date = new Date()\n this.state = {\n displayedSports: props.sports.map(sport => sport.id),\n statsParams: {\n start: startOfMonth(subMonths(date, 11)),\n end: endOfMonth(date),\n duration: 'month',\n type: 'by_time',\n },\n }\n }\n\n componentDidUpdate(prevProps) {\n if (this.props.sports !== prevProps.sports) {\n this.updateDisplayedSports()\n }\n }\n\n updateDisplayedSports() {\n const { sports } = this.props\n this.setState({ displayedSports: sports.map(sport => sport.id) })\n }\n\n handleOnChangeDuration(e) {\n const duration = e.target.name\n\n const date = new Date()\n const start =\n duration === 'year'\n ? startOfYear(subYears(date, 9))\n : duration === 'week'\n ? startOfMonth(subMonths(date, 2))\n : startOfMonth(subMonths(date, 11))\n const end =\n duration === 'year'\n ? endOfYear(date)\n : duration === 'week'\n ? endOfWeek(date)\n : endOfMonth(date)\n this.setState({ statsParams: { duration, end, start, type: 'by_time' } })\n }\n\n handleOnChangeSports(sportId) {\n const { displayedSports } = this.state\n if (displayedSports.includes(sportId)) {\n this.setState({\n displayedSports: displayedSports.filter(s => s !== sportId),\n })\n } else {\n this.setState({ displayedSports: displayedSports.concat([sportId]) })\n }\n }\n\n handleOnClickArrows(forward) {\n const { start, end, duration } = this.state.statsParams\n let newStart, newEnd\n if (forward) {\n newStart =\n duration === 'year'\n ? startOfYear(subYears(start, 1))\n : duration === 'week'\n ? startOfWeek(subWeeks(start, 1))\n : startOfMonth(subMonths(start, 1))\n newEnd =\n duration === 'year'\n ? endOfYear(subYears(end, 1))\n : duration === 'week'\n ? endOfWeek(subWeeks(end, 1))\n : endOfMonth(subMonths(end, 1))\n } else {\n newStart =\n duration === 'year'\n ? startOfYear(addYears(start, 1))\n : duration === 'week'\n ? startOfWeek(addWeeks(start, 1))\n : startOfMonth(addMonths(start, 1))\n newEnd =\n duration === 'year'\n ? endOfYear(addYears(end, 1))\n : duration === 'week'\n ? endOfWeek(addWeeks(end, 1))\n : endOfMonth(addMonths(end, 1))\n }\n this.setState({\n statsParams: { duration, end: newEnd, start: newStart, type: 'by_time' },\n })\n }\n\n render() {\n const { displayedSports, statsParams } = this.state\n const { sports, t, user } = this.props\n const translatedSports = translateSports(\n sports.filter(sport => user.sports_list.includes(sport.id)),\n t\n )\n return (\n <>\n <Helmet>\n <title>FitTrackee - {t('statistics:Statistics')}</title>\n </Helmet>\n <div className=\"container dashboard\">\n <div className=\"card workout-card\">\n <div className=\"card-header\">{t('statistics:Statistics')}</div>\n <div\n className={`card-body${\n user.nb_workouts === 0 ? ' stats-disabled' : ''\n }`}\n >\n <div className=\"chart-filters row\">\n <div className=\"col chart-arrows\">\n <p className=\"text-center\">\n <i\n className=\"fa fa-chevron-left\"\n aria-hidden=\"true\"\n onClick={() => this.handleOnClickArrows(true)}\n />\n </p>\n </div>\n <div className=\"col-md-3 time-frames justify-content-around\">\n {durations.map(d => (\n <div className=\"time-frame\" key={d}>\n <label>\n <input\n type=\"radio\"\n id={d}\n name={d}\n checked={d === statsParams.duration}\n onChange={e => this.handleOnChangeDuration(e)}\n />\n <span>{t(`statistics:${d}`)}</span>\n </label>\n </div>\n ))}\n </div>\n <div className=\"col chart-arrows\">\n <p className=\"text-center\">\n <i\n className=\"fa fa-chevron-right\"\n aria-hidden=\"true\"\n onClick={() => this.handleOnClickArrows(false)}\n />\n </p>\n </div>\n </div>\n <Stats\n displayEmpty\n displayedSports={displayedSports}\n statsParams={statsParams}\n t={t}\n />\n <div className=\"row chart-workouts\">\n {translatedSports.map(sport => (\n <label className=\"col workout-label\" key={sport.id}>\n <input\n type=\"checkbox\"\n checked={displayedSports.includes(sport.id)}\n name={sport.label}\n onChange={() => this.handleOnChangeSports(sport.id)}\n />\n <span style={{ color: workoutColors[sport.id - 1] }}>\n {` ${sport.label}`}\n </span>\n </label>\n ))}\n </div>\n </div>\n </div>\n {user.nb_workouts === 0 && <NoWorkouts t={t} />}\n </div>\n </>\n )\n }\n}\n\nexport default withTranslation()(\n connect(state => ({\n sports: state.sports.data,\n user: state.user,\n }))(Statistics)\n)\n","import React from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { Helmet } from 'react-helmet'\nimport { Link } from 'react-router-dom'\n\nimport { history } from '../../index'\n\nexport default function Form(props) {\n const { t } = useTranslation()\n const pageTitle = `user:${props.formType\n .charAt(0)\n .toUpperCase()}${props.formType.slice(1)}`\n return (\n <div>\n <Helmet>\n <title>FitTrackee - {t(`user:${props.formType}`)}</title>\n </Helmet>\n <h1 className=\"page-title\">{t(pageTitle)}</h1>\n <div className=\"container\">\n <div className=\"row\">\n <div className=\"col-md-3\" />\n <div className=\"col-md-6\">\n <br />\n {props.formType === 'register' && !props.isRegistrationAllowed ? (\n <div className=\"card\">\n <div className=\"card-body\">Registration is disabled.</div>\n <div className=\"card-body\">\n <button\n type=\"submit\"\n className=\"btn btn-secondary btn-lg btn-block\"\n onClick={() => history.go(-1)}\n >\n Back\n </button>\n </div>\n </div>\n ) : (\n <>\n <form\n onSubmit={event =>\n props.handleUserFormSubmit(event, props.formType)\n }\n >\n {props.formType === 'register' && (\n <div className=\"form-group\">\n <input\n className=\"form-control input-lg\"\n name=\"username\"\n placeholder={t('user:Enter a username')}\n required\n type=\"text\"\n value={props.userForm.username}\n onChange={props.onHandleFormChange}\n />\n </div>\n )}\n {props.formType !== 'password reset' && (\n <div className=\"form-group\">\n <input\n className=\"form-control input-lg\"\n name=\"email\"\n placeholder={t('user:Enter an email address')}\n required\n type=\"email\"\n value={props.userForm.email}\n onChange={props.onHandleFormChange}\n />\n </div>\n )}\n {props.formType !== 'reset your password' && (\n <>\n <div className=\"form-group\">\n <input\n className=\"form-control input-lg\"\n name=\"password\"\n placeholder={t('user:Enter a password')}\n required\n type=\"password\"\n value={props.userForm.password}\n onChange={props.onHandleFormChange}\n />\n </div>\n {props.formType !== 'login' && (\n <div className=\"form-group\">\n <input\n className=\"form-control input-lg\"\n name=\"password_conf\"\n placeholder={t(\n 'user:Enter the password confirmation'\n )}\n required\n type=\"password\"\n value={props.userForm.password_conf}\n onChange={props.onHandleFormChange}\n />\n </div>\n )}\n </>\n )}\n <input\n type=\"submit\"\n className=\"btn btn-primary btn-lg btn-block\"\n value={t('Submit')}\n />\n </form>\n <p className=\"password-forget\">\n {props.formType === 'login' && (\n <Link\n to={{\n pathname: '/password-reset/request',\n }}\n >\n {t('user:Forgot password?')}\n </Link>\n )}\n </p>\n </>\n )}\n </div>\n <div className=\"col-md-3\" />\n </div>\n </div>\n </div>\n )\n}\n","import React from 'react'\nimport { withTranslation } from 'react-i18next'\nimport { connect } from 'react-redux'\nimport { Redirect } from 'react-router-dom'\n\nimport Form from './Form'\nimport Message from '../Common/Message'\nimport { handleUserFormSubmit } from '../../actions/user'\nimport { isLoggedIn } from '../../utils'\n\nclass UserForm extends React.Component {\n constructor(props, context) {\n super(props, context)\n this.state = {\n formData: {\n username: '',\n email: '',\n password: '',\n password_conf: '',\n },\n }\n }\n\n componentDidUpdate(prevProps) {\n if (prevProps.location.pathname !== this.props.location.pathname) {\n this.emptyForm()\n }\n }\n\n emptyForm() {\n const { formData } = this.state\n Object.keys(formData).map(k => (formData[k] = ''))\n this.setState(formData)\n }\n\n onHandleFormChange(e) {\n const { formData } = this.state\n formData[e.target.name] = e.target.value\n this.setState(formData)\n }\n\n render() {\n const {\n formType,\n isRegistrationAllowed,\n message,\n messages,\n onHandleUserFormSubmit,\n t,\n } = this.props\n const { formData } = this.state\n const { token } = this.props.location.query\n return (\n <div>\n {isLoggedIn() || (formType === 'password reset' && !token) ? (\n <Redirect to=\"/\" />\n ) : (\n <div>\n <Message message={message} messages={messages} t={t} />\n <Form\n isRegistrationAllowed={isRegistrationAllowed}\n formType={formType}\n userForm={formData}\n onHandleFormChange={event => this.onHandleFormChange(event)}\n handleUserFormSubmit={event => {\n event.preventDefault()\n if (formType === 'password reset') {\n formData.token = token\n }\n onHandleUserFormSubmit(formData, formType)\n }}\n />\n </div>\n )}\n </div>\n )\n }\n}\nexport default withTranslation()(\n connect(\n state => ({\n isRegistrationAllowed: state.application.config.is_registration_enabled,\n location: state.router.location,\n message: state.message,\n messages: state.messages,\n }),\n dispatch => ({\n onHandleUserFormSubmit: (formData, formType) => {\n formType =\n formType === 'password reset'\n ? 'password/update'\n : formType === 'reset your password'\n ? 'password/reset-request'\n : formType\n dispatch(handleUserFormSubmit(formData, formType))\n },\n })\n )(UserForm)\n)\n","import React from 'react'\nimport { withTranslation } from 'react-i18next'\nimport { connect } from 'react-redux'\n\nimport CustomModal from '../Common/CustomModal'\nimport ProfileDetail from './ProfileDetail'\nimport { getOrUpdateData } from '../../actions'\nimport { deleteUser } from '../../actions/user'\n\nclass UserProfile extends React.Component {\n constructor(props, context) {\n super(props, context)\n this.state = {\n displayModal: false,\n }\n }\n\n componentDidMount() {\n this.props.loadUser(this.props.match.params.userName)\n }\n\n componentDidUpdate(prevProps) {\n if (prevProps.match.params.userName !== this.props.match.params.userName) {\n this.props.loadUser(this.props.match.params.userName)\n }\n }\n\n displayModal(value) {\n this.setState(prevState => ({\n ...prevState,\n displayModal: value,\n }))\n }\n\n render() {\n const { t, currentUser, onDeleteUser, users } = this.props\n const { displayModal } = this.state\n const [user] = users\n const editable = user ? currentUser.username === user.username : false\n return (\n <div>\n {displayModal && (\n <CustomModal\n title={t('common:Confirmation')}\n text={t(\n 'user:Are you sure you want to delete this account? ' +\n 'All data will be deleted, this cannot be undone.'\n )}\n confirm={() => {\n onDeleteUser(user.username)\n this.displayModal(false)\n }}\n close={() => this.displayModal(false)}\n />\n )}\n {user && (\n <ProfileDetail\n editable={editable}\n isDeletable={currentUser.admin && !editable}\n onDeleteUser={onDeleteUser}\n displayModal={e => this.displayModal(e)}\n t={t}\n user={user}\n />\n )}\n </div>\n )\n }\n}\n\nexport default withTranslation()(\n connect(\n state => ({\n currentUser: state.user,\n users: state.users.data,\n }),\n dispatch => ({\n onDeleteUser: username => {\n dispatch(deleteUser(username, true))\n },\n loadUser: userName => {\n dispatch(getOrUpdateData('getData', 'users', { username: userName }))\n },\n })\n )(UserProfile)\n)\n","import React from 'react'\nimport { connect } from 'react-redux'\nimport { Route, Switch } from 'react-router-dom'\n\nimport './App.css'\nimport Admin from './Admin'\nimport Workout from './Workout'\nimport Workouts from './Workouts'\nimport CurrentUserProfile from './User/CurrentUserProfile'\nimport Dashboard from './Dashboard'\nimport Footer from './Footer'\nimport Logout from './User/Logout'\nimport NavBar from './NavBar'\nimport NotFound from './Others/NotFound'\nimport PasswordReset from './User/PasswordReset'\nimport ProfileEdit from './User/ProfileEdit'\nimport Statistics from './Statistics'\nimport UserForm from './User/UserForm'\nimport UserProfile from './User/UserProfile'\nimport { getAppData } from '../actions/application'\n\nclass App extends React.Component {\n constructor(props) {\n super(props)\n this.props = props\n }\n componentDidMount() {\n this.props.loadAppConfig()\n }\n\n render() {\n return (\n <div className=\"App\">\n <NavBar />\n <Switch>\n <Route exact path=\"/\" component={Dashboard} />\n <Route\n exact\n path=\"/register\"\n render={() => <UserForm formType={'register'} />}\n />\n <Route\n exact\n path=\"/login\"\n render={() => <UserForm formType={'login'} />}\n />\n <Route\n exact\n path=\"/password-reset\"\n render={() => <UserForm formType={'password reset'} />}\n />\n <Route\n exact\n path=\"/password-reset/request\"\n render={() => <UserForm formType={'reset your password'} />}\n />\n <Route\n exact\n path=\"/password-reset/sent\"\n render={() => <PasswordReset action={'sent'} />}\n />\n <Route\n exact\n path=\"/updated-password\"\n render={() => <PasswordReset action={'updated'} />}\n />\n <Route exact path=\"/password-reset/sent\" component={PasswordReset} />\n <Route exact path=\"/logout\" component={Logout} />\n <Route exact path=\"/profile/edit\" component={ProfileEdit} />\n <Route exact path=\"/profile\" component={CurrentUserProfile} />\n <Route exact path=\"/workouts/history\" component={Workouts} />\n <Route exact path=\"/workouts/statistics\" component={Statistics} />\n <Route exact path=\"/users/:userName\" component={UserProfile} />\n <Route path=\"/workouts\" component={Workout} />\n <Route path=\"/admin\" component={Admin} />\n <Route component={NotFound} />\n </Switch>\n <Footer />\n </div>\n )\n }\n}\nexport default connect(\n () => ({}),\n dispatch => ({\n loadAppConfig: () => {\n dispatch(getAppData('config'))\n },\n })\n)(App)\n","import React from 'react'\nimport { Provider } from 'react-redux'\nimport { ConnectedRouter } from 'connected-react-router'\n\nexport default function Root({ store, history, children }) {\n return (\n <Provider store={store}>\n <ConnectedRouter history={history}>{children}</ConnectedRouter>\n </Provider>\n )\n}\n","// In production, we register a service worker to serve assets from local cache.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on the \"N+1\" visit to a page, since previously\n// cached resources are updated in the background.\n\n// To learn more about the benefits of this model, read https://goo.gl/KwvDNy.\n// This link also includes instructions on opting out of this behavior.\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.1/8 is considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n)\n\nexport default function register() {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location)\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets;\n // see https://github.com/facebookincubator/create-react-app/issues/2374\n return\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`\n\n if (isLocalhost) {\n // This is running on localhost.\n // Lets check if a service worker still exists or not.\n checkValidServiceWorker(swUrl)\n } else {\n // Is not local host. Just register service worker\n registerValidSW(swUrl)\n }\n })\n }\n}\n\nfunction registerValidSW(swUrl) {\n navigator.serviceWorker\n .register(swUrl)\n .then(registration => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the old content will have been purged and\n // the fresh content will have been added to the cache.\n // It's the perfect time to display a \"New content is\n // available; please refresh.\" message in your web app.\n // eslint-disable-next-line no-console\n console.log('New content is available; please refresh.')\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n // eslint-disable-next-line no-console\n console.log('Content is cached for offline use.')\n }\n }\n }\n }\n })\n .catch(error => {\n console.error('Error during service worker registration:', error)\n })\n}\n\nfunction checkValidServiceWorker(swUrl) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl)\n .then(response => {\n // Ensure service worker exists, and that we really are getting a JS file.\n if (\n response.status === 404 ||\n response.headers.get('content-type').indexOf('javascript') === -1\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister().then(() => {\n window.location.reload()\n })\n })\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl)\n }\n })\n .catch(() => {\n // eslint-disable-next-line no-console\n console.log(\n 'No internet connection found. App is running in offline mode.'\n )\n })\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister()\n })\n }\n}\n","const emptyData = {\n data: [],\n}\n\nexport default {\n language: 'en',\n message: '',\n messages: [],\n user: {\n isAuthenticated: false,\n },\n workouts: {\n ...emptyData,\n },\n application: {\n statistics: {},\n config: {\n gpx_limit_import: null,\n is_registration_enabled: null,\n max_single_file_size: null,\n max_users: null,\n max_zip_file_size: null,\n registration: null,\n },\n },\n calendarWorkouts: {\n ...emptyData,\n },\n chartData: [],\n // check if storing gpx content is OK\n gpx: null,\n loading: false,\n records: {\n ...emptyData,\n },\n sports: {\n ...emptyData,\n },\n statistics: {\n data: {},\n },\n users: {\n ...emptyData,\n },\n}\n","import { connectRouter } from 'connected-react-router'\nimport { combineReducers } from 'redux'\n\nimport initial from './initial'\n\nconst handleDataAndError = (state, type, action) => {\n if (action.target !== type) {\n return state\n }\n if (action.type === 'SET_DATA') {\n return {\n ...state,\n data: action.data[action.target],\n }\n }\n if (action.type === 'SET_PAGINATED_DATA') {\n return {\n ...state,\n data: action.data[action.target],\n pagination: action.pagination,\n }\n }\n return state\n}\n\nconst workouts = (state = initial.workouts, action) => {\n switch (action.type) {\n case 'LOGOUT':\n return initial.workouts\n case 'PUSH_WORKOUTS':\n return {\n ...state,\n data: state.data.concat(action.workouts),\n }\n case 'REMOVE_WORKOUT':\n return {\n ...state,\n data: state.data.filter(workout => workout.id !== action.workoutId),\n }\n default:\n return handleDataAndError(state, 'workouts', action)\n }\n}\n\nconst application = (state = initial.application, action) => {\n if (action.type === 'SET_APP_CONFIG') {\n return {\n ...state,\n config: action.data,\n }\n }\n if (action.type === 'SET_APP_STATS') {\n return {\n ...state,\n statistics: action.data,\n }\n }\n return state\n}\n\nconst calendarWorkouts = (state = initial.calendarWorkouts, action) => {\n switch (action.type) {\n case 'LOGOUT':\n return initial.calendarWorkouts\n case 'UPDATE_CALENDAR':\n return {\n ...state,\n data: action.workouts,\n }\n default:\n return handleDataAndError(state, 'calendarWorkouts', action)\n }\n}\n\nconst chartData = (state = initial.chartData, action) => {\n if (action.type === 'SET_CHART_DATA') {\n return action.chartData\n }\n return state\n}\n\nconst gpx = (state = initial.gpx, action) => {\n if (action.type === 'SET_GPX') {\n return action.gpxContent\n }\n return state\n}\n\nconst language = (state = initial.language, action) => {\n if (action.type === 'SET_LANGUAGE') {\n return action.language\n }\n return state\n}\n\nconst loading = (state = initial.loading, action) => {\n if (action.type === 'SET_LOADING') {\n return action.loading\n }\n return state\n}\n\nconst message = (state = initial.message, action) => {\n switch (action.type) {\n case 'AUTH_ERROR':\n case 'PROFILE_ERROR':\n case 'PROFILE_UPDATE_ERROR':\n case 'PICTURE_ERROR':\n case 'SET_ERROR':\n return action.message\n case 'CLEAN_ALL_MESSAGES':\n case 'LOGOUT':\n case 'PROFILE_SUCCESS':\n case 'SET_APP_CONFIG':\n case 'SET_RESULTS':\n case '@@router/LOCATION_CHANGE':\n return ''\n default:\n return state\n }\n}\n\nconst messages = (state = initial.messages, action) => {\n switch (action.type) {\n case 'AUTH_ERRORS':\n case 'APP_ERRORS':\n return action.messages\n case 'CLEAN_ALL_MESSAGES':\n case 'LOGOUT':\n case 'PROFILE_SUCCESS':\n case '@@router/LOCATION_CHANGE':\n return []\n default:\n return state\n }\n}\n\nconst records = (state = initial.records, action) => {\n if (action.type === 'LOGOUT') {\n return initial.records\n }\n return handleDataAndError(state, 'records', action)\n}\n\nconst sports = (state = initial.sports, action) => {\n if (action.type === 'UPDATE_SPORT_DATA') {\n return {\n ...state,\n data: state.data.map(sport => {\n if (sport.id === action.data.id) {\n sport.is_active = action.data.is_active\n }\n return sport\n }),\n }\n }\n return handleDataAndError(state, 'sports', action)\n}\n\nconst users = (state = initial.users, action) => {\n if (action.type === 'UPDATE_USER_DATA') {\n return {\n ...state,\n data: state.data.map(user => {\n if (user.username === action.data.username) {\n user.admin = action.data.admin\n }\n return user\n }),\n }\n }\n return handleDataAndError(state, 'users', action)\n}\n\nconst user = (state = initial.user, action) => {\n switch (action.type) {\n case 'AUTH_ERROR':\n case 'PROFILE_ERROR':\n case 'LOGOUT':\n window.localStorage.removeItem('authToken')\n return initial.user\n case 'PROFILE_SUCCESS':\n return action.profil\n default:\n return state\n }\n}\n\nconst statistics = (state = initial.statistics, action) => {\n if (action.type === 'LOGOUT') {\n return initial.statistics\n }\n return handleDataAndError(state, 'statistics', action)\n}\n\nexport default history =>\n combineReducers({\n workouts,\n application,\n calendarWorkouts,\n chartData,\n gpx,\n language,\n loading,\n message,\n messages,\n records,\n router: connectRouter(history),\n sports,\n statistics,\n user,\n users,\n })\n","const routesWithoutAuthentication = [\n '/login',\n '/register',\n '/password-reset',\n '/password-reset/request',\n '/password-reset/sent',\n '/updated-password',\n]\n\nconst updatePath = (toPath, newPath) => {\n if (typeof toPath === 'string' || toPath instanceof String) {\n toPath = newPath\n } else {\n toPath.pathname = newPath\n }\n return toPath\n}\n\nconst pathInterceptor = toPath => {\n if (\n !window.localStorage.authToken &&\n !routesWithoutAuthentication.includes(toPath.pathname)\n ) {\n toPath = updatePath(toPath, '/login')\n }\n if (\n window.localStorage.authToken &&\n routesWithoutAuthentication.includes(toPath.pathname)\n ) {\n toPath = updatePath(toPath, '/')\n }\n return toPath\n}\n\nexport const historyEnhancer = originalHistory => {\n originalHistory.location = pathInterceptor(originalHistory.location)\n return {\n ...originalHistory,\n push: (path, ...args) =>\n originalHistory.push(pathInterceptor(path), ...args),\n replace: (path, ...args) =>\n originalHistory.replace(pathInterceptor(path), ...args),\n }\n}\n","/* eslint-disable react/jsx-filename-extension */\nimport { createBrowserHistory } from 'history'\nimport React from 'react'\nimport { I18nextProvider } from 'react-i18next'\nimport ReactDOM from 'react-dom'\nimport { routerMiddleware } from 'connected-react-router'\nimport { applyMiddleware, compose, createStore } from 'redux'\nimport thunk from 'redux-thunk'\n\nimport i18n from './i18n'\nimport App from './components/App'\nimport Root from './components/Root'\nimport registerServiceWorker from './registerServiceWorker'\nimport createRootReducer from './reducers'\nimport { loadProfile } from './actions/user'\nimport { historyEnhancer } from './utils/history'\n\nexport const history = historyEnhancer(createBrowserHistory())\n\nhistory.listen(() => {\n window.scrollTo(0, 0)\n})\n\nexport const rootNode = document.getElementById('root')\n\nexport const store = createStore(\n createRootReducer(history),\n window.__STATE__, // Server state\n (window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose)(\n applyMiddleware(routerMiddleware(history), thunk)\n )\n)\n\nif (window.localStorage.authToken !== null) {\n store.dispatch(loadProfile())\n}\n\nReactDOM.render(\n <Root store={store} history={history}>\n <I18nextProvider i18n={i18n}>\n <App />\n </I18nextProvider>\n </Root>,\n rootNode\n)\nregisterServiceWorker()\n"],"sourceRoot":""}