diff --git a/VERSION b/VERSION index ef52a648..f9056827 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.4.6 +0.4.7 diff --git a/docs/.buildinfo b/docs/.buildinfo index 5abef9ed..186b47f5 100644 --- a/docs/.buildinfo +++ b/docs/.buildinfo @@ -1,4 +1,4 @@ # Sphinx build info version 1 # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: 59f40d0441f81e30af406562b2ac47c5 +config: d49f7bbcf1ff39f8ffb8e2d9167800e5 tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/docs/_images/fittrackee_screenshot-01.png b/docs/_images/fittrackee_screenshot-01.png index c90c5364..c66a98b4 100644 Binary files a/docs/_images/fittrackee_screenshot-01.png and b/docs/_images/fittrackee_screenshot-01.png differ diff --git a/docs/_images/fittrackee_screenshot-02.png b/docs/_images/fittrackee_screenshot-02.png index 01fe0ddf..8063d92f 100644 Binary files a/docs/_images/fittrackee_screenshot-02.png and b/docs/_images/fittrackee_screenshot-02.png differ diff --git a/docs/_images/fittrackee_screenshot-03.png b/docs/_images/fittrackee_screenshot-03.png index 328faa27..b588c520 100644 Binary files a/docs/_images/fittrackee_screenshot-03.png and b/docs/_images/fittrackee_screenshot-03.png differ diff --git a/docs/_images/fittrackee_screenshot-04.png b/docs/_images/fittrackee_screenshot-04.png index 2df02eb3..36d627f0 100644 Binary files a/docs/_images/fittrackee_screenshot-04.png and b/docs/_images/fittrackee_screenshot-04.png differ diff --git a/docs/_images/fittrackee_screenshot-05.png b/docs/_images/fittrackee_screenshot-05.png index 97b8b85a..6a0418cf 100644 Binary files a/docs/_images/fittrackee_screenshot-05.png and b/docs/_images/fittrackee_screenshot-05.png differ diff --git a/docs/_static/documentation_options.js b/docs/_static/documentation_options.js index 69419592..c283a048 100644 --- a/docs/_static/documentation_options.js +++ b/docs/_static/documentation_options.js @@ -1,6 +1,6 @@ var DOCUMENTATION_OPTIONS = { URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), - VERSION: '0.4.6', + VERSION: '0.4.7', LANGUAGE: 'None', COLLAPSE_INDEX: false, BUILDER: 'html', diff --git a/docs/api/auth.html b/docs/api/auth.html index 5ddefb5b..2d4d076e 100644 --- a/docs/api/auth.html +++ b/docs/api/auth.html @@ -5,7 +5,7 @@ - Authentication — FitTrackee 0.4.6 + <title>Authentication — FitTrackee 0.4.7 documentation @@ -40,7 +40,7 @@ FitTrackee - 0.4.6 + 0.4.7 diff --git a/docs/api/configuration.html b/docs/api/configuration.html index a5a24aac..ab85ccef 100644 --- a/docs/api/configuration.html +++ b/docs/api/configuration.html @@ -5,7 +5,7 @@ - Configuration — FitTrackee 0.4.6 + <title>Configuration — FitTrackee 0.4.7 documentation @@ -40,7 +40,7 @@ FitTrackee - 0.4.6 + 0.4.7 diff --git a/docs/api/index.html b/docs/api/index.html index 7fcd2467..bfc575d4 100644 --- a/docs/api/index.html +++ b/docs/api/index.html @@ -5,7 +5,7 @@ - API documentation — FitTrackee 0.4.6 + <title>API documentation — FitTrackee 0.4.7 documentation @@ -40,7 +40,7 @@ FitTrackee - 0.4.6 + 0.4.7 diff --git a/docs/api/records.html b/docs/api/records.html index 977afe87..65a3be61 100644 --- a/docs/api/records.html +++ b/docs/api/records.html @@ -5,7 +5,7 @@ - Records — FitTrackee 0.4.6 + <title>Records — FitTrackee 0.4.7 documentation @@ -40,7 +40,7 @@ FitTrackee - 0.4.6 + 0.4.7 diff --git a/docs/api/sports.html b/docs/api/sports.html index cfadddf4..32122078 100644 --- a/docs/api/sports.html +++ b/docs/api/sports.html @@ -5,7 +5,7 @@ - Sports — FitTrackee 0.4.6 + <title>Sports — FitTrackee 0.4.7 documentation @@ -40,7 +40,7 @@ FitTrackee - 0.4.6 + 0.4.7 diff --git a/docs/api/stats.html b/docs/api/stats.html index ad581ad3..acbfa4e2 100644 --- a/docs/api/stats.html +++ b/docs/api/stats.html @@ -5,7 +5,7 @@ - Statistics — FitTrackee 0.4.6 + <title>Statistics — FitTrackee 0.4.7 documentation @@ -40,7 +40,7 @@ FitTrackee - 0.4.6 + 0.4.7 diff --git a/docs/api/users.html b/docs/api/users.html index 3c7d652e..7aecb12e 100644 --- a/docs/api/users.html +++ b/docs/api/users.html @@ -5,7 +5,7 @@ - Users — FitTrackee 0.4.6 + <title>Users — FitTrackee 0.4.7 documentation @@ -40,7 +40,7 @@ FitTrackee - 0.4.6 + 0.4.7 diff --git a/docs/api/workouts.html b/docs/api/workouts.html index ba4ccda3..4d72b1ee 100644 --- a/docs/api/workouts.html +++ b/docs/api/workouts.html @@ -5,7 +5,7 @@ - Workouts — FitTrackee 0.4.6 + <title>Workouts — FitTrackee 0.4.7 documentation @@ -40,7 +40,7 @@ FitTrackee - 0.4.6 + 0.4.7 diff --git a/docs/changelog.html b/docs/changelog.html index 5c314047..343eb7af 100644 --- a/docs/changelog.html +++ b/docs/changelog.html @@ -5,7 +5,7 @@ - Change log — FitTrackee 0.4.6 + <title>Change log — FitTrackee 0.4.7 documentation @@ -39,7 +39,7 @@ FitTrackee - 0.4.6 + 0.4.7 diff --git a/docs/features.html b/docs/features.html index 1b5ef6a3..b3968f2e 100644 --- a/docs/features.html +++ b/docs/features.html @@ -5,7 +5,7 @@ - Features — FitTrackee 0.4.6 + <title>Features — FitTrackee 0.4.7 documentation @@ -40,7 +40,7 @@ FitTrackee - 0.4.6 + 0.4.7 diff --git a/docs/genindex.html b/docs/genindex.html index 5f577790..5348a338 100644 --- a/docs/genindex.html +++ b/docs/genindex.html @@ -4,7 +4,7 @@ - Index — FitTrackee 0.4.6 + <title>Index — FitTrackee 0.4.7 documentation @@ -37,7 +37,7 @@ FitTrackee - 0.4.6 + 0.4.7 diff --git a/docs/http-routingtable.html b/docs/http-routingtable.html index a7fb2bcd..3de4afe6 100644 --- a/docs/http-routingtable.html +++ b/docs/http-routingtable.html @@ -4,7 +4,7 @@ - HTTP Routing Table — FitTrackee 0.4.6 + <title>HTTP Routing Table — FitTrackee 0.4.7 documentation @@ -44,7 +44,7 @@ FitTrackee - 0.4.6 + 0.4.7 diff --git a/docs/index.html b/docs/index.html index 841a4838..6486ed4e 100644 --- a/docs/index.html +++ b/docs/index.html @@ -5,7 +5,7 @@ - FitTrackee — FitTrackee 0.4.6 + <title>FitTrackee — FitTrackee 0.4.7 documentation @@ -39,7 +39,7 @@ FitTrackee - 0.4.6 + 0.4.7 diff --git a/docs/installation.html b/docs/installation.html index 9eba2e9c..b2067856 100644 --- a/docs/installation.html +++ b/docs/installation.html @@ -5,7 +5,7 @@ - Installation — FitTrackee 0.4.6 + <title>Installation — FitTrackee 0.4.7 documentation @@ -40,7 +40,7 @@ FitTrackee - 0.4.6 + 0.4.7 diff --git a/docs/objects.inv b/docs/objects.inv index 5986cc2e..086068bf 100644 Binary files a/docs/objects.inv and b/docs/objects.inv differ diff --git a/docs/search.html b/docs/search.html index d7c20a34..8b05062b 100644 --- a/docs/search.html +++ b/docs/search.html @@ -4,7 +4,7 @@ - Search — FitTrackee 0.4.6 + <title>Search — FitTrackee 0.4.7 documentation @@ -43,7 +43,7 @@ FitTrackee - 0.4.6 + 0.4.7 diff --git a/docs/troubleshooting/administrator.html b/docs/troubleshooting/administrator.html index e8b3e377..60c678e2 100644 --- a/docs/troubleshooting/administrator.html +++ b/docs/troubleshooting/administrator.html @@ -5,7 +5,7 @@ - Administrator — FitTrackee 0.4.6 + <title>Administrator — FitTrackee 0.4.7 documentation @@ -40,7 +40,7 @@ FitTrackee - 0.4.6 + 0.4.7 diff --git a/docs/troubleshooting/index.html b/docs/troubleshooting/index.html index 55667752..e09b2ff5 100644 --- a/docs/troubleshooting/index.html +++ b/docs/troubleshooting/index.html @@ -5,7 +5,7 @@ - Troubleshooting — FitTrackee 0.4.6 + <title>Troubleshooting — FitTrackee 0.4.7 documentation @@ -40,7 +40,7 @@ FitTrackee - 0.4.6 + 0.4.7 diff --git a/docs/troubleshooting/user.html b/docs/troubleshooting/user.html index b16fbf69..d802a586 100644 --- a/docs/troubleshooting/user.html +++ b/docs/troubleshooting/user.html @@ -5,7 +5,7 @@ - User — FitTrackee 0.4.6 + <title>User — FitTrackee 0.4.7 documentation @@ -40,7 +40,7 @@ FitTrackee - 0.4.6 + 0.4.7 diff --git a/docsrc/source/_images/fittrackee_screenshot-01.png b/docsrc/source/_images/fittrackee_screenshot-01.png index c90c5364..c66a98b4 100644 Binary files a/docsrc/source/_images/fittrackee_screenshot-01.png and b/docsrc/source/_images/fittrackee_screenshot-01.png differ diff --git a/docsrc/source/_images/fittrackee_screenshot-02.png b/docsrc/source/_images/fittrackee_screenshot-02.png index 01fe0ddf..8063d92f 100644 Binary files a/docsrc/source/_images/fittrackee_screenshot-02.png and b/docsrc/source/_images/fittrackee_screenshot-02.png differ diff --git a/docsrc/source/_images/fittrackee_screenshot-03.png b/docsrc/source/_images/fittrackee_screenshot-03.png index 328faa27..b588c520 100644 Binary files a/docsrc/source/_images/fittrackee_screenshot-03.png and b/docsrc/source/_images/fittrackee_screenshot-03.png differ diff --git a/docsrc/source/_images/fittrackee_screenshot-04.png b/docsrc/source/_images/fittrackee_screenshot-04.png index 2df02eb3..36d627f0 100644 Binary files a/docsrc/source/_images/fittrackee_screenshot-04.png and b/docsrc/source/_images/fittrackee_screenshot-04.png differ diff --git a/docsrc/source/_images/fittrackee_screenshot-05.png b/docsrc/source/_images/fittrackee_screenshot-05.png index 97b8b85a..6a0418cf 100644 Binary files a/docsrc/source/_images/fittrackee_screenshot-05.png and b/docsrc/source/_images/fittrackee_screenshot-05.png differ diff --git a/fittrackee/dist/asset-manifest.json b/fittrackee/dist/asset-manifest.json index b13e640c..d4f28cfa 100644 --- a/fittrackee/dist/asset-manifest.json +++ b/fittrackee/dist/asset-manifest.json @@ -1,8 +1,8 @@ { "files": { "main.css": "/static/css/main.8c7e57e2.chunk.css", - "main.js": "/static/js/main.e5a4bcc7.chunk.js", - "main.js.map": "/static/js/main.e5a4bcc7.chunk.js.map", + "main.js": "/static/js/main.06d7be5e.chunk.js", + "main.js.map": "/static/js/main.06d7be5e.chunk.js.map", "runtime-main.js": "/static/js/runtime-main.d0c59338.js", "runtime-main.js.map": "/static/js/runtime-main.d0c59338.js.map", "static/js/2.071b2e29.chunk.js": "/static/js/2.071b2e29.chunk.js", @@ -19,6 +19,6 @@ "static/js/runtime-main.d0c59338.js", "static/js/2.071b2e29.chunk.js", "static/css/main.8c7e57e2.chunk.css", - "static/js/main.e5a4bcc7.chunk.js" + "static/js/main.06d7be5e.chunk.js" ] } \ No newline at end of file diff --git a/fittrackee/dist/index.html b/fittrackee/dist/index.html index 512f9533..72d0f7c5 100644 --- a/fittrackee/dist/index.html +++ b/fittrackee/dist/index.html @@ -1 +1 @@ -FitTrackee
\ No newline at end of file +FitTrackee
\ No newline at end of file diff --git a/fittrackee/dist/static/js/main.e5a4bcc7.chunk.js b/fittrackee/dist/static/js/main.06d7be5e.chunk.js similarity index 99% rename from fittrackee/dist/static/js/main.e5a4bcc7.chunk.js rename to fittrackee/dist/static/js/main.06d7be5e.chunk.js index 4a65a036..c34965ab 100644 --- a/fittrackee/dist/static/js/main.e5a4bcc7.chunk.js +++ b/fittrackee/dist/static/js/main.06d7be5e.chunk.js @@ -1,2 +1,2 @@ -(this.webpackJsonpfittrackee_client=this.webpackJsonpfittrackee_client||[]).push([[0],{206:function(e){e.exports=JSON.parse('{"Workouts":"Workouts","Workout":"Workout","Workout Date":"Workout Date","Add a workout":"Add a workout","Are you sure you want to delete this workout?":"Are you sure you want to delete this workout?","Ave. speed":"Ave. speed","Ascent":"Ascent","Average speed":"Average speed","Chart":"Chart","data from gpx, without any cleaning":"data from gpx, without any cleaning","Date":"Date","Delete workout":"Delete workout","Descent":"Descent","Distance":"Distance","distance":"distance","Duration":"Duration","duration":"duration","Edit a workout":"Edit a workout","Edit workout":"Edit workout","elevation":"elevation","End":"End","Farest distance":"Farest distance","Filter":"Filter","From":"From","gpxFile":"gpx file","Longest duration":"Longest duration","Max. altitude":"Max. altitude","Max. speed":"Max. speed","Min. altitude":"Min. altitude","no folder inside":"no folder inside","files max":"files max","max size":"max size","No data to display":"No data to display","No Map":"No Map","No next workout":"No next workout","No next segment":"No next segment","No notes":"No notes","No previous workout":"No previous workout","No previous segment":"No previous segment","Notes":"Notes","pauses":"pauses","Personal records":"Personal records","See next workout":"See next workout","See next segment":"See next segment","See previous workout":"See previous workout","See previous segment":"See previous segment","segment":"segment","Segments":"Segments","speed":"speed","Start":"Start","Title":"Title","To":"To","total duration":"total duration","with gpx file":"with gpx file","without gpx file":"without gpx file","zipFile":"or zip file containing gpx files"}')},207:function(e){e.exports=JSON.parse('{"Actions":"Actions","Active":"Active","workouts exist":"workouts exist","Add admin rights":"Add admin rights","Add/remove admin rights, delete user account.":"Add/remove admin rights, delete user account.","Administration":"Administration","Application":"Application","Application configuration":"Application configuration","Back":"Back","Disable":"Disable","Enable":"Enable","Enable/disable sports.":"Enable/disable sports.","FitTrackee administration":"FitTrackee administration","id":"id","if 0, no limitation":"if 0, no limitation","Image":"Image","Label":"Label","Max. number of active users":"Max. number of active users","Max. files of zip archive":"Max. files of zip archive","Max. size of uploaded files":"Max. size of uploaded files","Max. size of uploaded files (in Mb)":"Max. size of uploaded files (in Mb)","Max. size of zip archive":"Max. size of zip archive","Max. size of zip archive (in Mb)":"Max. size of zip archive (in Mb)","Registration is currently disabled.":"Registration is currently disabled.","Registration is currently enabled.":"Registration is currently enabled.","Remove admin rights":"Remove admin rights","Sports":"Sports","Update application configuration (maximum number of registered users, maximum files size).":"Update application configuration (maximum number of registered users, maximum files size).","uploads":"uploads","user":"user","Users":"Users","users":"users"}')},208:function(e){e.exports=JSON.parse('{"workouts count":"workouts count","Add workout":"Add workout","admin rights":"admin rights","ascending":"ascending","Back":"Back","Back to home":"Back to home","Cancel":"Cancel","Confirmation":"Confirmation","Dashboard":"Dashboard","descending":"descending","Edit":"Edit","day":"day","days":"days","Next":"Next","No":"No","no":"no","No records.":"No records.","No workouts.":"No workouts.","Page not found":"Page not found","Previous":"Prev","registration date":"registration date","Sort":"Sort","Sort by":"Sort by","Sport":"Sport","sport":"sport","Sports":"Sports","sports":"sports","Statistics":"Statistics","Submit":"Submit","to":"to","user name":"user name","Workout":"Workout","Workouts":"Workouts","workout":"workout","workouts":"workouts","Yes":"Yes","yes":"yes"}')},209:function(e){e.exports=JSON.parse('{"Personal records":"Personal records","This month":"This month","Upload one !":"Upload one !"}')},210:function(e){e.exports=JSON.parse('{"3 to 12 characters required for username.":"3 to 12 characters required for username.","8 characters required for password.":"8 characters required for password.","An error occurred. Please contact the administrator.":"An error occurred. Please contact the administrator.","application":"application","Error during picture deletion.":"Error during picture deletion.","Error during picture update.":"Error during picture update.","Error during picture update, file size exceeds max size.":"Error during picture update, file size exceeds max size.","Error. Registration is disabled.":"Error. Registration is disabled.","Error. Please try again or contact the administrator.":"Error. Please try again or contact the administrator.","File extension not allowed.":"File extension not allowed.","File size is greater than the allowed size":"File size is greater than the allowed size","Incorrect id":"Incorrect id","Invalid credentials.":"Invalid credentials.","Invalid payload.":"Invalid payload.","Invalid token. Please log in again.":"Invalid token. Please log in again.","Max. files in a zip archive must be greater than 0":"Max. files in a zip archive must be greater than 0","Max. size of uploaded files must be greater than 0":"Max. size of uploaded files must be greater than 0","Max. size of zip archive must be equal or greater than max. size of uploaded files":"Max. size of zip archive must be equal or greater than max. size of uploaded files","Max. size of zip archive must be greater than 0":"Max. size of zip archive must be greater than 0","No file part.":"No file part.","No picture.":"No picture.","No selected file.":"No selected file.","no correct file.":"no correct file.","no gpx file for this workout":"no gpx file for this workout","Password and password confirmation don\'t match.":"Password and password confirmation don\'t match.","Provide a valid auth token":"Provide a valid auth token","records":"records","Signature expired. Please log in again.":"Signature expired. Please log in again.","Sorry. That user already exists.":"Sorry. That user already exists.","Sport can not be disabled, workouts exist.":"Sport can not be disabled, workouts exist.","Sport does not exist.":"Sport does not exist.","sports":"sports","statistics":"statistiques","User does not exist.":"User does not exist.","Valid email must be provided.\\n":"Valid email must be provided.","workouts":"workouts","You can not delete your account, no other user has admin rights.":"You can not delete your account, no other user has admin rights.","You do not have permissions.":"You do not have permissions."}')},211:function(e){e.exports=JSON.parse('{"Cycling (Sport)":"Cycling (Sport)","Cycling (Transport)":"Cycling (Transport)","Hiking":"Hiking","Mountain Biking":"Mountain Biking","Running":"Running","Walking":"Walking"}')},212:function(e){e.exports=JSON.parse('{"workouts":"workouts","distance":"distance","duration":"duration","month":"month","Statistics":"Statistics","year":"year","week":"week"}')},213:function(e){e.exports=JSON.parse('{"Admin":"Admin","Are you sure you want to delete this account? All data will be deleted, this cannot be undone.":"Are you sure you want to delete this account? All data will be deleted, this cannot be undone.","Are you sure you want to delete your account? All data will be deleted, this cannot be undone.":"Are you sure you want to delete your account? All data will be deleted, this cannot be undone.","Bio":"Bio","Birth Date":"Birth Date","Check your email. If your address is in our database, you\'ll received an email with a link to reset your password.":"Check your email. If your address is in our database, you\'ll received an email with a link to reset your password.","Delete my account":"Delete my account","Delete picture":"Delete picture","Delete user account":"Delete user account","Edit Profile":"Edit Profile","Email":"Email","Enter a username":"Enter a username","Enter an email address":"Enter an email address","Enter a password":"Enter a password","Enter the password confirmation":"Enter the password confirmation","First day of week":"First day of week","First Name":"First Name","Forgot password?":"Forgot password?","Invalid token. Please request a new token.":"Invalid token. Please request a new token.","Language":"Language","Last Name":"Last Name","Location":"Location","loggedOut":"You are now logged out. Click <1>here to log back in.","Login":"Login","login":"login","Logout":"Logout","Monday":"Monday","Password":"Password","Password Confirmation":"Password Confirmation","Password reset":"Password reset","password reset":"password reset","Profile":"Profile","Profile Edition":"Profile Edition","Register":"Register","register":"register","Registration Date":"Registration Date","Reset your password":"Reset your password","reset your password":"reset your password","Send":"Send","Sunday":"Sunday","Timezone":"Timezone","updatedPasswordText":"Your password have been updated. Click <1>here to log in.","Username":"Username"}')},214:function(e){e.exports=JSON.parse('{"Workouts":"S\xe9ances","Workout":"S\xe9ance","Workout Date":"Date de l\'s\xe9ance","Add a workout":"Ajouter une s\xe9ance","Are you sure you want to delete this workout?":"Etes-vous s\xfbr de vouloir supprimer cette s\xe9ance ?","Ave. speed":"Vitesse moyenne","Ascent":"D\xe9nivel\xe9 positif","Average speed":"Vitesse moyenne","Chart":"Analyse","data from gpx, without any cleaning":"donn\xe9es issues du fichier gpx, sans correction","Date":"Date","Delete workout":"Supprimer l\'s\xe9ance","Descent":"D\xe9nivel\xe9 n\xe9gatif","Distance":"Distance","distance":"distance","Duration":"Dur\xe9e","duration":"dur\xe9e","Edit a workout":"Editer une s\xe9ance","Edit workout":"Editer une workout","elevation":"altitude","End":"Arriv\xe9e","Farest distance":"Distance la + longue","Filter":"Filtrer","From":"A partir de","gpxFile":"fichier gpx","Longest duration":"Dur\xe9e la + longue","Max. altitude":"Altitude max","Max. speed":"Vitesse max","Min. altitude":"Altitude min","no folder inside":"pas de r\xe9pertoire","files max":" fichiers max","max size":"taille max","No data to display":"Pas de donn\xe9es \xe0 afficher","No Map":"Pas de carte","No next workout":"Pas d\'s\xe9ance suivante","No next segment":"Pas de segment suivant","No notes":"Pas de notes","No previous workout":"Pas d\'s\xe9ance pr\xe9c\xe9dente","No previous segment":"Pas de segment pr\xe9c\xe9dent","Notes":"Notes","pauses":"pauses","Personal records":"Records personnels","See next workout":"Voir l\'s\xe9ance suivante","See next segment":"Voir le segment suivant","See previous workout":"Voir l\'s\xe9ance pr\xe9c\xe9dente","See previous segment":"Voir le segment pr\xe9c\xe9dent","segment":"segment","Segments":"Segments","Start":"D\xe9part","speed":"vitesse","Title":"Titre","To":"Jusqu\'au","total duration":"dur\xe9e totale","with gpx file":"avec un fichier gpx","without gpx file":"sans fichier gpx","zipFile":"ou un fichier zip contenant des fichiers gpx"}')},215:function(e){e.exports=JSON.parse('{"Actions":"Actions","Active":"Active","Add admin rights":"Ajouter des droits d\'admin","Add/remove admin rights, delete user account.":"Ajouter/retirer des droits d\'adminsitration, supprimer des comptes utilisateurs.","Administration":"Administration","workouts exist":"des s\xe9ances existent","Application":"Application","Application configuration":"Configuration de l\'application","Back":"Retour","Disable":"d\xe9sactiver","Enable":"activer","Enable/disable sports.":"Activer/d\xe9sactiver des sports.","FitTrackee administration":"Administration de FitTrackee","id":"id","if 0, no limitation":"si \xe9gal \xe0 0, pas limite d\'inscription","Image":"Image","Label":"Label","Max. number of active users":"Nombre maximum d\'utilisateurs actifs","Max. files of zip archive":"Nombre max. de fichiers dans une archive zip","Max. size of uploaded files":"Taille max. des fichiers","Max. size of uploaded files (in Mb)":"Taille max. des fichiers (en Mo)","Max. size of zip archive":"Taille max. des archives zip","Max. size of zip archive (in Mb)":"Taille max. des archives zip (en Mo)","Registration is currently disabled.":"Les inscriptions sont actuellement d\xe9sactiv\xe9es.","Registration is currently enabled.":"Les inscriptions sont actuellement activ\xe9es.","Remove admin rights":"Retirer des droits d\'admin","Sports":"Sports","Update application configuration (maximum number of registered users, maximum files size).":"Configurer l\'application (nombre maximum d\'utilisateurs inscrits, taille maximale des fichers).","uploads":"fichiers","user":"user","Users":"Utilisateurs","users":"utilisateurs"}')},216:function(e){e.exports=JSON.parse('{"workouts count":"nombre d\'s\xe9ances","Add workout":"Ajouter une s\xe9ance","admin rights":"droits d\'admin","ascending":"ascendant","Back":"Revenir \xe0 la page pr\xe9c\xe9dente","Back to home":"Retour \xe0 l\'accueil","Cancel":"Annuler","Confirmation":"Confirmation","Dashboard":"Tableau de Bord","descending":"descendant","Edit":"Modifier","day":"jour","days":"jours","Next":"Page suivante","No":"Non","no":"non","No records.":"Pas de records.","No workouts.":"Pas d\'s\xe9ances.","Page not found":"Page introuvable","Previous":"Page pr\xe9c\xe9dente","registration date":"date d\'inscription","Sort":"Tri","Sort by":"Trier par","Sport":"Sport","sport":"sport","Sports":"Sports","sports":"sports","Statistics":"Statistiques","Submit":"Valider","to":"\xe0","user name":"utilisateur","Workout":"S\xe9ance","Workouts":"S\xe9ances","workout":"s\xe9ance","workouts":"s\xe9ances","Yes":"Oui","yes":"oui"}')},217:function(e){e.exports=JSON.parse('{"Personal records":"Mes records","This month":"Ce mois","Upload one !":"Ajoutez votre premi\xe8re s\xe9ance !"}')},218:function(e){e.exports=JSON.parse('{"3 to 12 characters required for username.":"3 \xe0 12 caract\xe8res requis pour le nom.","8 characters required for password.":"8 caract\xe8res minimum pour le mot de passe.","An error occurred. Please contact the administrator.":"Une erreur s\'est produite. Merci de contacter l\'administrateur.","application":"application","Error during picture deletion.":"Erreur lors de la suppression de l\'image.","Error during picture update.":"Erreur lors de la mise \xe0 jour de l\'image.","Error during picture update, file size exceeds max size.":"Erreur lors de la mise \xe0 jour de l\'image, la taille du ficher d\xe9passe la taille maximum autoris\xe9e","Error. Registration is disabled.":"Erreur. L\'inscription est d\xe9sactiv\xe9e.","Error. Please try again or contact the administrator.":"Erreur. Veuillez r\xe9essayer ou contacter l\'administrateur","File extension not allowed.":"Extension de fichier non autoris\xe9e.","File size is greater than the allowed size":"La taille du fichier est sup\xe9rieure \xe0 la limite autoris\xe9e","Incorrect id":"Id incorrect","Invalid credentials.":"Identifiants invalides.","Invalid payload.":"Donn\xe9es incorrectes.","Invalid token. Please log in again.":"Jeton invalide. Merci de vous reconnecter.","Max. files in a zip archive must be greater than 0":"Le nombre max. de fichiers dans une archive doit \xeatre sup\xe9rieur \xe0 0","Max. size of uploaded files must be greater than 0":"La taille max. des fichiers doit \xeatre sup\xe9rieure \xe0 0","Max. size of zip archive must be equal or greater than max. size of uploaded files":"La taille max. d\'une archive doit \xeatre sup\xe9rieure ou \xe9gale \xe0 la taille max. d\'un fichier","Max. size of zip archive must be greater than 0":"La taille max. d\'une archive doit \xeatre sup\xe9rieure \xe0 0","No file part.":"Pas de fichier fourni.","No picture.":"Pas d\'image.","No selected file.":"Pas de fichier s\xe9lectionn\xe9.","no correct file.":"fichier incorrect","no gpx file for this workout":"pas de fichier gpx pour cette s\xe9ance","Password and password confirmation don\'t match.":"Les mots de passe saisis sont diff\xe9rents.","Provide a valid auth token":"Merci de fournir un jeton valide","records":"records","Signature expired. Please log in again.":"Signature expir\xe9e. Merci de vous reconnecter.","Sorry. That user already exists.":"D\xe9sol\xe9. Cet utilisateur existe d\xe9j\xe0.","Sport can not be disabled, workouts exist.":"Le sport ne peut \xeatre d\xe9sactiv\xe9, des s\xe9ancees existent","Sport does not exist.":"Le sport n\'existe pas.","sports":"sports","statistics":"statistics","User does not exist.":"L\'utilisateur n\'existe pas.","Valid email must be provided.\\n":"L\'email fourni n\'est pas valide.","workouts":"s\xe9ances","You can not delete your account, no other user has admin rights.":"Vous ne pouvez pas supprimer votre compte, aucun autre utilisateur n\'a des droits d\'administration.","You do not have permissions.":"Vous n\'avez pas les permissions n\xe9cessaires."}')},219:function(e){e.exports=JSON.parse('{"Cycling (Sport)":"V\xe9lo (Sport)","Cycling (Transport)":"V\xe9lo (Transport)","Hiking":"Randonn\xe9e","Mountain Biking":"VTT","Running":"Course","Walking":"Marche"}')},220:function(e){e.exports=JSON.parse('{"workouts":"s\xe9ances","distance":"distance","duration":"dur\xe9e","month":"mois","Statistics":"Statistiques","year":"ann\xe9e","week":"semaine"}')},221:function(e){e.exports=JSON.parse('{"Admin":"Admin","Are you sure you want to delete this account? All data will be deleted, this cannot be undone.":"Etes-vous s\xfbr de vouloir supprimer ce compte ? Toutes les donn\xe9es seront d\xe9finitivement effac\xe9s.","Are you sure you want to delete your account? All data will be deleted, this cannot be undone.":"Etes-vous s\xfbr de vouloir supprimer votre compte ? Toutes les donn\xe9es seront d\xe9finitivement effac\xe9s.","Bio":"Bio","Birth Date":"Date de naissance","Check your email. If your address is in our database, you\'ll received an email with a link to reset your password.":"V\xe9rifiez vore boite mail. Si vote adresse est dans notre base de donn\xe9es, vous recevrez un email avec un lien pour r\xe9initialiser votre mot de passe","Delete my account":"Supprimer mon compte","Delete picture":"Supprimer l\'image","Delete user account":"Supprimer le compte","Edit Profile":"Editer le profil","Email":"Email","Enter a username":"Saisir un nom","Enter an email address":"Saisir une adresse e-mail","Enter a password":"Saisir un mot de passe","Enter the password confirmation":"Confirmer le mot de passe","First day of week":"Premier jour de la semaine","First Name":"Pr\xe9nom","Forgot password?":"Mot de passe oubli\xe9 ?","Invalid token. Please request a new token.":"Token invalid. Veuillez demander un nouveau token.","Language":"Langue","Last Name":"Nom","Location":"Lieu","loggedOut":"Vous \xeates d\xe9connect\xe9. Cliquez <1>ici pour vous reconnecter.","Login":"Se connecter","login":"se connecter","Logout":"Se d\xe9connecter","Monday":"Lundi","Password":"Mot de passe","Password Confirmation":"Confirmation du mot de passe","Password reset":"R\xe9initialiser votre mot de passe","password reset":"r\xe9initialiser votre mot de passe","Profile":"Profil","Profile Edition":"Edition du profil","Register":"S\'inscrire","register":"s\'inscrire","Registration Date":"Date d\'inscription","Reset your password":"R\xe9initialiser votre mot de passe","reset your password":"r\xe9initialiser votre mot de passe","Send":"Envoyer","Sunday":"Dimanche","Timezone":"Fuseau horaire","updatedPasswordText":"Votre mot de passe a \xe9t\xe9 mis \xe0 jour. Cliquez <1>ici pour vous connecter.","Username":"Nom d\'utilisateur"}')},281:function(e,t,a){},290:function(e,t){},894:function(e,t,a){"use strict";a.r(t),a.d(t,"history",(function(){return Ws})),a.d(t,"rootNode",(function(){return qs})),a.d(t,"store",(function(){return Bs}));var s=a(34),r=a(2),n=a.n(r),o=a(913),c=a(56),i=a.n(c),l=a(202),d=a(60),u=a(203),m=a(88),j=a(204),p=a(205),h={en:{workouts:a(206),administration:a(207),common:a(208),dashboard:a(209),messages:a(210),sports:a(211),statistics:a(212),user:a(213)},fr:{workouts:a(214),administration:a(215),common:a(216),dashboard:a(217),messages:a(218),sports:a(219),statistics:a(220),user:a(221)}};m.a.use(p.a).use(j.a).init({debug:!1,lng:"en",fallbackLng:"en",keySeparator:!1,interpolation:{escapeValue:!1},resources:h,ns:["common"],defaultNS:"common"});var b=m.a,f=a(10),O=a(11),x=a(14),g=a(13),v=a(12),k=a(24),w=(a(281),a(25)),y=a(896),N=a(1),_=function(e){Object(x.a)(a,e);var t=Object(g.a)(a);function a(){return Object(f.a)(this,a),t.apply(this,arguments)}return Object(O.a)(a,[{key:"render",value:function(){var e=this.props,t=e.message,a=e.messages,s=e.t,r=""!==t&&t?t.split("|").length>1?"".concat(s("messages:".concat(t.split("|")[0])),": ").concat(s("messages:".concat(t.split("|")[1]))):s("messages:".concat(t)):"";return Object(N.jsxs)("div",{className:"error-message",children:[""!==r&&Object(N.jsx)("code",{children:r}),a&&a.length>0&&(1===a.length?Object(N.jsx)("code",{children:a[0].value}):Object(N.jsx)("code",{children:Object(N.jsx)("ul",{children:a.map((function(e){return Object(N.jsx)("li",{children:s("messages:".concat(e.value))},e.id)}))})}))]})}}]),a}(n.a.PureComponent),S=a(16),D=a(915),C=a(914),E=a(226),A=["bytes","KB","MB","GB","TB"],M=function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],a=Math.floor(Math.log(e)/Math.log(1024));if(!e)return t?"0 bytes":{size:0,suffix:"bytes"};var s=(e/Math.pow(1024,a)).toFixed(1),r=A[a];return t?"".concat(s).concat(r):{size:s,suffix:r}},T="/api/",P=[{key:"workouts_count",label:"workouts count"},{key:"admin",label:"admin rights"},{key:"created_at",label:"registration date"},{key:"username",label:"user name"}],z=[{key:"asc",label:"ascending"},{key:"desc",label:"descending"}],F=function(){return!!window.localStorage.authToken},R=function(e){var t=0;return e.map((function(e){var a={id:t,value:e};return t++,a}))},L=function(e){var t={};e.noAuthorization||(t.Authorization="Bearer ".concat(window.localStorage.getItem("authToken"))),e.type&&(t["Content-Type"]=e.type);var a={method:e.method,headers:t};"application/json"===e.type&&e.body?a.body=JSON.stringify(e.body):e.body&&(a.body=e.body);var s=new Request("".concat(T).concat(e.url),a);return fetch(s).then((function(t){return"DELETE"===e.method||413===t.status?t:t.json()})).catch((function(e){return console.error(e),new Error("An error occurred. Please contact the administrator.")}))},U=function(e,t){if(!e)return"";var a=E.DateTime.fromISO(Object(D.a)(new Date(e),"yyyy-MM-dd'T'HH:mm:ss.SSSxxx")).setZone(t);return Object(C.a)(a.toFormat("yyyy-MM-dd HH:mm:ss"),"yyyy-MM-dd HH:mm:ss",new Date)},I=function(e,t){var a=e.label.toLowerCase(),s=t.label.toLowerCase();return a>s?1:a2&&void 0!==arguments[2]?arguments[2]:"common";return t.map((function(t){return Object(S.a)(Object(S.a)({},t),{},{label:e("".concat(a,":").concat(t.label))})})).sort(I)},H=function(e,t){var a=e;return t.id||"users"===e&&t.username?a="".concat(a,"/").concat(t.username?t.username:t.id):Object.keys(t).length>0&&(a+="?",Object.keys(t).filter((function(e){return t[e]})).map((function(e,s){return a+="".concat(0===s?"":"&").concat(e,"=").concat(t[e])}))),a},q=function(){function e(){Object(f.a)(this,e)}return Object(O.a)(e,null,[{key:"getData",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},a=H(e,t),s={url:a,method:"GET",type:"application/json"};return L(s)}},{key:"addData",value:function(e,t){return L({url:e,method:"POST",body:t,type:"application/json"})}},{key:"addDataWithFile",value:function(e,t){return L({url:e,method:"POST",body:t})}},{key:"postData",value:function(e,t){var a={url:"".concat(e).concat(t.id?"/".concat(t.id):""),method:"POST",body:t,type:"application/json"};return L(a)}},{key:"updateData",value:function(e,t){var a={url:"".concat(e).concat(t.id?"/".concat(t.id):t.username?"/".concat(t.username):""),method:"PATCH",body:t,type:"application/json"};return L(a)}},{key:"deleteData",value:function(e,t){var a={url:"".concat(e,"/").concat(t),method:"DELETE",type:"application/json"};return L(a)}}]),e}(),B=function(e,t){return{type:"SET_DATA",data:t,target:e}},G=function(e,t,a){return{type:"SET_PAGINATED_DATA",data:t,pagination:a,target:e}},V=function(e){return{type:"SET_ERROR",message:e}},J=function(e){return{type:"SET_LOADING",loading:e}},K=function(e){return{type:"UPDATE_SPORT_DATA",data:e}},Y=function(e){return{type:"UPDATE_USER_DATA",data:e}},X=function(e,t,a){var s=!(arguments.length>3&&void 0!==arguments[3])||arguments[3];return function(r){return r(J(!0)),a&&a.id&&"workouts"!==t&&isNaN(a.id)?(r(J(!1)),r(V("".concat(t,"|Incorrect id")))):(r({type:"CLEAN_ALL_MESSAGES"}),q[e](t,a).then((function(a){if("success"===a.status)if(s){if("users"===t&&"getData"===e)return r(G(t,a.data,a.pagination));r(B(t,a.data))}else"updateData"===e&&"sports"===t?r(K(a.data.sports[0])):"updateData"===e&&"users"===t&&r(Y(a.data.users[0]));else r(V("".concat(t,"|").concat(a.message||a.status)));r(J(!1))})).catch((function(e){r(J(!1)),r(V("".concat(t,"|").concat(e)))})))}},$=function(e){return function(t){m.a.changeLanguage(e).then(t(function(e){return{type:"SET_LANGUAGE",language:e}}(e)))}},Z=function(e){return{type:"SET_APP_CONFIG",data:e}},Q=function(e){return function(t){return q.getData(e).then((function(a){"success"===a.status?"config"===e?t(Z(a.data)):"stats/all"===e&&t({type:"SET_APP_STATS",data:a.data}):t(V("application|".concat(a.message)))})).catch((function(e){return t(V("application|".concat(e)))}))}},ee=function(e){Object(x.a)(a,e);var t=Object(g.a)(a);function a(e,s){var r;return Object(f.a)(this,a),(r=t.call(this,e,s)).state={formData:{}},r}return Object(O.a)(a,[{key:"componentDidMount",value:function(){this.initForm()}},{key:"componentDidUpdate",value:function(e){this.props.appConfig!==e.appConfig&&this.initForm()}},{key:"initForm",value:function(){var e=this.props.appConfig,t={};Object.keys(e).map((function(a){return null===e[a]?t[a]="":["max_single_file_size","max_zip_file_size"].includes(a)?t[a]=+(e[a]/1048576).toFixed(2):t[a]=e[a]})),this.setState({formData:t})}},{key:"handleFormChange",value:function(e){var t=this.state.formData;t[e.target.name]=+e.target.value,this.setState(t)}},{key:"render",value:function(){var e=this,t=this.props,a=t.isInEdition,s=t.loadAppConfig,r=t.message,n=t.messages,o=t.onHandleConfigFormSubmit,c=t.t,i=this.state.formData;return Object(N.jsxs)("div",{children:[(r||n)&&Object(N.jsx)(_,{message:r,messages:n,t:c}),Object.keys(i).length>0&&Object(N.jsx)("div",{className:"row",children:Object(N.jsx)("div",{className:"col-md-12",children:Object(N.jsxs)("div",{className:"card",children:[Object(N.jsx)("div",{className:"card-header",children:Object(N.jsx)("strong",{children:c("administration:Application configuration")})}),Object(N.jsx)("div",{className:"card-body",children:Object(N.jsxs)("form",{className:"app-config-form ".concat(a?"":"form-disabled"),onSubmit:function(e){e.preventDefault(),o(i)},children:[Object(N.jsxs)("div",{className:"form-group row",children:[Object(N.jsxs)("label",{className:"col-sm-6 col-form-label",htmlFor:"max_users",children:[c("administration:Max. number of active users"),Object(N.jsx)("sup",{children:Object(N.jsx)("i",{className:"fa fa-question-circle","aria-hidden":"true",title:c("administration:if 0, no limitation")})}),":"]}),Object(N.jsx)("input",{className:"col-sm-5",id:"max_users",name:"max_users",type:"number",min:"0",value:i.max_users,onChange:function(t){return e.handleFormChange(t)}})]}),Object(N.jsxs)("div",{className:"form-group row",children:[Object(N.jsxs)("label",{className:"col-sm-6 col-form-label",htmlFor:"max_single_file_size",children:[c("administration:Max. size of uploaded files (in Mb)"),":"]}),Object(N.jsx)("input",{className:"col-sm-5",id:"max_single_file_size",name:"max_single_file_size",type:"number",step:"0.1",min:"0",value:i.max_single_file_size,onChange:function(t){return e.handleFormChange(t)}})]}),Object(N.jsxs)("div",{className:"form-group row",children:[Object(N.jsxs)("label",{className:"col-sm-6 col-form-label",htmlFor:"max_zip_file_size",children:[c("administration:Max. size of zip archive (in Mb)"),":"]}),Object(N.jsx)("input",{className:"col-sm-5",id:"max_zip_file_size",name:"max_zip_file_size",type:"number",step:"0.1",min:"0",value:i.max_zip_file_size,onChange:function(t){return e.handleFormChange(t)}})]}),Object(N.jsxs)("div",{className:"form-group row",children:[Object(N.jsx)("label",{className:"col-sm-6 col-form-label",htmlFor:"gpx_limit_import",children:c("administration:Max. files of zip archive")}),Object(N.jsx)("input",{className:"col-sm-5",id:"gpx_limit_import",name:"gpx_limit_import",type:"number",min:"0",value:i.gpx_limit_import,onChange:function(t){return e.handleFormChange(t)}})]}),a?Object(N.jsxs)(N.Fragment,{children:[Object(N.jsx)("input",{type:"submit",className:"btn btn-primary",value:c("common:Submit")}),Object(N.jsx)("input",{type:"submit",className:"btn btn-secondary",onClick:function(e){e.preventDefault(),s(),Ws.push("/admin/application")},value:c("common:Cancel")})]}):Object(N.jsxs)(N.Fragment,{children:[Object(N.jsx)("input",{type:"submit",className:"btn btn-primary",onClick:function(e){e.preventDefault(),Ws.push("/admin/application/edit")},value:c("common:Edit")}),Object(N.jsx)("input",{type:"submit",className:"btn btn-secondary",onClick:function(){return Ws.push("/admin")},value:c("common:Back")})]})]})})]})})})]})}}]),a}(n.a.Component),te=Object(v.c)((function(e){return{message:e.message,messages:e.messages}}),(function(e){return{loadAppConfig:function(){e(Q("config"))},onHandleConfigFormSubmit:function(t){var a=Object.assign({},t);a.max_single_file_size*=1048576,a.max_zip_file_size*=1048576,e(function(e){return function(t){t({type:"CLEAN_ALL_MESSAGES"}),q.updateData("config",e).then((function(e){"success"===e.status?(t(Z(e.data)),Ws.push("/admin/application")):Array.isArray(e.message)?t({type:"APP_ERRORS",messages:R(e.message)}):t(V(e.message))})).catch((function(e){return t(V("application|".concat(e)))}))}}(a))}}}))(ee),ae=a(19),se=function(e){Object(x.a)(a,e);var t=Object(g.a)(a);function a(){return Object(f.a)(this,a),t.apply(this,arguments)}return Object(O.a)(a,[{key:"componentDidMount",value:function(){this.props.loadAppStats()}},{key:"render",value:function(){var e=this.props,t=e.appStats,a=e.t,s=M(t.uploads_dir_size,!1);return Object(N.jsxs)("div",{className:"row",children:[Object(N.jsx)("div",{className:"col-lg-3 col-md-6 col-sm-6",children:Object(N.jsx)("div",{className:"card workout-card",children:Object(N.jsxs)("div",{className:"card-body row",children:[Object(N.jsx)("div",{className:"col-3",children:Object(N.jsx)("i",{className:"fa fa-users fa-3x fa-color"})}),Object(N.jsxs)("div",{className:"col-9 text-right",children:[Object(N.jsx)("div",{className:"huge",children:t.users?t.users:0}),Object(N.jsx)("div",{children:"".concat(1===t.users?a("administration:user"):a("administration:users"))})]})]})})}),Object(N.jsx)("div",{className:"col-lg-3 col-md-6 col-sm-6",children:Object(N.jsx)("div",{className:"card workout-card",children:Object(N.jsxs)("div",{className:"card-body row",children:[Object(N.jsx)("div",{className:"col-3",children:Object(N.jsx)("i",{className:"fa fa-tags fa-3x fa-color"})}),Object(N.jsxs)("div",{className:"col-9 text-right",children:[Object(N.jsx)("div",{className:"huge",children:t.sports?t.sports:0}),Object(N.jsx)("div",{children:"".concat(1===t.sports?a("common:sport"):a("common:sports"))})]})]})})}),Object(N.jsx)("div",{className:"col-lg-3 col-md-6 col-sm-6",children:Object(N.jsx)("div",{className:"card workout-card",children:Object(N.jsxs)("div",{className:"card-body row",children:[Object(N.jsx)("div",{className:"col-3",children:Object(N.jsx)("i",{className:"fa fa-calendar fa-3x fa-color"})}),Object(N.jsxs)("div",{className:"col-9 text-right",children:[Object(N.jsx)("div",{className:"huge",children:t.workouts?t.workouts:0}),Object(N.jsx)("div",{children:"".concat(1===t.workouts?a("common:workout"):a("common:workouts"))})]})]})})}),Object(N.jsx)("div",{className:"col-lg-3 col-md-6 col-sm-6",children:Object(N.jsx)("div",{className:"card workout-card",children:Object(N.jsxs)("div",{className:"card-body row",children:[Object(N.jsx)("div",{className:"col-3",children:Object(N.jsx)("i",{className:"fa fa-folder-open fa-3x fa-color"})}),Object(N.jsxs)("div",{className:"col-9 text-right",children:[Object(N.jsx)("div",{className:"huge",children:s.size}),Object(N.jsxs)("div",{children:[s.suffix," (",a("administration:uploads"),")"]})]})]})})})]})}}]),a}(n.a.Component),re=Object(y.a)()(Object(v.c)((function(e){return{appStats:e.application.statistics}}),(function(e){return{loadAppStats:function(){e(Q("stats/all"))}}}))(se));function ne(e){var t=e.appConfig,a=e.t;return Object(N.jsxs)("div",{className:"card workout-card",children:[Object(N.jsx)("div",{className:"card-header",children:Object(N.jsx)("strong",{children:a("administration:Administration")})}),Object(N.jsxs)("div",{className:"card-body",children:[Object(N.jsx)(re,{}),Object(N.jsx)("br",{}),Object(N.jsxs)("dl",{className:"admin-items",children:[Object(N.jsx)("dt",{children:Object(N.jsx)(ae.a,{to:{pathname:"/admin/application"},children:a("administration:Application")})}),Object(N.jsxs)("dd",{children:[a("administration:Update application configuration (maximum number of registered users, maximum files size)."),Object(N.jsx)("br",{}),Object(N.jsx)("strong",{children:a("administration:Registration is currently ".concat(t.is_registration_enabled?"enabled":"disabled","."))})]}),Object(N.jsx)("br",{}),Object(N.jsx)("dt",{children:Object(N.jsx)(ae.a,{to:{pathname:"/admin/sports"},children:a("administration:Sports")})}),Object(N.jsx)("dd",{children:a("administration:Enable/disable sports.")}),Object(N.jsx)("br",{}),Object(N.jsx)("dt",{children:Object(N.jsx)(ae.a,{to:{pathname:"/admin/users"},children:a("administration:Users")})}),Object(N.jsx)("dd",{children:a("administration:Add/remove admin rights, delete user account.")})]})]})]})}var oe=function(e){Object(x.a)(a,e);var t=Object(g.a)(a);function a(){return Object(f.a)(this,a),t.apply(this,arguments)}return Object(O.a)(a,[{key:"componentDidMount",value:function(){this.props.loadSports()}},{key:"render",value:function(){var e=this.props,t=e.message,a=e.sports,s=e.t,r=e.updateSport;return Object(N.jsxs)("div",{children:[t&&Object(N.jsx)(_,{message:t,t:s}),Object(N.jsx)("div",{className:"row",children:Object(N.jsx)("div",{className:"col",children:Object(N.jsxs)("div",{className:"card",children:[Object(N.jsx)("div",{className:"card-header",children:Object(N.jsx)("strong",{children:s("administration:Sports")})}),Object(N.jsxs)("div",{className:"card-body",children:[a.length>0&&Object(N.jsxs)("table",{className:"table",children:[Object(N.jsx)("thead",{children:Object(N.jsxs)("tr",{children:[Object(N.jsx)("th",{children:s("administration:id")}),Object(N.jsx)("th",{children:s("administration:Image")}),Object(N.jsx)("th",{children:s("administration:Label")}),Object(N.jsx)("th",{children:s("administration:Active")}),Object(N.jsx)("th",{children:s("administration:Actions")})]})}),Object(N.jsx)("tbody",{children:a.map((function(e){return Object(N.jsxs)("tr",{children:[Object(N.jsxs)("td",{children:[Object(N.jsx)("span",{className:"heading-span-absolute",children:s("administration:id")}),e.id]}),Object(N.jsxs)("td",{children:[Object(N.jsx)("span",{className:"heading-span-absolute",children:s("administration:Image")}),Object(N.jsx)("img",{className:"admin-img",src:e.img?e.img:"/img/photo.png",alt:"sport logo"})]}),Object(N.jsxs)("td",{children:[Object(N.jsx)("span",{className:"heading-span-absolute",children:s("administration:Label")}),s("sports:".concat(e.label))]}),Object(N.jsxs)("td",{children:[Object(N.jsx)("span",{className:"heading-span-absolute",children:s("administration:Active")}),e.is_active?Object(N.jsx)("i",{className:"fa fa-check-square-o custom-fa","aria-hidden":"true","data-toggle":"tooltip"}):Object(N.jsx)("i",{className:"fa fa-square-o custom-fa","aria-hidden":"true","data-toggle":"tooltip"})]}),Object(N.jsxs)("td",{children:[Object(N.jsx)("span",{className:"heading-span-absolute",children:s("administration:Actions")}),Object(N.jsx)("input",{type:"submit",className:"btn btn-".concat(e.is_active?"dark":"primary"," btn-sm"),value:e.is_active?s("administration:Disable"):s("administration:Enable"),onClick:function(){return r(e.id,!e.is_active)}}),e.has_workouts&&Object(N.jsxs)("span",{className:"admin-message",children:[Object(N.jsx)("i",{className:"fa fa-warning custom-fa","aria-hidden":"true"}),s("administration:workouts exist")]})]})]},e.id)}))})]}),Object(N.jsx)("input",{type:"submit",className:"btn btn-secondary",onClick:function(){return Ws.push("/admin/")},value:s("common:Back")})]})]})})})]})}}]),a}(n.a.Component),ce=Object(v.c)((function(e){return{message:e.message,sports:e.sports.data,user:e.user}}),(function(e){return{loadSports:function(){e(X("getData","sports"))},updateSport:function(t,a){e(X("updateData","sports",{id:t,is_active:a},!1))}}}))(oe),ie=function(e){Object(x.a)(a,e);var t=Object(g.a)(a);function a(){return Object(f.a)(this,a),t.apply(this,arguments)}return Object(O.a)(a,[{key:"getUrl",value:function(e){var t=this.props,a=t.query,s=t.pathname,r=Object.assign({},a),n=a.page?+a.page:1;switch(e){case"prev":n-=1;break;case"next":n+=1;break;default:n=+e}return r.page=n,H(s,r)}},{key:"render",value:function(){var e,t=this,a=this.props,s=a.pagination,r=a.t;return Object(N.jsx)(N.Fragment,{children:s&&Object.keys(s).length>0&&Object(N.jsx)("nav",{"aria-label":"Page navigation example",children:Object(N.jsxs)("ul",{className:"pagination justify-content-center",children:[Object(N.jsx)("li",{className:"page-item ".concat(s.has_prev?"":"disabled"),children:Object(N.jsx)(ae.a,{className:"page-link",to:this.getUrl("prev"),"aria-disabled":!s.has_prev,children:r("common:Previous")})}),(e=s.pages,Array.from({length:e},(function(e,t){return t+1}))).map((function(e){return Object(N.jsx)("li",{className:"page-item ".concat(e===s.page?"active":""),children:Object(N.jsx)(ae.a,{className:"page-link",to:t.getUrl(e),children:e})},e)})),Object(N.jsx)("li",{className:"page-item ".concat(s.has_next?"":"disabled"),children:Object(N.jsx)(ae.a,{className:"page-link",to:this.getUrl("next"),"aria-disabled":!s.has_next,children:r("common:Next")})})]})})})}}]),a}(n.a.PureComponent),le=function(e){Object(x.a)(a,e);var t=Object(g.a)(a);function a(e,s){var r;return Object(f.a)(this,a),(r=t.call(this,e,s)).state={page:null,per_page:null,order_by:"created_at",order:"asc"},r}return Object(O.a)(a,[{key:"componentDidMount",value:function(){this.props.loadUsers(this.initState())}},{key:"componentDidUpdate",value:function(e){e.location.query!==this.props.location.query&&this.props.loadUsers(this.props.location.query)}},{key:"initState",value:function(){var e=this.props.location.query,t={page:e.page,per_page:e.per_page,order_by:e.order_by?e.order_by:"created_at",order:e.order?e.order:"asc"};return this.setState(t),t}},{key:"updatePage",value:function(e,t){var a=Object.assign({},this.state);a[e]=t,this.setState(a);var s=H(this.props.location.pathname,a);Ws.push(s)}},{key:"render",value:function(){var e=this,t=this.props,a=t.authUser,s=t.location,r=t.message,n=t.t,o=t.pagination,c=t.updateUser,i=t.users,l=W(n,P),d=W(n,z);return Object(N.jsxs)("div",{children:[r&&Object(N.jsx)(_,{message:r,t:n}),Object(N.jsx)("div",{className:"container",children:Object(N.jsx)("div",{className:"row",children:Object(N.jsx)("div",{className:"col",children:Object(N.jsxs)("div",{className:"card",children:[Object(N.jsx)("div",{className:"card-header",children:Object(N.jsx)("strong",{children:n("administration:Users")})}),Object(N.jsxs)("div",{className:"card-body",children:[Object(N.jsxs)("div",{className:"row user-filters",children:[Object(N.jsx)("div",{className:"col-lg-4 col-md-6 col-sm-12",children:Object(N.jsxs)("label",{htmlFor:"order_by",children:[n("common:Sort by"),":"," ",Object(N.jsx)("select",{id:"order_by",name:"order_by",value:this.state.order_by,onChange:function(t){return e.updatePage("order_by",t.target.value)},children:l.map((function(e){return Object(N.jsx)("option",{value:e.key,children:e.label},e.key)}))})," "]})}),Object(N.jsx)("div",{className:"col-lg-4 col-md-6 col-sm-12",children:Object(N.jsxs)("label",{htmlFor:"sort",children:[n("common:Sort"),":"," ",Object(N.jsx)("select",{id:"sort",name:"sort",value:this.state.order,onChange:function(t){return e.updatePage("order",t.target.value)},children:d.map((function(e){return Object(N.jsx)("option",{value:e.key,children:e.label},e.key)}))})," "]})})]}),Object(N.jsxs)("table",{className:"table",children:[Object(N.jsx)("thead",{children:Object(N.jsxs)("tr",{children:[Object(N.jsx)("th",{children:"#"}),Object(N.jsx)("th",{children:n("user:Username")}),Object(N.jsx)("th",{children:n("user:Email")}),Object(N.jsx)("th",{children:n("user:Registration Date")}),Object(N.jsx)("th",{children:n("workouts:Workouts")}),Object(N.jsx)("th",{children:n("user:Admin")}),Object(N.jsx)("th",{children:n("administration:Actions")})]})}),Object(N.jsx)("tbody",{children:i.map((function(e){return Object(N.jsxs)("tr",{children:[Object(N.jsxs)("td",{children:[Object(N.jsx)("span",{className:"heading-span-absolute",children:"#"}),!0===e.picture?Object(N.jsx)("img",{alt:"Avatar",src:"".concat(T,"users/").concat(e.username,"/picture?").concat(Date.now()),className:"img-fluid App-nav-profile-img"}):Object(N.jsx)("i",{className:"fa fa-user-circle-o fa-2x no-picture","aria-hidden":"true"})]}),Object(N.jsxs)("td",{children:[Object(N.jsx)("span",{className:"heading-span-absolute",children:n("user:Username")}),Object(N.jsx)(ae.a,{to:"/users/".concat(e.username),children:e.username})]}),Object(N.jsxs)("td",{children:[Object(N.jsx)("span",{className:"heading-span-absolute",children:n("user:Email")}),e.email]}),Object(N.jsxs)("td",{children:[Object(N.jsx)("span",{className:"heading-span-absolute",children:n("user:Registration Date")}),Object(D.a)(new Date(e.created_at),"dd/MM/yyyy HH:mm")]}),Object(N.jsxs)("td",{children:[Object(N.jsx)("span",{className:"heading-span-absolute",children:n("workouts:Workouts")}),e.nb_workouts]}),Object(N.jsxs)("td",{children:[Object(N.jsx)("span",{className:"heading-span-absolute",children:n("user:Admin")}),e.admin?Object(N.jsx)("i",{className:"fa fa-check-square-o custom-fa","aria-hidden":"true","data-toggle":"tooltip"}):Object(N.jsx)("i",{className:"fa fa-square-o custom-fa","aria-hidden":"true","data-toggle":"tooltip"})]}),Object(N.jsxs)("td",{children:[Object(N.jsx)("span",{className:"heading-span-absolute",children:n("administration:Actions")}),Object(N.jsx)("input",{type:"submit",className:"btn btn-".concat(e.admin?"dark":"primary"," btn-sm"),disabled:e.username===a.username,value:e.admin?n("administration:Remove admin rights"):n("administration:Add admin rights"),onClick:function(){return c(e.username,!e.admin)}})]})]},e.username)}))})]}),Object(N.jsx)(ie,{pagination:o,pathname:s.pathname,query:this.state,t:n}),Object(N.jsx)("input",{type:"submit",className:"btn btn-secondary",onClick:function(){return Ws.push("/admin/")},value:n("common:Back")})]})]})})})})]})}}]),a}(n.a.Component),de=Object(v.c)((function(e){return{authUser:e.user,location:e.router.location,message:e.message,pagination:e.users.pagination,users:e.users.data}}),(function(e){return{loadUsers:function(t){e(X("getData","users",t))},updateUser:function(t,a){e(X("updateData","users",{username:t,admin:a},!1))}}}))(le),ue=a(227);function me(){var e=Object(ue.a)().t;return Object(N.jsxs)("div",{children:[Object(N.jsx)(w.a,{children:Object(N.jsx)("title",{children:"fittrackee - 404"})}),Object(N.jsx)("h1",{className:"page-title",children:e("Page not found")})]})}var je=Object(y.a)()(Object(v.c)((function(e){return{appConfig:e.application.config,user:e.user}}))((function(e){var t=e.appConfig,a=e.t,s=e.user;return Object(N.jsxs)(N.Fragment,{children:[Object(N.jsx)(w.a,{children:Object(N.jsxs)("title",{children:["FitTrackee - ",a("administration:Administration")]})}),Object(N.jsx)("div",{className:"container dashboard",children:s.admin?Object(N.jsxs)(k.d,{children:[Object(N.jsx)(k.b,{exact:!0,path:"/admin",render:function(){return Object(N.jsx)(ne,{appConfig:t,t:a})}}),Object(N.jsx)(k.b,{exact:!0,path:"/admin/application",render:function(){return Object(N.jsx)(te,{appConfig:t,t:a,isInEdition:!1})}}),Object(N.jsx)(k.b,{exact:!0,path:"/admin/application/edit",render:function(){return Object(N.jsx)(te,{appConfig:t,t:a,isInEdition:!0})}}),Object(N.jsx)(k.b,{exact:!0,path:"/admin/sports",render:function(){return Object(N.jsx)(ce,{t:a})}}),Object(N.jsx)(k.b,{exact:!0,path:"/admin/users",render:function(){return Object(N.jsx)(de,{t:a})}}),Object(N.jsx)(k.b,{component:me})]}):Object(N.jsx)(me,{})})]})}))),pe=a(897),he=a(29),be=a(916),fe=a(230),Oe=a.n(fe),xe=["#55a8a3","#98C3A9","#D0838A","#ECC77E","#926692","#929292","#428bca"],ge=[{record_type:"AS",label:"Ave. speed"},{record_type:"FD",label:"Farest distance"},{record_type:"LD",label:"Longest duration"},{record_type:"MS",label:"Max. speed"}],ve=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;return t||(t="yyyy/MM/dd"),a||(a="HH:mm"),{workout_date:e?Object(D.a)(e,t):null,workout_time:e?Object(D.a)(e,a):null}},ke=function(e){var t=new Date(0);return(t=Object(be.a)(t.setSeconds(e),1)).getTime()},we=function(e){for(var t=0;ts?1:a2&&void 0!==arguments[2]&&arguments[2];return e.filter((function(e){return!a||e.is_active})).map((function(e){return Object(S.a)(Object(S.a)({},e),{},{label:t("sports:".concat(e.label))})})).sort(ye)},_e=function(){function e(){Object(f.a)(this,e)}return Object(O.a)(e,null,[{key:"loginOrRegisterOrPasswordReset",value:function(e,t){var a={url:"auth/".concat(e),method:"POST",noAuthorization:!0,body:t,type:"application/json"};return L(a)}},{key:"deletePicture",value:function(){return L({url:"auth/picture",method:"DELETE"})}}]),e}(),Se=function(e){return{type:"PICTURE_ERROR",message:e}},De=function(e){return{type:"PROFILE_UPDATE_ERROR",message:e}},Ce=function(){return function(e){return window.localStorage.getItem("authToken")?e(Ee()):{type:"LOGOUT"}}},Ee=function(){return function(e){return q.getData("auth/profile").then((function(t){return"success"===t.status?(e(X("getData","sports")),t.data.isAuthenticated=!0,t.data.language&&e($(t.data.language)),e({type:"PROFILE_SUCCESS",profil:t.data})):e({type:"PROFILE_ERROR",message:t.message})})).catch((function(e){throw e}))}},Ae=function(e,t){return function(a){if("register"===t||"password/update"===t){var s=function(e){var t=[];return!(arguments.length>1&&void 0!==arguments[1]&&arguments[1])&&(e.username.length<3||e.username.length>12)&&t.push("3 to 12 characters required for username."),e.password!==e.password_conf&&t.push("Password and password confirmation don't match."),e.password.length<8&&t.push("8 characters required for password."),t}(e,"password/update"===t);if(s.length>0)return a({type:"AUTH_ERRORS",messages:R(s)})}return a(function(e,t){return function(a){return _e.loginOrRegisterOrPasswordReset(e,t).then((function(t){if("success"===t.status){if("password/reset-request"===e)return Ws.push({pathname:"/password-reset/sent"});if("password/update"===e)return Ws.push({pathname:"/updated-password"});if("login"===e||"register"===e)return window.localStorage.setItem("authToken",t.auth_token),"register"===e&&a(Q("config")),a(Ee())}return a({type:"AUTH_ERROR",message:t.message})})).catch((function(e){throw e}))}}(t,e))}},Me=function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return function(a){return q.deleteData("users",e).then((function(e){204===e.status?(a(Q("config")),t?Ws.push("/admin/users"):(a({type:"LOGOUT"}),Ws.push("/"))):e.json().then((function(e){return a(V("".concat(e.message)))}))})).catch((function(e){return a(V("user|".concat(e)))}))}},Te=function(e){return{type:"SET_GPX",gpxContent:e}},Pe=function(e){return{type:"SET_CHART_DATA",chartData:e}},ze=function(e){return function(t){return q.updateData("workouts",e).then((function(e){"success"===e.status?(t(Ce()),Ws.push("/workouts/".concat(e.data.workouts[0].id))):t(V("workouts|".concat(e.message))),t(J(!1))})).catch((function(e){t(J(!1)),t(V("workouts|".concat(e)))}))}},Fe=function(e){return function(t){return q.getData("workouts",e).then((function(e){"success"===e.status?e.data.workouts.length>0&&t({type:"PUSH_WORKOUTS",workouts:e.data.workouts}):t(V("workouts|".concat(e.message)))})).catch((function(e){return t(V("workouts|".concat(e)))}))}};var Re=Object(v.c)((function(e){return{appConfig:e.application.config,loading:e.loading}}),(function(e){return{onAddWorkout:function(t){e(J(!0));var a=new FormData;a.append("file",t.target.form.gpxFile.files[0]),a.append("data",'{"sport_id": '.concat(t.target.form.sport.value,', "notes": "').concat(t.target.form.notes.value,'"}')),e(function(e){return function(t){return q.addDataWithFile("workouts",e).then((function(e){"created"===e.status?0===e.data.workouts.length?t(V("workouts|no correct file.")):1===e.data.workouts.length?(t(Ce()),Ws.push("/workouts/".concat(e.data.workouts[0].id))):(t(Ce()),Ws.push("/")):413===e.status?t(V("workouts|File size is greater than the allowed size")):t(V("workouts|".concat(e.message))),t(J(!1))})).catch((function(e){t(J(!1)),t(V("workouts|".concat(e)))}))}}(a))},onEditWorkout:function(t,a){e(ze({id:a.id,notes:t.target.form.notes.value,sport_id:+t.target.form.sport.value,title:t.target.form.title.value}))}}}))((function(e){var t=e.appConfig,a=e.loading,s=e.onAddWorkout,r=e.onEditWorkout,n=e.sports,o=e.t,c=e.workout,i=c?c.sport_id:"",l=Ne(n,o,!0),d="".concat(o("workouts:no folder inside"),", ").concat(t.gpx_limit_import," ").concat(o("workouts:files max"),", ").concat(o("workouts:max size"),": ").concat(M(t.max_zip_file_size)),u=M(t.max_single_file_size);return Object(N.jsxs)("form",{encType:"multipart/form-data",method:"post",onSubmit:function(e){return e.preventDefault()},children:[Object(N.jsx)("div",{className:"form-group",children:Object(N.jsxs)("label",{children:[o("common:Sport"),":",Object(N.jsxs)("select",{className:"form-control input-lg",defaultValue:i,disabled:a,name:"sport",required:!0,children:[Object(N.jsx)("option",{value:""}),l.map((function(e){return Object(N.jsx)("option",{value:e.id,children:e.label},e.id)}))]})]})}),c?Object(N.jsx)("div",{className:"form-group",children:Object(N.jsxs)("label",{children:[o("workouts:Title"),":",Object(N.jsx)("input",{name:"title",defaultValue:c?c.title:"",disabled:a,className:"form-control input-lg"})]})}):Object(N.jsx)("div",{className:"form-group",children:Object(N.jsxs)("label",{children:[Object(N.jsxs)(pe.a,{i18nKey:"workouts:gpxFile",children:[Object(N.jsx)("strong",{children:"gpx"})," file"]}),Object(N.jsx)("sup",{children:Object(N.jsx)("i",{className:"fa fa-question-circle","aria-hidden":"true","data-toggle":"tooltip",title:"".concat(o("workouts:max size"),": ").concat(u)})})," ",Object(N.jsxs)(pe.a,{i18nKey:"workouts:zipFile",children:["or ",Object(N.jsx)("strong",{children:" zip"})," file containing ",Object(N.jsx)("strong",{children:"gpx "}),"files"]}),Object(N.jsx)("sup",{children:Object(N.jsx)("i",{className:"fa fa-question-circle","aria-hidden":"true","data-toggle":"tooltip","data-placement":"top",title:d})})," ",":",Object(N.jsx)("input",{accept:".gpx, .zip",className:"form-control form-control-file gpx-file",disabled:a,name:"gpxFile",required:!0,type:"file"})]})}),Object(N.jsx)("div",{className:"form-group",children:Object(N.jsxs)("label",{children:[o("workouts:Notes"),":",Object(N.jsx)("textarea",{name:"notes",defaultValue:c?c.notes:"",disabled:a,className:"form-control input-lg",maxLength:"500"})]})}),a?Object(N.jsx)("div",{className:"loader"}):Object(N.jsxs)("div",{children:[Object(N.jsx)("input",{type:"submit",className:"btn btn-primary",onClick:function(e){return c?r(e,c):s(e)},value:o("common:Submit")}),Object(N.jsx)("input",{type:"submit",className:"btn btn-secondary",onClick:function(){return Ws.push("/")},value:o("common:Cancel")})]})]})}));var Le=Object(v.c)((function(e){return{user:e.user}}),(function(e){return{onAddOrEdit:function(t,a){var s,r=t.target.form.duration.value.split(":"),n=60*+r[0]*60+60*+r[1]+ +r[2],o={workout_date:"".concat(t.target.form.workout_date.value," ").concat(t.target.form.workout_time.value),distance:+t.target.form.distance.value,duration:n,notes:t.target.form.notes.value,sport_id:+t.target.form.sport_id.value,title:t.target.form.title.value};a?(o.id=a.id,e(ze(o))):e((s=o,function(e){return q.addData("workouts/no_gpx",s).then((function(t){"created"===t.status?(e(Ce()),Ws.push("/workouts/".concat(t.data.workouts[0].id))):e(V("workouts|".concat(t.message)))})).catch((function(t){return e(V("workouts|".concat(t)))}))}))}}}))((function(e){var t,a,s=e.onAddOrEdit,r=e.sports,n=e.t,o=e.user,c=e.workout,i=Ne(r,n,!0),l="";if(c){var d=ve(U(c.workout_date,o.timezone),"yyyy-MM-dd");t=d.workout_date,a=d.workout_time,l=c.sport_id}return Object(N.jsxs)("form",{onSubmit:function(e){return e.preventDefault()},children:[Object(N.jsx)("div",{className:"form-group",children:Object(N.jsxs)("label",{children:[n("workouts:Title"),":",Object(N.jsx)("input",{name:"title",defaultValue:c?c.title:"",className:"form-control input-lg"})]})}),Object(N.jsx)("div",{className:"form-group",children:Object(N.jsxs)("label",{children:[n("common:Sport"),":",Object(N.jsxs)("select",{className:"form-control input-lg",defaultValue:l,name:"sport_id",required:!0,children:[Object(N.jsx)("option",{value:""}),i.map((function(e){return Object(N.jsx)("option",{value:e.id,children:e.label},e.id)}))]})]})}),Object(N.jsx)("div",{className:"form-group",children:Object(N.jsxs)("label",{children:[n("workouts:Workout Date"),":",Object(N.jsx)("div",{className:"container",children:Object(N.jsxs)("div",{className:"row",children:[Object(N.jsx)("input",{name:"workout_date",defaultValue:t,className:"form-control col-md",required:!0,type:"date"}),Object(N.jsx)("input",{name:"workout_time",defaultValue:a,className:"form-control col-md",required:!0,type:"time"})]})})]})}),Object(N.jsx)("div",{className:"form-group",children:Object(N.jsxs)("label",{children:[n("workouts:Duration"),":",Object(N.jsx)("input",{name:"duration",defaultValue:c?c.duration:"",className:"form-control col-xs-4",pattern:"^([0-9]*[0-9]):([0-5][0-9]):([0-5][0-9])$",placeholder:"hh:mm:ss",required:!0,type:"text"})]})}),Object(N.jsx)("div",{className:"form-group",children:Object(N.jsxs)("label",{children:[n("workouts:Distance")," (km):",Object(N.jsx)("input",{name:"distance",defaultValue:c?c.distance:"",className:"form-control input-lg",min:0,required:!0,step:"0.001",type:"number"})]})}),Object(N.jsx)("div",{className:"form-group",children:Object(N.jsxs)("label",{children:[n("workouts:Notes"),":",Object(N.jsx)("textarea",{name:"notes",defaultValue:c?c.notes:"",className:"form-control input-lg",maxLength:"500"})]})}),Object(N.jsx)("input",{type:"submit",className:"btn btn-primary",onClick:function(e){return s(e,c)},value:n("common:Submit")}),Object(N.jsx)("input",{type:"submit",className:"btn btn-secondary",onClick:function(){return Ws.push("/")},value:n("common:Cancel")})]})})),Ue=function(e){Object(x.a)(a,e);var t=Object(g.a)(a);function a(e,s){var r;return Object(f.a)(this,a),(r=t.call(this,e,s)).state={withGpx:!0},r}return Object(O.a)(a,[{key:"handleRadioChange",value:function(e){this.setState({withGpx:"withGpx"===e.target.name?e.target.value:!e.target.value})}},{key:"render",value:function(){var e=this,t=this.props,a=t.loading,s=t.message,r=t.sports,n=t.t,o=t.workout,c=this.state.withGpx;return Object(N.jsxs)("div",{children:[Object(N.jsx)(w.a,{children:Object(N.jsxs)("title",{children:["FitTrackee -"," ",n(o?"workouts:Edit a workout":"workouts:Add a workout")]})}),Object(N.jsx)("br",{}),Object(N.jsx)("br",{}),Object(N.jsx)(_,{message:s,t:n}),Object(N.jsx)("div",{className:"container",children:Object(N.jsxs)("div",{className:"row",children:[Object(N.jsx)("div",{className:"col-md-2"}),Object(N.jsx)("div",{className:"col-md-8",children:Object(N.jsxs)("div",{className:"card add-workout",children:[Object(N.jsx)("h2",{className:"card-header text-center",children:n(o?"workouts:Edit a workout":"workouts:Add a workout")}),Object(N.jsx)("div",{className:"card-body",children:o?o.with_gpx?Object(N.jsx)(Re,{workout:o,sports:r,t:n}):Object(N.jsx)(Le,{workout:o,sports:r,t:n}):Object(N.jsxs)("div",{children:[Object(N.jsx)("form",{children:Object(N.jsxs)("div",{className:"form-group row",children:[Object(N.jsx)("div",{className:"col",children:Object(N.jsxs)("label",{className:"radioLabel",children:[Object(N.jsx)("input",{className:"add-workout-radio",type:"radio",name:"withGpx",disabled:a,checked:c,onChange:function(t){return e.handleRadioChange(t)}}),n("workouts:with gpx file")]})}),Object(N.jsx)("div",{className:"col",children:Object(N.jsxs)("label",{className:"radioLabel",children:[Object(N.jsx)("input",{className:"add-workout-radio",type:"radio",name:"withoutGpx",disabled:a,checked:!c,onChange:function(t){return e.handleRadioChange(t)}}),n("workouts:without gpx file")]})})]})}),c?Object(N.jsx)(Re,{sports:r,t:n}):Object(N.jsx)(Le,{sports:r,t:n})]})})]})}),Object(N.jsx)("div",{className:"col-md-2"})]})})]})}}]),a}(n.a.Component),Ie=Object(y.a)()(Object(v.c)((function(e){return{loading:e.loading}}))(Ue));var We=Object(v.c)((function(e){return{message:e.message,sports:e.sports.data,user:e.user}}))((function(e){var t=e.message,a=e.sports;return Object(N.jsx)("div",{children:Object(N.jsx)(Ie,{workout:null,message:t,sports:a})})}));function He(e){var t=Object(ue.a)().t;return Object(N.jsx)("div",{className:"custom-modal-backdrop",children:Object(N.jsx)("div",{className:"custom-modal",children:Object(N.jsxs)("div",{className:"modal-content",children:[Object(N.jsxs)("div",{className:"modal-header",children:[Object(N.jsx)("h5",{className:"modal-title",children:e.title}),Object(N.jsx)("button",{type:"button",className:"close","aria-label":"Close",onClick:function(){return e.close()},children:Object(N.jsx)("span",{"aria-hidden":"true",children:"\xd7"})})]}),Object(N.jsx)("div",{className:"modal-body",children:Object(N.jsx)("p",{children:e.text})}),Object(N.jsxs)("div",{className:"modal-footer",children:[Object(N.jsx)("button",{type:"button",className:"btn btn-primary",onClick:function(){return e.confirm()},children:t("common:Yes")}),Object(N.jsx)("button",{type:"button",className:"btn btn-secondary",onClick:function(){return e.close()},children:t("common:No")})]})]})})})}function qe(e){var t=e.dataType,a=e.displayModal,s=e.segmentId,r=e.sport,n=e.t,o=e.title,c=e.user,i=e.workout,l=i?ve(U(i.workout_date,c.timezone)):null,d="segment"===t&&1!==s?"/workouts/".concat(i.id,"/segment/").concat(s-1):"workout"===t&&i.previous_workout?"/workouts/".concat(i.previous_workout):null,u="segment"===t&&s0?Object(N.jsxs)("div",{children:[Object(N.jsxs)("div",{className:"row chart-radio",children:[Object(N.jsxs)("label",{className:"radioLabel col-md-1",children:[Object(N.jsx)("input",{type:"radio",name:"distance",checked:c,onChange:function(e){return a.handleRadioChange(e)}}),n("workouts:distance")]}),Object(N.jsxs)("label",{className:"radioLabel col-md-1",children:[Object(N.jsx)("input",{type:"radio",name:"duration",checked:!c,onChange:function(e){return a.handleRadioChange(e)}}),n("workouts:duration")]})]}),Object(N.jsxs)("div",{className:"row chart-radio",children:[Object(N.jsx)("div",{className:"col-md-5"}),Object(N.jsxs)("label",{className:"radioLabel col-md-1",children:[Object(N.jsx)("input",{type:"checkbox",name:"speed",checked:this.displayData("speed"),onChange:function(e){return a.handleLegendChange(e)}}),n("workouts:speed")]}),Object(N.jsxs)("label",{className:"radioLabel col-md-1",children:[Object(N.jsx)("input",{type:"checkbox",name:"elevation",checked:this.displayData("elevation"),onChange:function(e){return a.handleLegendChange(e)}}),n("workouts:elevation")]}),Object(N.jsx)("div",{className:"col-md-5"})]}),Object(N.jsx)("div",{className:"row chart",children:Object(N.jsx)(Be.f,{height:300,children:Object(N.jsxs)(Be.d,{data:r,margin:{top:15,right:30,left:20,bottom:15},onMouseMove:function(e){return o(e.activePayload)},onMouseLeave:function(){return o(null)},children:[Object(N.jsx)(Be.h,{allowDecimals:!1,dataKey:e,label:{value:n("workouts:".concat(e)),offset:0,position:"bottom"},scale:t,interval:i,tickFormatter:function(e){return c?e:Object(D.a)(e,"HH:mm:ss")},type:"number"}),Object(N.jsx)(Be.i,{label:{value:"".concat(n("workouts:speed")," (km/h)"),angle:-90,position:"left"},yAxisId:"left"}),Object(N.jsx)(Be.i,{label:{value:"".concat(n("workouts:elevation")," (m)"),angle:-90,position:"right"},yAxisId:"right",orientation:"right"}),this.displayData("elevation")&&Object(N.jsx)(Be.a,{yAxisId:"right",type:"linear",dataKey:"elevation",name:n("workouts:elevation"),fill:"#e5e5e5",stroke:"#cccccc",dot:!1,unit:" m"}),this.displayData("speed")&&Object(N.jsx)(Be.e,{yAxisId:"left",type:"linear",dataKey:"speed",name:n("workouts:speed"),stroke:"#8884d8",strokeWidth:2,dot:!1,unit:" km/h"}),Object(N.jsx)(Be.g,{labelFormatter:function(e){return c?"".concat(n("workouts:distance"),": ").concat(e," km"):"".concat(n("workouts:duration"),": ").concat(Object(D.a)(e,"HH:mm:ss"))}})]})})}),Object(N.jsx)("div",{className:"chart-info",children:n("workouts:data from gpx, without any cleaning")})]}):n("workouts:No data to display")})}}]),a}(n.a.Component),Ve=Object(v.c)((function(e){return{chartData:e.chartData}}),(function(e){return{loadWorkoutData:function(t){e(function(e){return function(t){if(e)return q.getData("workouts/".concat(e,"/chart_data")).then((function(e){"success"===e.status?t(Pe(we(e.data.chart_data))):t(V("workouts|".concat(e.message)))})).catch((function(e){return t(V("workouts|".concat(e)))}));t(Pe(null))}}(t))},loadSegmentData:function(t,a){e(function(e,t){return function(a){if(e)return q.getData("workouts/".concat(e,"/chart_data/segment/").concat(t)).then((function(e){"success"===e.status?a(Pe(we(e.data.chart_data))):a(V("workouts|".concat(e.message)))})).catch((function(e){return a(V("workouts|".concat(e)))}));a(Pe(null))}}(t,a))}}}))(Ge);function Je(e){var t=e.t,a=e.workout;return Object(N.jsx)("div",{className:"container",children:a.weather_start&&a.weather_end&&Object(N.jsxs)("table",{className:"table table-borderless weather-table text-center",children:[Object(N.jsx)("thead",{children:Object(N.jsxs)("tr",{children:[Object(N.jsx)("th",{}),Object(N.jsxs)("th",{children:[t("workouts:Start"),Object(N.jsx)("br",{}),Object(N.jsx)("img",{className:"weather-img",src:"/img/weather/".concat(a.weather_start.icon,".png"),alt:"workout weather (".concat(a.weather_start.icon,")"),title:a.weather_start.summary})]}),Object(N.jsxs)("th",{children:[t("workouts:End"),Object(N.jsx)("br",{}),Object(N.jsx)("img",{className:"weather-img",src:"/img/weather/".concat(a.weather_end.icon,".png"),alt:"workout weather (".concat(a.weather_end.icon,")"),title:a.weather_end.summary})]})]})}),Object(N.jsxs)("tbody",{children:[Object(N.jsxs)("tr",{children:[Object(N.jsx)("td",{children:Object(N.jsx)("img",{className:"weather-img-small",src:"/img/weather/temperature.png",alt:"Temperatures"})}),Object(N.jsxs)("td",{children:[Number(a.weather_start.temperature).toFixed(1),"\xb0C"]}),Object(N.jsxs)("td",{children:[Number(a.weather_end.temperature).toFixed(1),"\xb0C"]})]}),Object(N.jsxs)("tr",{children:[Object(N.jsx)("td",{children:Object(N.jsx)("img",{className:"weather-img-small",src:"/img/weather/pour-rain.png",alt:"Temperatures"})}),Object(N.jsxs)("td",{children:[Number(100*a.weather_start.humidity).toFixed(1),"%"]}),Object(N.jsxs)("td",{children:[Number(100*a.weather_end.humidity).toFixed(1),"%"]})]}),Object(N.jsxs)("tr",{children:[Object(N.jsx)("td",{children:Object(N.jsx)("img",{className:"weather-img-small",src:"/img/weather/breeze.png",alt:"Temperatures"})}),Object(N.jsxs)("td",{children:[Number(a.weather_start.wind).toFixed(1),"m/s"]}),Object(N.jsxs)("td",{children:[Number(a.weather_end.wind).toFixed(1),"m/s"]})]})]})]})})}function Ke(e){var t=e.t,a=e.workout,s="0:00:00"!==a.pauses&&null!==a.pauses;return Object(N.jsxs)("div",{className:"workout-details",children:[Object(N.jsxs)("p",{children:[Object(N.jsx)("i",{className:"fa fa-clock-o custom-fa","aria-hidden":"true"}),t("workouts:Duration"),": ",a.moving,a.records&&a.records.find((function(e){return"LD"===e.record_type}))&&Object(N.jsx)("sup",{children:Object(N.jsx)("i",{className:"fa fa-trophy custom-fa","aria-hidden":"true"})}),s&&Object(N.jsxs)("span",{children:[Object(N.jsx)("br",{}),"(",t("workouts:pauses"),": ",a.pauses,","," ",t("workouts:total duration"),": ",a.duration,")"]})]}),Object(N.jsxs)("p",{children:[Object(N.jsx)("i",{className:"fa fa-road custom-fa","aria-hidden":"true"}),t("workouts:Distance"),": ",a.distance," km",a.records&&a.records.find((function(e){return"FD"===e.record_type}))&&Object(N.jsx)("sup",{children:Object(N.jsx)("i",{className:"fa fa-trophy custom-fa","aria-hidden":"true"})})]}),Object(N.jsxs)("p",{children:[Object(N.jsx)("i",{className:"fa fa-tachometer custom-fa","aria-hidden":"true"}),t("workouts:Average speed"),": ",a.ave_speed," km/h",a.records&&a.records.find((function(e){return"AS"===e.record_type}))&&Object(N.jsx)("sup",{children:Object(N.jsx)("i",{className:"fa fa-trophy custom-fa","aria-hidden":"true"})}),Object(N.jsx)("br",{}),t("workouts:Max. speed"),": ",a.max_speed," km/h",a.records&&a.records.find((function(e){return"MS"===e.record_type}))&&Object(N.jsx)("sup",{children:Object(N.jsx)("i",{className:"fa fa-trophy custom-fa","aria-hidden":"true"})})]}),a.min_alt&&a.max_alt&&Object(N.jsxs)("p",{children:[Object(N.jsx)("i",{className:"fi-mountains custom-fa"}),t("workouts:Min. altitude"),": ",a.min_alt,"m",Object(N.jsx)("br",{}),t("workouts:Max. altitude"),": ",a.max_alt,"m"]}),a.ascent&&a.descent&&Object(N.jsxs)("p",{children:[Object(N.jsx)("i",{className:"fa fa-location-arrow custom-fa"}),t("workouts:Ascent"),": ",a.ascent,"m",Object(N.jsx)("br",{}),t("workouts:Descent"),": ",a.descent,"m"]}),Object(N.jsx)(Je,{workout:a,t:t})]})}var Ye=a(901),Xe=a(898),$e=a(917),Ze=a(899),Qe=a(900),et=a(241),tt=a.n(et);function at(e){var t=e.bounds,a=e.coordinates,s=e.jsonData,r=e.mapAttribution;return Object(Xe.a)().fitBounds(t),Object(N.jsxs)(N.Fragment,{children:[Object(N.jsx)($e.a,{attribution:r,url:"".concat(T,"workouts/map_tile/{s}/{z}/{x}/{y}.png")}),Object(N.jsx)(Ze.a,{data:s},tt()(s)),a.latitude&&Object(N.jsx)(Qe.a,{position:[a.latitude,a.longitude]})]})}var st=function(e){Object(x.a)(a,e);var t=Object(g.a)(a);function a(e,s){var r;return Object(f.a)(this,a),(r=t.call(this,e,s)).state={zoom:13},r}return Object(O.a)(a,[{key:"componentDidMount",value:function(){"workout"===this.props.dataType?this.props.loadWorkoutGpx(this.props.workout.id):this.props.loadSegmentGpx(this.props.workout.id,this.props.segmentId)}},{key:"componentDidUpdate",value:function(e){("workout"===this.props.dataType&&e.workout.id!==this.props.workout.id||"workout"===this.props.dataType&&"segment"===e.dataType)&&this.props.loadWorkoutGpx(this.props.workout.id),"segment"===this.props.dataType&&e.segmentId!==this.props.segmentId&&this.props.loadSegmentGpx(this.props.workout.id,this.props.segmentId)}},{key:"componentWillUnmount",value:function(){this.props.loadWorkoutGpx(null)}},{key:"render",value:function(){var e=this.props,t=e.coordinates,a=e.gpxContent,s=e.mapAttribution,r=e.workout,n=function(e){var t;if(e){var a=(new DOMParser).parseFromString(e,"text/xml");t=Oe.a.gpx(a)}return{jsonData:t}}(a).jsonData,o=[[r.bounds[0],r.bounds[1]],[r.bounds[2],r.bounds[3]]];return Object(N.jsx)("div",{children:n&&Object(N.jsx)(Ye.a,{zoom:this.state.zoom,bounds:o,boundsOptions:{padding:[10,10]},children:Object(N.jsx)(at,{bounds:o,coordinates:t,jsonData:n,mapAttribution:s})})})}}]),a}(n.a.Component),rt=Object(v.c)((function(e){return{gpxContent:e.gpx,mapAttribution:e.application.config.map_attribution}}),(function(e){return{loadWorkoutGpx:function(t){e(function(e){return function(t){if(e)return q.getData("workouts/".concat(e,"/gpx")).then((function(e){"success"===e.status?t(Te(e.data.gpx)):t(V("workouts|".concat(e.message)))})).catch((function(e){return t(V("workouts|".concat(e)))}));t(Te(null))}}(t))},loadSegmentGpx:function(t,a){e(function(e,t){return function(a){if(e)return q.getData("workouts/".concat(e,"/gpx/segment/").concat(t)).then((function(e){"success"===e.status?a(Te(e.data.gpx)):a(V("workouts|".concat(e.message)))})).catch((function(e){return a(V("workouts|".concat(e)))}));a(Te(null))}}(t,a))}}}))(st);function nt(e){var t=e.t;return Object(N.jsx)("div",{className:"workout-no-map text-center",children:t("workouts:No Map")})}function ot(e){var t=e.notes,a=e.t;return Object(N.jsx)("div",{className:"row",children:Object(N.jsx)("div",{className:"col",children:Object(N.jsx)("div",{className:"card workout-card",children:Object(N.jsxs)("div",{className:"card-body",children:["Notes",Object(N.jsx)("div",{className:"workout-notes",children:t||a("workouts:No notes")})]})})})})}function ct(e){var t=e.segments,a=e.t;return Object(N.jsx)("div",{className:"row",children:Object(N.jsx)("div",{className:"col",children:Object(N.jsx)("div",{className:"card workout-card",children:Object(N.jsxs)("div",{className:"card-body",children:[a("workouts:Segments"),Object(N.jsx)("div",{className:"workout-segments",children:Object(N.jsx)("ul",{children:t.map((function(e,t){return Object(N.jsxs)("li",{className:"workout-segments-list",children:[Object(N.jsxs)(ae.a,{to:"/workouts/".concat(e.workout_id,"/segment/").concat(t+1),children:[a("workouts:segment")," ",t+1]})," ","(",a("workouts:distance"),": ",e.distance," km,"," ",a("workouts:duration"),": ",e.duration,")"]},"segment-".concat(t))}))})})]})})})})}var it=function(e){Object(x.a)(a,e);var t=Object(g.a)(a);function a(e,s){var r;return Object(f.a)(this,a),(r=t.call(this,e,s)).state={displayModal:!1,coordinates:{latitude:null,longitude:null}},r}return Object(O.a)(a,[{key:"componentDidMount",value:function(){this.props.loadWorkout(this.props.match.params.workoutId)}},{key:"componentDidUpdate",value:function(e){e.match.params.workoutId!==this.props.match.params.workoutId&&this.props.loadWorkout(this.props.match.params.workoutId)}},{key:"displayModal",value:function(e){this.setState((function(t){return Object(S.a)(Object(S.a)({},t),{},{displayModal:e})}))}},{key:"updateCoordinates",value:function(e){var t=e&&e.length>0?{latitude:e[0].payload.latitude,longitude:e[0].payload.longitude}:{latitude:null,longitude:null};this.setState((function(e){return Object(S.a)(Object(S.a)({},e),{},{coordinates:t})}))}},{key:"render",value:function(){var e=this,t=this.props,a=t.message,s=t.onDeleteWorkout,r=t.sports,n=t.t,o=t.user,c=t.workouts,i=this.state,l=i.coordinates,d=i.displayModal,u=Object(he.a)(c,1)[0],m=u?u.title:n("workouts:Workout"),j=u?r.filter((function(e){return e.id===u.sport_id})):[],p=Object(he.a)(j,1)[0],h=parseInt(this.props.match.params.segmentId),b=h>=0?"segment":"workout";return Object(N.jsxs)("div",{className:"workout-page",children:[Object(N.jsx)(w.a,{children:Object(N.jsxs)("title",{children:["FitTrackee - ",m]})}),a?Object(N.jsx)(_,{message:a,t:n}):Object(N.jsxs)("div",{className:"container",children:[d&&Object(N.jsx)(He,{title:n("common:Confirmation"),text:n("workouts:Are you sure you want to delete this workout?"),confirm:function(){s(u.id),e.displayModal(!1)},close:function(){return e.displayModal(!1)}}),u&&p&&1===c.length&&Object(N.jsxs)("div",{children:[Object(N.jsx)("div",{className:"row",children:Object(N.jsx)("div",{className:"col",children:Object(N.jsxs)("div",{className:"card workout-card",children:[Object(N.jsx)("div",{className:"card-header",children:Object(N.jsx)(qe,{workout:u,dataType:b,segmentId:h,sport:p,t:n,title:m,user:o,displayModal:function(){return e.displayModal(!0)}})}),Object(N.jsx)("div",{className:"card-body",children:Object(N.jsxs)("div",{className:"row",children:[Object(N.jsx)("div",{className:"col-md-8",children:u.with_gpx?Object(N.jsx)(rt,{workout:u,coordinates:l,dataType:b,segmentId:h}):Object(N.jsx)(nt,{t:n})}),Object(N.jsx)("div",{className:"col",children:Object(N.jsx)(Ke,{workout:"workout"===b?u:u.segments[h-1],t:n})})]})})]})})}),u.with_gpx&&Object(N.jsx)("div",{className:"row",children:Object(N.jsx)("div",{className:"col",children:Object(N.jsx)("div",{className:"card workout-card",children:Object(N.jsx)("div",{className:"card-body",children:Object(N.jsx)("div",{className:"row",children:Object(N.jsxs)("div",{className:"col",children:[Object(N.jsx)("div",{className:"chart-title",children:n("workouts:Chart")}),Object(N.jsx)(Ve,{workout:u,dataType:b,segmentId:h,t:n,updateCoordinates:function(t){return e.updateCoordinates(t)}})]})})})})})}),"workout"===b&&Object(N.jsxs)(N.Fragment,{children:[Object(N.jsx)(ot,{notes:u.notes,t:n}),u.segments.length>1&&Object(N.jsx)(ct,{segments:u.segments,t:n})]})]})]})]})}}]),a}(n.a.Component),lt=Object(y.a)()(Object(v.c)((function(e){return{workouts:e.workouts.data,message:e.message,sports:e.sports.data,user:e.user}}),(function(e){return{loadWorkout:function(t){e(X("getData","workouts",{id:t}))},onDeleteWorkout:function(t){var a;e((a=t,function(e){return q.deleteData("workouts",a).then((function(t){var s;204===t.status?Promise.resolve(e((s=a,{type:"REMOVE_WORKOUT",workoutId:s}))).then((function(){return e(Ce())})).then((function(){return Ws.push("/")})):e(V("workouts|".concat(t.status)))})).catch((function(t){return e(V("workouts|".concat(t)))}))}))}}}))(it)),dt=function(e){Object(x.a)(a,e);var t=Object(g.a)(a);function a(){return Object(f.a)(this,a),t.apply(this,arguments)}return Object(O.a)(a,[{key:"componentDidMount",value:function(){this.props.loadWorkout(this.props.match.params.workoutId)}},{key:"render",value:function(){var e=this.props,t=e.message,a=e.sports,s=e.workouts,r=Object(he.a)(s,1)[0];return Object(N.jsx)("div",{children:a.length>0&&Object(N.jsx)(Ie,{workout:r,message:t,sports:a})})}}]),a}(n.a.Component),ut=Object(v.c)((function(e){return{workouts:e.workouts.data,message:e.message,sports:e.sports.data,user:e.user}}),(function(e){return{loadWorkout:function(t){e(X("getData","workouts",{id:t}))}}}))(dt);var mt=Object(v.c)((function(e){return{user:e.user}}))((function(){return Object(N.jsx)("div",{children:F()?Object(N.jsxs)(k.d,{children:[Object(N.jsx)(k.b,{exact:!0,path:"/workouts/add",component:We}),Object(N.jsx)(k.b,{exact:!0,path:"/workouts/:workoutId",component:lt}),Object(N.jsx)(k.b,{exact:!0,path:"/workouts/:workoutId/edit",component:ut}),Object(N.jsx)(k.b,{path:"/workouts/:workoutId/segment/:segmentId",component:lt}),Object(N.jsx)(k.b,{component:me})]}):Object(N.jsx)(k.a,{to:"/login"})})})),jt=function(e){Object(x.a)(a,e);var t=Object(g.a)(a);function a(){return Object(f.a)(this,a),t.apply(this,arguments)}return Object(O.a)(a,[{key:"render",value:function(){var e=this.props.t;return Object(N.jsx)("div",{className:"card text-center",children:Object(N.jsxs)("div",{className:"card-body",children:[e("common:No workouts.")," ",Object(N.jsx)(ae.a,{to:{pathname:"/workouts/add"},children:e("dashboard:Upload one !")})]})})}}]),a}(n.a.PureComponent),pt=function(e){Object(x.a)(a,e);var t=Object(g.a)(a);function a(){return Object(f.a)(this,a),t.apply(this,arguments)}return Object(O.a)(a,[{key:"render",value:function(){var e=this.props,t=e.loadWorkouts,a=e.sports,s=e.t,r=e.updateParams,n=Ne(a,s);return Object(N.jsx)("div",{className:"card",children:Object(N.jsx)("div",{className:"card-body workout-filter",children:Object(N.jsxs)("form",{onSubmit:function(e){return e.preventDefault()},children:[Object(N.jsxs)("div",{className:"form-group",children:[Object(N.jsxs)("label",{children:[s("workouts:From"),":",Object(N.jsx)("input",{className:"form-control col-md",name:"from",onChange:function(e){return r(e)},type:"date"})]}),Object(N.jsxs)("label",{children:[s("workouts:To"),":",Object(N.jsx)("input",{className:"form-control col-md",name:"to",onChange:function(e){return r(e)},type:"date"})]})]}),Object(N.jsx)("div",{className:"form-group",children:Object(N.jsxs)("label",{children:[s("common:Sport"),":",Object(N.jsxs)("select",{className:"form-control input-lg",name:"sport_id",onChange:function(e){return r(e)},children:[Object(N.jsx)("option",{value:""}),n.map((function(e){return Object(N.jsx)("option",{value:e.id,children:e.label},e.id)}))]})]})}),Object(N.jsx)("div",{className:"form-group",children:Object(N.jsxs)("label",{children:[s("workouts:Distance")," (km):",Object(N.jsx)("div",{className:"container",children:Object(N.jsxs)("div",{className:"row",children:[Object(N.jsx)("div",{className:"col-5",children:Object(N.jsx)("input",{className:"form-control",min:0,name:"distance_from",onChange:function(e){return r(e)},step:"1",type:"number"})}),Object(N.jsx)("div",{className:"col-2 align-middle text-center",children:s("common:to")}),Object(N.jsx)("div",{className:"col-5",children:Object(N.jsx)("input",{className:"form-control",min:0,name:"distance_to",onChange:function(e){return r(e)},step:"1",type:"number"})})]})})]})}),Object(N.jsx)("div",{className:"form-group",children:Object(N.jsxs)("label",{children:[s("workouts:Duration"),":",Object(N.jsx)("div",{className:"container",children:Object(N.jsxs)("div",{className:"row",children:[Object(N.jsx)("div",{className:"col-5",children:Object(N.jsx)("input",{className:"form-control",name:"duration_from",onChange:function(e){return r(e)},pattern:"^([0-9]*[0-9]):([0-5][0-9])$",placeholder:"hh:mm",type:"text"})}),Object(N.jsx)("div",{className:"col-2 align-middle text-center",children:s("common:to")}),Object(N.jsx)("div",{className:"col-5",children:Object(N.jsx)("input",{className:"form-control",name:"duration_to",onChange:function(e){return r(e)},pattern:"^([0-9]*[0-9]):([0-5][0-9])$",placeholder:"hh:mm",type:"text"})})]})})]})}),Object(N.jsx)("div",{className:"form-group",children:Object(N.jsxs)("label",{children:[s("workouts:Average speed")," (km/h):",Object(N.jsx)("div",{className:"container",children:Object(N.jsxs)("div",{className:"row",children:[Object(N.jsx)("div",{className:"col-5",children:Object(N.jsx)("input",{className:"form-control",min:0,name:"ave_speed_from",onChange:function(e){return r(e)},step:"1",type:"number"})}),Object(N.jsx)("div",{className:"col-2 align-middle text-center",children:s("common:to")}),Object(N.jsx)("div",{className:"col-5",children:Object(N.jsx)("input",{className:"form-control",min:0,name:"ave_speed_to",onChange:function(e){return r(e)},step:"1",type:"number"})})]})})]})}),Object(N.jsx)("div",{className:"form-group",children:Object(N.jsxs)("label",{children:[s("workouts:Max. speed")," (km/h):",Object(N.jsx)("div",{className:"container",children:Object(N.jsxs)("div",{className:"row",children:[Object(N.jsx)("div",{className:"col-5",children:Object(N.jsx)("input",{className:"form-control",min:0,name:"max_speed_from",onChange:function(e){return r(e)},step:"1",type:"number"})}),Object(N.jsx)("div",{className:"col-2 align-middle text-center",children:s("common:to")}),Object(N.jsx)("div",{className:"col-5",children:Object(N.jsx)("input",{className:"form-control",min:0,name:"max_speed_to",onChange:function(e){return r(e)},step:"1",type:"number"})})]})})]})}),Object(N.jsx)("input",{className:"btn btn-primary btn-lg btn-block",onClick:function(){return t()},type:"submit",value:s("workouts:Filter")})]})})})}}]),a}(n.a.PureComponent),ht=function(e){Object(x.a)(a,e);var t=Object(g.a)(a);function a(){return Object(f.a)(this,a),t.apply(this,arguments)}return Object(O.a)(a,[{key:"render",value:function(){var e=this.props,t=e.display,a=e.workout;return Object(N.jsxs)("div",{className:"workout-map".concat("list"===t?"-list":""),children:[Object(N.jsx)("img",{src:"".concat(T,"workouts/map/").concat(a.map,"?").concat(Date.now()),alt:"workout map"}),Object(N.jsxs)("div",{className:"map-attribution".concat("list"===t?"-list":""),children:[Object(N.jsx)("span",{className:"map-attribution-text",children:"\xa9"}),Object(N.jsx)("a",{className:"map-attribution-text",href:"http://www.openstreetmap.org/copyright",target:"_blank",rel:"noopener noreferrer",children:"OpenStreetMap"})]})]})}}]),a}(n.a.PureComponent),bt=function(e){Object(x.a)(a,e);var t=Object(g.a)(a);function a(){return Object(f.a)(this,a),t.apply(this,arguments)}return Object(O.a)(a,[{key:"render",value:function(){var e=this.props,t=e.loading,a=e.sports,s=e.t,r=e.user,n=e.workouts;return Object(N.jsx)("div",{className:"card workout-card",children:Object(N.jsxs)("div",{className:"card-body",children:[Object(N.jsxs)("table",{className:"table",children:[Object(N.jsx)("thead",{children:Object(N.jsxs)("tr",{children:[Object(N.jsx)("th",{scope:"col"}),Object(N.jsx)("th",{scope:"col",children:s("common:Workout")}),Object(N.jsx)("th",{scope:"col",children:s("workouts:Date")}),Object(N.jsx)("th",{scope:"col",children:s("workouts:Distance")}),Object(N.jsx)("th",{scope:"col",children:s("workouts:Duration")}),Object(N.jsx)("th",{scope:"col",children:s("workouts:Ave. speed")}),Object(N.jsx)("th",{scope:"col",children:s("workouts:Max. speed")})]})}),Object(N.jsx)("tbody",{children:!t&&a&&n.map((function(e,t){return Object(N.jsxs)("tr",{children:[Object(N.jsxs)("td",{children:[Object(N.jsx)("span",{className:"heading-span-absolute",children:s("common:Sport")}),Object(N.jsx)("img",{className:"workout-sport",src:a.filter((function(t){return t.id===e.sport_id})).map((function(e){return e.img})),alt:"workout sport logo"})]}),Object(N.jsxs)("td",{className:"workout-title",children:[Object(N.jsx)("span",{className:"heading-span-absolute",children:s("common:Workout")}),Object(N.jsx)(ae.a,{to:"/workouts/".concat(e.id),children:e.title}),e.map&&Object(N.jsx)(ht,{workout:e,display:"list"})]}),Object(N.jsxs)("td",{children:[Object(N.jsx)("span",{className:"heading-span-absolute",children:s("workouts:Date")}),Object(D.a)(U(e.workout_date,r.timezone),"dd/MM/yyyy HH:mm")]}),Object(N.jsxs)("td",{className:"text-right",children:[Object(N.jsx)("span",{className:"heading-span-absolute",children:s("workouts:Distance")}),Number(e.distance).toFixed(2)," km"]}),Object(N.jsxs)("td",{className:"text-right",children:[Object(N.jsx)("span",{className:"heading-span-absolute",children:s("workouts:Duration")}),e.moving]}),Object(N.jsxs)("td",{className:"text-right",children:[Object(N.jsx)("span",{className:"heading-span-absolute",children:s("workouts:Ave. speed")}),e.ave_speed," km/h"]}),Object(N.jsxs)("td",{className:"text-right",children:[Object(N.jsx)("span",{className:"heading-span-absolute",children:s("workouts:Max. speed")}),e.max_speed," km/h"]})]},t)}))})]}),t&&Object(N.jsx)("div",{className:"loader"})]})})}}]),a}(n.a.PureComponent),ft=function(e){Object(x.a)(a,e);var t=Object(g.a)(a);function a(e,s){var r;return Object(f.a)(this,a),(r=t.call(this,e,s)).state={params:{page:1,per_page:10}},r}return Object(O.a)(a,[{key:"componentDidMount",value:function(){this.props.loadWorkouts(this.state.params)}},{key:"setParams",value:function(e){var t=this.state.params;""===e.target.value?delete t[e.target.name]:t[e.target.name]=e.target.value,t.page=1,this.setState(t)}},{key:"render",value:function(){var e=this,t=this.props,a=t.loading,s=t.loadWorkouts,r=t.loadMoreWorkouts,n=t.message,o=t.sports,c=t.t,i=t.user,l=t.workouts,d=this.state.params,u=!(l.length>0)||null===l[l.length-1].previous_workout;return Object(N.jsxs)("div",{children:[Object(N.jsx)(w.a,{children:Object(N.jsxs)("title",{children:["FitTrackee - ",c("common:Workouts")]})}),n?Object(N.jsx)(_,{message:n,t:c}):Object(N.jsx)("div",{className:"container history",children:Object(N.jsxs)("div",{className:"row",children:[Object(N.jsx)("div",{className:"col-md-3",children:Object(N.jsx)(pt,{sports:o,loadWorkouts:function(){return s(d)},t:c,updateParams:function(t){return e.setParams(t)}})}),Object(N.jsxs)("div",{className:"col-md-9 workouts-result",children:[Object(N.jsx)(bt,{workouts:l,loading:a,sports:o,t:c,user:i}),!u&&Object(N.jsx)("input",{type:"submit",className:"btn btn-default btn-md btn-block",value:"Load more workouts",onClick:function(){d.page+=1,r(d),e.setState(d)}}),0===l.length&&Object(N.jsx)(jt,{t:c})]})]})})]})}}]),a}(n.a.Component),Ot=Object(y.a)()(Object(v.c)((function(e){return{workouts:e.workouts.data,loading:e.loading,message:e.message,sports:e.sports.data,user:e.user}}),(function(e){return{loadWorkouts:function(t){e(X("getData","workouts",t))},loadMoreWorkouts:function(t){e(Fe(t))}}}))(ft));var xt=Object(y.a)()(Object(v.c)((function(e){return{appConfig:e.application.config,pathname:e.router.location.pathname,message:e.message}}),(function(e){return{onDeletePicture:function(){e((function(e){return _e.deletePicture().then((function(t){return 204===t.status?e(Ee()):e(Se(t.message))})).catch((function(e){throw e}))}))},onUploadPicture:function(t){e(function(e){return function(t){e.preventDefault();var a=new FormData;return a.append("file",e.target.picture.files[0]),e.target.reset(),q.addDataWithFile("auth/picture",a).then((function(e){if("success"===e.status)return t(Ee());var a=413===e.status?"Error during picture update, file size exceeds max size.":e.message;return t(Se(a))})).catch((function(e){throw e}))}}(t))}}}))((function(e){var t=e.appConfig,a=e.displayModal,s=e.editable,r=e.isDeletable,n=e.message,o=e.onDeletePicture,c=e.onUploadPicture,i=e.pathname,l=e.t,d=e.user,u=d.created_at?Object(D.a)(new Date(d.created_at),"dd/MM/yyyy HH:mm"):"",m=d.birth_date?Object(D.a)(new Date(d.birth_date),"dd/MM/yyyy"):"",j=M(t.max_single_file_size);return Object(N.jsxs)("div",{children:[Object(N.jsx)(w.a,{children:Object(N.jsxs)("title",{children:["FitTrackee - ",l("user:Profile")]})}),Object(N.jsx)(_,{message:n,t:l}),Object(N.jsxs)("div",{className:"container",children:[Object(N.jsx)("h1",{className:"page-title",children:l("user:Profile")}),Object(N.jsx)("div",{className:"row",children:Object(N.jsx)("div",{className:"col-md-12",children:Object(N.jsxs)("div",{className:"card",children:[Object(N.jsx)("div",{className:"card-header userName",children:Object(N.jsx)("strong",{children:d.username})}),Object(N.jsxs)("div",{className:"card-body",children:[Object(N.jsxs)("div",{className:"row",children:[Object(N.jsxs)("div",{className:"col-md-8",children:[Object(N.jsxs)("p",{children:[Object(N.jsx)("span",{className:"user-label",children:l("user:Email")}),": ",d.email]}),Object(N.jsxs)("p",{children:[Object(N.jsx)("span",{className:"user-label",children:l("user:Registration Date")}),": ",u]}),Object(N.jsxs)("p",{children:[Object(N.jsx)("span",{className:"user-label",children:l("user:First Name")}),": ",d.first_name]}),Object(N.jsxs)("p",{children:[Object(N.jsx)("span",{className:"user-label",children:l("user:Last Name")}),": ",d.last_name]}),Object(N.jsxs)("p",{children:[Object(N.jsx)("span",{className:"user-label",children:l("user:Birth Date")}),": ",m]}),Object(N.jsxs)("p",{children:[Object(N.jsx)("span",{className:"user-label",children:l("user:Location")}),": ",d.location]}),Object(N.jsxs)("p",{children:[Object(N.jsx)("span",{className:"user-label",children:l("user:Bio")}),":"," ",d.bio]}),Object(N.jsxs)("p",{children:[Object(N.jsx)("span",{className:"user-label",children:l("user:Language")}),": ",d.language]}),Object(N.jsxs)("p",{children:[Object(N.jsx)("span",{className:"user-label",children:l("user:Timezone")}),": ",d.timezone]}),Object(N.jsxs)("p",{children:[Object(N.jsx)("span",{className:"user-label",children:l("user:First day of week")}),": ",d.weekm?l("user:Monday"):l("user:Sunday")]})]}),Object(N.jsxs)("div",{className:"col-md-4",children:[!0===d.picture&&Object(N.jsxs)("div",{children:[Object(N.jsx)("img",{alt:"Profile",src:"".concat(T,"users/").concat(d.username,"/picture")+"?".concat(Date.now()),className:"img-fluid App-profile-img-small"}),s&&Object(N.jsxs)(N.Fragment,{children:[Object(N.jsx)("br",{}),Object(N.jsx)("button",{type:"submit",onClick:function(){return o()},children:l("user:Delete picture")}),Object(N.jsx)("br",{}),Object(N.jsx)("br",{})]})]}),s&&Object(N.jsxs)("form",{encType:"multipart/form-data",onSubmit:function(e){return c(e)},children:[Object(N.jsx)("input",{type:"file",name:"picture",accept:".png,.jpg,.gif"}),Object(N.jsx)("br",{}),Object(N.jsx)("button",{type:"submit",children:l("user:Send")})," (max. size: ".concat(j,")")]})," "]})]}),s&&Object(N.jsx)("button",{className:"btn btn-primary",onClick:function(){return Ws.push("/profile/edit")},children:l("common:Edit")}),r&&Object(N.jsx)("button",{className:"btn btn-danger",onClick:function(){return a(!0)},children:l("user:Delete user account")}),Object(N.jsx)("button",{className:"btn btn-secondary",onClick:function(){return"/profile"===i?Ws.push("/"):Ws.go(-1)},children:l("/profile"===i?"common:Back to home":"common:Back")})]})]})})})]})]})})));var gt=Object(y.a)()(Object(v.c)((function(e){return{user:e.user}}))((function(e){var t=e.t,a=e.user;return Object(N.jsx)("div",{children:Object(N.jsx)(xt,{editable:!0,t:t,user:a})})}))),vt=a(902),kt=a(903),wt=a(904),yt=a(905),Nt=a(242),_t=a(247),St=a(906),Dt=a(907),Ct=a(113),Et=a(908),At=a(150);function Mt(e){var t=e.isDisabled,a=e.isMore,s=e.sportImg,r=e.workout;return Object(N.jsx)(ae.a,{className:"calendar-workout".concat(a),to:"/workouts/".concat(r.id),children:Object(N.jsxs)(N.Fragment,{children:[Object(N.jsx)("img",{alt:"workout sport logo",className:"workout-sport ".concat(t),src:s,title:r.title}),r.records.length>0&&Object(N.jsx)("sup",{children:Object(N.jsx)("i",{className:"fa fa-trophy custom-fa-small","aria-hidden":"true",title:r.records.map((function(e){return" ".concat(ge.filter((function(t){return t.record_type===e.record_type}))[0].label)}))})})]})})}var Tt=function(e){Object(x.a)(a,e);var t=Object(g.a)(a);function a(e,s){var r;return Object(f.a)(this,a),(r=t.call(this,e,s)).state={isHidden:!0},r}return Object(O.a)(a,[{key:"handleDisplayMore",value:function(){this.setState({isHidden:!this.state.isHidden})}},{key:"render",value:function(){var e=this,t=this.props,a=t.dayWorkouts,s=t.isDisabled,r=t.sports,n=this.state.isHidden;return Object(N.jsxs)("div",{children:[a.map((function(e){return Object(N.jsx)(Mt,{workout:e,isDisabled:s,isMore:"",sportImg:r.filter((function(t){return t.id===e.sport_id})).map((function(e){return e.img}))},e.id)})),a.length>2&&Object(N.jsx)("i",{className:"fa fa-".concat(n?"plus":"times"," calendar-more"),"aria-hidden":"true",onClick:function(){return e.handleDisplayMore()},title:"show more workouts"}),!n&&Object(N.jsx)("div",{className:"calendar-display-more",children:a.map((function(e){return Object(N.jsx)(Mt,{workout:e,isDisabled:s,isMore:"-more",sportImg:r.filter((function(t){return t.id===e.sport_id})).map((function(e){return e.img}))},e.id)}))})]})}}]),a}(n.a.Component),Pt=function(e,t){var a=Object(vt.a)(e),s=Object(kt.a)(e),r=t?1:0;return{start:Object(wt.a)(a,{weekStartsOn:r}),end:Object(yt.a)(s)}},zt=function(e){Object(x.a)(a,e);var t=Object(g.a)(a);function a(e,s){var r;Object(f.a)(this,a),r=t.call(this,e,s);var n=new Date;return r.state={currentMonth:n,startDate:Pt(n,e.weekm).start,endDate:Pt(n,e.weekm).end,weekStartOnMonday:e.weekm},r}return Object(O.a)(a,[{key:"componentDidMount",value:function(){this.props.loadMonthWorkouts(this.state.startDate,this.state.endDate)}},{key:"renderHeader",value:function(e){var t=this;return Object(N.jsxs)("div",{className:"header row flex-middle",children:[Object(N.jsx)("div",{className:"col col-start",onClick:function(){return t.handlePrevMonth()},children:Object(N.jsx)("i",{className:"fa fa-chevron-left","aria-hidden":"true"})}),Object(N.jsx)("div",{className:"col col-center",children:Object(N.jsx)("span",{children:Object(D.a)(this.state.currentMonth,"MMM yyyy",e)})}),Object(N.jsx)("div",{className:"col col-end",onClick:function(){return t.handleNextMonth()},children:Object(N.jsx)("i",{className:"fa fa-chevron-right","aria-hidden":"true"})})]})}},{key:"renderDays",value:function(e){for(var t=[],a=this.state.startDate,s=0;s<7;s++)t.push(Object(N.jsx)("div",{className:"col col-center",children:Object(D.a)(Object(Nt.a)(a,s),"EEE",e)},s));return Object(N.jsx)("div",{className:"days row",children:t})}},{key:"filterWorkouts",value:function(e){var t=this.props,a=t.workouts,s=t.user;return a?a.filter((function(t){return Object(_t.a)(U(t.workout_date,s.timezone),e)})).reverse():[]}},{key:"renderCells",value:function(){for(var e=this.state,t=e.currentMonth,a=e.startDate,s=e.endDate,r=e.weekStartOnMonday,n=this.props.sports,o=[],c=[],i=a,l="";i<=s;){for(var d=0;d<7;d++){l=Object(D.a)(i,"d");var u=this.filterWorkouts(i),m=Object(St.a)(i,t)?"":"-disabled",j=r?[5,6].includes(d):[0,6].includes(d);c.push(Object(N.jsx)("div",{className:"col cell ".concat(j?" weekend":"").concat(Object(Dt.a)(i)?" today":""),children:Object(N.jsxs)("div",{className:"img".concat(m),children:[Object(N.jsx)("span",{className:"number",children:l}),Object(N.jsx)(Tt,{dayWorkouts:u,isDisabled:m,sports:n})]})},i)),i=Object(Nt.a)(i,1)}o.push(Object(N.jsx)("div",{className:"row",children:c},i)),c=[]}return Object(N.jsx)("div",{className:"body",children:o})}},{key:"updateStateDate",value:function(e){var t=Pt(e,this.state.weekStartOnMonday),a=t.start,s=t.end;this.setState({currentMonth:e,startDate:a,endDate:s}),this.props.loadMonthWorkouts(a,s)}},{key:"handleNextMonth",value:function(){var e=Object(Ct.a)(this.state.currentMonth,1);this.updateStateDate(e)}},{key:"handlePrevMonth",value:function(){var e=Object(Et.a)(this.state.currentMonth,1);this.updateStateDate(e)}},{key:"render",value:function(){var e={locale:"fr"===this.props.language?At.fr:At.enGB};return Object(N.jsx)("div",{className:"card workout-card",children:Object(N.jsxs)("div",{className:"calendar",children:[this.renderHeader(e),this.renderDays(e),this.renderCells()]})})}}]),a}(n.a.Component),Ft=Object(v.c)((function(e){return{workouts:e.calendarWorkouts.data,language:e.language,sports:e.sports.data,user:e.user}}),(function(e){return{loadMonthWorkouts:function(t,a){var s,r,n="yyyy-MM-dd";e((s=Object(D.a)(t,n),r=Object(D.a)(a,n),function(e){return q.getData("workouts",{from:s,to:r,order:"desc",per_page:100}).then((function(t){"success"===t.status?e({type:"UPDATE_CALENDAR",workouts:t.data.workouts}):e(V("workouts|".concat(t.message)))})).catch((function(t){return e(V("workouts|".concat(t)))}))}))}}}))(zt);function Rt(e){var t=e.records,a=e.sports,s=e.t,r=e.user,n=Ne(a,s),o=t.reduce((function(e,t){var a=n.find((function(e){return e.id===t.sport_id}));return void 0===e[a.label]&&(e[a.label]={img:a.img,records:[]}),e[a.label].records.push(function(e,t){var a;switch(e.record_type){case"AS":case"MS":a="".concat(e.value," km/h");break;case"FD":a="".concat(e.value," km");break;default:a=e.value}var s=ge.filter((function(t){return t.record_type===e.record_type})),r=Object(he.a)(s,1)[0];return{workout_date:ve(U(e.workout_date,t)).workout_date,workout_id:e.workout_id,id:e.id,record_type:r.label,value:a}}(t,r.timezone)),e}),{});return Object(N.jsxs)("div",{className:"card workout-card",children:[Object(N.jsx)("div",{className:"card-header",children:s("workouts:Personal records")}),Object(N.jsx)("div",{className:"card-body",children:0===Object.keys(o).length?s("common:No records."):Object.keys(o).sort().map((function(e){return Object(N.jsxs)("div",{children:[Object(N.jsxs)("span",{className:"heading-span",children:[Object(N.jsx)("img",{alt:"".concat(e," logo"),className:"record-logo",src:o[e].img}),e]}),Object(N.jsxs)("table",{className:"table table-borderless table-sm record-table",children:[Object(N.jsx)("thead",{children:Object(N.jsx)("tr",{children:Object(N.jsxs)("th",{colSpan:"3",children:[Object(N.jsx)("img",{alt:"".concat(e," logo"),className:"record-logo",src:o[e].img}),e]})})}),Object(N.jsx)("tbody",{children:o[e].records.map((function(e){return Object(N.jsxs)("tr",{className:"record-tr",children:[Object(N.jsx)("td",{className:"record-td",children:s("workouts:".concat(e.record_type))}),Object(N.jsx)("td",{className:"record-td text-right",children:e.value}),Object(N.jsx)("td",{className:"record-td text-right",children:Object(N.jsx)(ae.a,{to:"/workouts/".concat(e.workout_id),children:e.workout_date})})]},e.id)}))})]})]},e)}))})]})}var Lt=a(243),Ut=a(909),It=[{duration:"week",dateFormat:"yyyy-MM-dd",xAxis:"dd/MM"},{duration:"month",dateFormat:"yyyy-MM",xAxis:"MM/yyyy"},{duration:"year",dateFormat:"yyyy",xAxis:"yyyy"}],Wt=function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],a="0";t&&(a=String(Math.floor(e/86400)),e%=86400);var s=String(Math.floor(e/3600)).padStart(2,"0");e%=3600;var r=String(Math.floor(e/60)).padStart(2,"0"),n=String(e%60).padStart(2,"0");return t?"".concat("0"===a?"":"".concat(a,"d:")).concat("00"===s?"":"".concat(s,"h:")).concat(r,"m:").concat(n,"s"):"".concat("00"===s?"":"".concat(s,":")).concat(r,":").concat(n)},Ht=function(e,t){return 0===t?"":"distance"===e?"".concat(t.toFixed(2)," km"):"duration"===e?Wt(t):t},qt=function(e,t){switch(e){case"week":return Object(Nt.a)(t,7);case"year":return Object(Lt.a)(t,1);case"month":default:return Object(Ct.a)(t,1)}},Bt=function(e,t,a,s,r){for(var n=[],o=[],c=[],i=function(r){var i=It.filter((function(e){return e.duration===a.duration})),l=Object(he.a)(i,1)[0],d=Object(D.a)(r,l.dateFormat),u=Object(D.a)(r,l.xAxis),m={date:u},j={date:u},p={date:u};e[d]&&Object.keys(e[d]).filter((function(e){return!s||s.includes(+e)})).map((function(a){var s=t.filter((function(e){return e.id===+a}))[0].label;return m[s]=e[d][a].nb_workouts,j[s]=e[d][a].total_distance,p[s]=e[d][a].total_duration,null})),n.push(m),o.push(j),c.push(p)},l=function(e,t,a){switch(e){case"week":return Object(wt.a)(t,{weekStartsOn:a?1:0});case"year":return Object(Ut.a)(t);case"month":default:return Object(vt.a)(t)}}(a.duration,a.start,r);l<=a.end;l=qt(a.duration,l))i(l);return{workouts:n,distance:o,duration:c}},Gt=function(e,t){return"duration"===e?Wt(t,!0):"distance"===e?t.toFixed(2):t};function Vt(e){if(e.active){var t=e.displayedData,a=e.payload,s=e.label,r=0;return a.map((function(e){return r+=e.value})),Object(N.jsxs)("div",{className:"custom-tooltip",children:[Object(N.jsx)("p",{className:"custom-tooltip-label",children:s}),a.map((function(e){return Object(N.jsxs)("p",{style:{color:e.fill},children:[e.name,": ",Gt(t,e.value)," ",e.unit]},e.name)})),a.length>0&&Object(N.jsxs)("p",{children:["Total: ",Gt(t,r)]})]})}return null}function Jt(e){var t=e.displayedData,a=e.x,s=e.y,r=e.width,n=e.value;if(!n)return null;var o=Ht(t,n);return Object(N.jsx)("g",{children:Object(N.jsx)("text",{x:a+r/2,y:s-10,fill:"#666",fontSize:"11",textAnchor:"middle",dominantBaseline:"middle",children:o})})}var Kt=function(e){Object(x.a)(a,e);var t=Object(g.a)(a);function a(e,s){var r;return Object(f.a)(this,a),(r=t.call(this,e,s)).state={displayedData:"distance"},r}return Object(O.a)(a,[{key:"handleRadioChange",value:function(e){this.setState({displayedData:e.target.name})}},{key:"render",value:function(){var e=this,t=this.state.displayedData,a=this.props,s=a.sports,r=a.stats,n=a.t;return 0===Object.keys(r).length?n("common:No workouts."):Object(N.jsxs)("div",{className:"chart-stats",children:[Object(N.jsxs)("div",{className:"row chart-radio",children:[Object(N.jsxs)("label",{className:"radioLabel col",children:[Object(N.jsx)("input",{type:"radio",name:"distance",checked:"distance"===t,onChange:function(t){return e.handleRadioChange(t)}}),n("statistics:distance")]}),Object(N.jsxs)("label",{className:"radioLabel col",children:[Object(N.jsx)("input",{type:"radio",name:"duration",checked:"duration"===t,onChange:function(t){return e.handleRadioChange(t)}}),n("statistics:duration")]}),Object(N.jsxs)("label",{className:"radioLabel col",children:[Object(N.jsx)("input",{type:"radio",name:"workouts",checked:"workouts"===t,onChange:function(t){return e.handleRadioChange(t)}}),n("statistics:workouts")]})]}),Object(N.jsx)(Be.f,{height:300,children:Object(N.jsxs)(Be.c,{data:r[t],margin:{top:15,bottom:0},children:[Object(N.jsx)(Be.h,{dataKey:"date",interval:0}),Object(N.jsx)(Be.i,{tickFormatter:function(e){return Ht(t,e)}}),Object(N.jsx)(Be.g,{content:Object(N.jsx)(Vt,{displayedData:t})}),s.map((function(e,a){return Object(N.jsx)(Be.b,{isAnimationActive:!1,dataKey:e.label,stackId:"a",fill:xe[a],label:a===s.length-1?Object(N.jsx)(Jt,{displayedData:t}):"",name:n("sports:".concat(e.label))},e.id)}))]})})]})}}]),a}(n.a.PureComponent),Yt=function(e){Object(x.a)(a,e);var t=Object(g.a)(a);function a(){return Object(f.a)(this,a),t.apply(this,arguments)}return Object(O.a)(a,[{key:"componentDidMount",value:function(){this.updateData()}},{key:"componentDidUpdate",value:function(e){(this.props.user.username&&this.props.user.username!==e.user.username||this.props.statsParams!==e.statsParams)&&this.updateData()}},{key:"updateData",value:function(){this.props.user.username&&this.props.loadWorkouts(this.props.user.username,this.props.user.weekm,this.props.statsParams)}},{key:"render",value:function(){var e=this.props,t=e.displayedSports,a=e.sports,s=e.statistics,r=e.statsParams,n=e.displayEmpty,o=e.t,c=e.user;if(!n&&0===Object.keys(s).length)return Object(N.jsx)("span",{children:o("common:No workouts.")});var i=Bt(s,a,r,t,c.weekm);return Object(N.jsx)(Kt,{sports:a,stats:i,t:o})}}]),a}(n.a.PureComponent),Xt=Object(v.c)((function(e){return{sports:e.sports.data,statistics:e.statistics.data,user:e.user}}),(function(e){return{loadWorkouts:function(t,a,s){var r="yyyy-MM-dd",n="week"===s.duration?"".concat(s.duration).concat(a?"m":""):s.duration,o={from:Object(D.a)(s.start,r),to:Object(D.a)(s.end,r),time:n};e(function(e,t,a){return function(s){return q.getData("stats/".concat(e,"/").concat(t),a).then((function(e){"success"===e.status?s(B("statistics",e.data)):s(V("statistics|".concat(e.message)))})).catch((function(e){return s(V("statistics|".concat(e)))}))}}(t,s.type,o))}}}))(Yt),$t=function(e){Object(x.a)(a,e);var t=Object(g.a)(a);function a(e,s){var r;Object(f.a)(this,a),r=t.call(this,e,s);var n=new Date;return r.state={start:Object(vt.a)(n),end:Object(kt.a)(n),duration:"week",type:"by_time"},r}return Object(O.a)(a,[{key:"render",value:function(){var e=this.props.t;return Object(N.jsxs)("div",{className:"card workout-card",children:[Object(N.jsx)("div",{className:"card-header",children:e("dashboard:This month")}),Object(N.jsx)("div",{className:"card-body",children:Object(N.jsx)(Xt,{displayEmpty:!1,statsParams:this.state,t:e})})]})}}]),a}(n.a.Component);function Zt(e){var t=e.t,a=e.user,s=a.total_duration.match(/day/g)?"".concat(a.total_duration.split(" ")[0]," ").concat(a.total_duration.match(/days/g)?t("common:days"):t("common:day")):"0 ".concat(t("common:days"),","),r=a.total_duration.match(/day/g)?a.total_duration.split(", ")[1]:a.total_duration;return r="".concat(r.split(":")[0],"h ").concat(r.split(":")[1],"min"),Object(N.jsxs)("div",{className:"row",children:[Object(N.jsx)("div",{className:"col-lg-3 col-md-6 col-sm-6",children:Object(N.jsx)("div",{className:"card workout-card",children:Object(N.jsxs)("div",{className:"card-body row",children:[Object(N.jsx)("div",{className:"col-3",children:Object(N.jsx)("i",{className:"fa fa-calendar fa-3x fa-color"})}),Object(N.jsxs)("div",{className:"col-9 text-right",children:[Object(N.jsx)("div",{className:"huge",children:a.nb_workouts}),Object(N.jsx)("div",{children:"".concat(1===a.nb_workouts?t("common:workout"):t("common:workouts"))})]})]})})}),Object(N.jsx)("div",{className:"col-lg-3 col-md-6 col-sm-6",children:Object(N.jsx)("div",{className:"card workout-card",children:Object(N.jsxs)("div",{className:"card-body row",children:[Object(N.jsx)("div",{className:"col-3",children:Object(N.jsx)("i",{className:"fa fa-road fa-3x fa-color"})}),Object(N.jsxs)("div",{className:"col-9 text-right",children:[Object(N.jsx)("div",{className:"huge",children:Number(a.total_distance).toFixed(2)}),Object(N.jsx)("div",{children:"km"})]})]})})}),Object(N.jsx)("div",{className:"col-lg-3 col-md-6 col-sm-6",children:Object(N.jsx)("div",{className:"card workout-card",children:Object(N.jsxs)("div",{className:"card-body row",children:[Object(N.jsx)("div",{className:"col-3",children:Object(N.jsx)("i",{className:"fa fa-clock-o fa-3x fa-color"})}),Object(N.jsxs)("div",{className:"col-9 text-right",children:[Object(N.jsx)("div",{className:"huge",children:s}),Object(N.jsx)("div",{children:r})]})]})})}),Object(N.jsx)("div",{className:"col-lg-3 col-md-6 col-sm-6",children:Object(N.jsx)("div",{className:"card workout-card",children:Object(N.jsxs)("div",{className:"card-body row",children:[Object(N.jsx)("div",{className:"col-3",children:Object(N.jsx)("i",{className:"fa fa-tags fa-3x fa-color"})}),Object(N.jsxs)("div",{className:"col-9 text-right",children:[Object(N.jsx)("div",{className:"huge",children:a.nb_sports}),Object(N.jsx)("div",{children:"".concat(1===a.nb_sports?t("common:sport"):t("common:sports"))})]})]})})})]})}function Qt(e){var t=e.sports,a=e.t,s=e.user,r=e.workout;return Object(N.jsxs)("div",{className:"card workout-card text-center",children:[Object(N.jsx)("div",{className:"card-header",children:Object(N.jsxs)(ae.a,{to:"/workouts/".concat(r.id),children:[t.filter((function(e){return e.id===r.sport_id})).map((function(e){return a("sports:".concat(e.label))}))," ","-"," ",Object(D.a)(U(r.workout_date,s.timezone),"dd/MM/yyyy HH:mm")]})}),Object(N.jsx)("div",{className:"card-body",children:Object(N.jsxs)("div",{className:"row",children:[r.map&&Object(N.jsx)("div",{className:"col",children:Object(N.jsx)(ht,{workout:r})}),Object(N.jsx)("div",{className:"col",children:Object(N.jsxs)("p",{children:[Object(N.jsx)("i",{className:"fa fa-clock-o","aria-hidden":"true"})," ",a("workouts:Duration"),": ",r.moving,r.map?Object(N.jsxs)("span",{children:[Object(N.jsx)("br",{}),Object(N.jsx)("br",{})]}):" - ",Object(N.jsx)("i",{className:"fa fa-road","aria-hidden":"true"})," ",a("workouts:Distance"),": ",r.distance," km"]})})]})})]})}var ea=function(e){Object(x.a)(a,e);var t=Object(g.a)(a);function a(e,s){var r;return Object(f.a)(this,a),(r=t.call(this,e,s)).state={page:1},r}return Object(O.a)(a,[{key:"componentDidMount",value:function(){this.props.loadWorkouts()}},{key:"render",value:function(){var e=this,t=this.props,a=t.loadMoreWorkouts,s=t.message,r=t.records,n=t.sports,o=t.t,c=t.user,i=t.workouts,l=!(i.length>0)||null===i[i.length-1].previous_workout,d=this.state.page;return Object(N.jsxs)("div",{children:[Object(N.jsx)(w.a,{children:Object(N.jsxs)("title",{children:["FitTrackee - ",o("common:Dashboard")]})}),s?Object(N.jsx)(_,{message:s,t:o}):i&&c.total_duration&&n.length>0&&Object(N.jsxs)("div",{className:"container dashboard",children:[Object(N.jsx)(Zt,{user:c,t:o}),Object(N.jsxs)("div",{className:"row",children:[Object(N.jsxs)("div",{className:"col-md-4",children:[Object(N.jsx)($t,{t:o}),Object(N.jsx)(Rt,{t:o,records:r,sports:n,user:c})]}),Object(N.jsxs)("div",{className:"col-md-8",children:[Object(N.jsx)(Ft,{weekm:c.weekm}),i.length>0?i.map((function(e){return Object(N.jsx)(Qt,{workout:e,sports:n,t:o,user:c},e.id)})):Object(N.jsx)(jt,{t:o}),!l&&Object(N.jsx)("input",{type:"submit",className:"btn btn-default btn-md btn-block",value:"Load more workouts",onClick:function(){a(d+1),e.setState({page:d+1})}})]})]})]})]})}}]),a}(n.a.Component),ta=Object(y.a)()(Object(v.c)((function(e){return{workouts:e.workouts.data,message:e.message,records:e.records.data,sports:e.sports.data,user:e.user}}),(function(e){return{loadWorkouts:function(){e(X("getData","workouts",{page:1})),e(X("getData","records"))},loadMoreWorkouts:function(t){e(Fe({page:t}))}}}))(ea));function aa(){return Object(N.jsx)("footer",{className:"footer",children:Object(N.jsxs)("div",{className:"container",children:[Object(N.jsx)("strong",{children:"FitTrackee"})," v","0.4.6"," -"," ",Object(N.jsx)("a",{href:"https://github.com/SamR1/FitTrackee",target:"_blank",rel:"noopener noreferrer",children:"source code"})," ","under"," ",Object(N.jsx)("a",{href:"https://choosealicense.com/licenses/gpl-3.0/",target:"_blank",rel:"noopener noreferrer",children:"GPLv3"})," ","license -"," ",Object(N.jsx)("a",{href:"https://samr1.github.io/FitTrackee/",target:"_blank",rel:"noopener noreferrer",children:"documentation"})]})})}var sa,ra,na,oa,ca,ia,la,da,ua,ma,ja,pa,ha,ba=function(e){Object(x.a)(a,e);var t=Object(g.a)(a);function a(){return Object(f.a)(this,a),t.apply(this,arguments)}return Object(O.a)(a,[{key:"componentDidMount",value:function(){this.props.UserLogout()}},{key:"render",value:function(){return Object(N.jsx)("div",{className:"container dashboard",children:Object(N.jsxs)("div",{className:"row",children:[Object(N.jsx)("div",{className:"col-2"}),Object(N.jsx)("div",{className:"card col-8",children:Object(N.jsx)("div",{className:"card-body",children:Object(N.jsx)("div",{className:"text-center",children:Object(N.jsxs)(pe.a,{i18nKey:"user:loggedOut",children:["You are now logged out. Click ",Object(N.jsx)(ae.a,{to:"/login",children:"here"})," to log back in."]})})})}),Object(N.jsx)("div",{className:"col-2"})]})})}}]),a}(n.a.Component),fa=Object(v.c)((function(e){return{user:e.user}}),(function(e){return{UserLogout:function(){e({type:"LOGOUT"})}}}))(ba);function Oa(){return(Oa=Object.assign||function(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(s=0;s=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}function ga(e,t){var a=e.title,s=e.titleId,n=xa(e,["title","titleId"]);return r.createElement("svg",Oa({id:"Capa_1",enableBackground:"new 0 0 512 512",height:512,viewBox:"0 0 512 512",width:512,xmlns:"http://www.w3.org/2000/svg",ref:t,"aria-labelledby":s},n),a?r.createElement("title",{id:s},a):null,sa||(sa=r.createElement("path",{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",fill:"#f0f9ff"})),ra||(ra=r.createElement("path",{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",fill:"#f40055"})),na||(na=r.createElement("path",{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",fill:"#c20044"})),oa||(oa=r.createElement("path",{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",fill:"#f40055"})),ca||(ca=r.createElement("path",{d:"m313.425 313.425v9.557l181.765 151.211c7.683-6.204 13.288-14.874 15.613-24.796l-163.446-135.971z",fill:"#c20044"})),ia||(ia=r.createElement("path",{d:"m53.273 27.803 145.302 120.879v-120.879z",fill:"#406bd4"})),la||(la=r.createElement("path",{d:"m313.425 150.571v-122.768h148.082z",fill:"#3257b0"})),da||(da=r.createElement("path",{d:"m394.732 198.575 117.268-97.556v97.556z",fill:"#3257b0"})),ua||(ua=r.createElement("g",{fill:"#406bd4"},r.createElement("path",{d:"m0 99.317v99.258h119.313z"}),r.createElement("path",{d:"m0 313.425v97.699l117.44-97.699z"}),r.createElement("path",{d:"m50.49 484.197 148.085-122.676v122.676z"}))),ma||(ma=r.createElement("path",{d:"m313.425 484.197v-124.139l149.221 124.139z",fill:"#3257b0"})),ja||(ja=r.createElement("path",{d:"m512 409.423-115.395-95.998h115.395z",fill:"#3257b0"})),pa||(pa=r.createElement("path",{d:"m512 222.142h-222.142v-194.339h-67.716v194.339h-222.142v67.716h222.142v194.339h67.716v-194.339h222.142z",fill:"#f40055"})),ha||(ha=r.createElement("path",{d:"m289.858 222.142v-194.339h-33.858v456.394h33.858v-194.339h222.142v-67.716z",fill:"#c20044"})))}var va,ka,wa,ya,Na=r.forwardRef(ga);a.p;function _a(){return(_a=Object.assign||function(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(s=0;s=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}function Da(e,t){var a=e.title,s=e.titleId,n=Sa(e,["title","titleId"]);return r.createElement("svg",_a({id:"Capa_1",enableBackground:"new 0 0 512 512",height:512,viewBox:"0 0 512 512",width:512,xmlns:"http://www.w3.org/2000/svg",ref:t,"aria-labelledby":s},n),a?r.createElement("title",{id:s},a):null,va||(va=r.createElement("path",{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",fill:"#406bd4"})),ka||(ka=r.createElement("path",{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",fill:"#c20044"})),wa||(wa=r.createElement("path",{d:"m160.795 27.803h190.409v456.394h-190.409z",fill:"#f0f9ff"})),ya||(ya=r.createElement("path",{d:"m256 27.803h95.205v456.394h-95.205z",fill:"#cee5f5"})))}var Ca,Ea,Aa,Ma,Ta,Pa,za,Fa=r.forwardRef(Da),Ra=(a.p,[{name:"en",selected:!0,flag:Object(N.jsx)(Na,{})},{name:"fr",selected:!1,flag:Object(N.jsx)(Fa,{})}]),La=function(e){Object(x.a)(a,e);var t=Object(g.a)(a);function a(e){var s;return Object(f.a)(this,a),(s=t.call(this,e)).state={isOpen:!1},s}return Object(O.a)(a,[{key:"toggleDropdown",value:function(){this.setState((function(e){return{isOpen:!e.isOpen}}))}},{key:"render",value:function(){var e=this,t=this.state.isOpen,a=this.props,s=a.language,r=a.onUpdateLanguage;return Object(N.jsx)("div",{className:"dropdown-wrapper",onClick:function(){return e.toggleDropdown()},children:Object(N.jsx)("ul",{className:"dropdown-list i18n-flag",children:Ra.filter((function(e){return t?e:e.name===s})).map((function(e){return Object(N.jsxs)("li",{className:"dropdown-item".concat(e.name===s&&t?" dropdown-item-selected":""),onClick:function(){return r(e.name,s)},children:[e.flag," ",e.name]},e.name)}))})})}}]),a}(r.Component),Ua=Object(v.c)((function(e){return{language:e.language}}),(function(e){return{onUpdateLanguage:function(t,a){t!==a&&e($(t))}}}))(La),Ia=function(e){Object(x.a)(a,e);var t=Object(g.a)(a);function a(){return Object(f.a)(this,a),t.apply(this,arguments)}return Object(O.a)(a,[{key:"render",value:function(){var e=this.props,t=e.admin,a=e.isAuthenticated,s=e.picture,r=e.t,n=e.username;return Object(N.jsx)("header",{children:Object(N.jsx)("nav",{className:"navbar navbar-expand-lg navbar-light bg-light",children:Object(N.jsxs)("div",{className:"container",children:[Object(N.jsx)("span",{className:"navbar-brand",children:"FitTrackee"}),Object(N.jsx)("button",{className:"navbar-toggler",type:"button","data-toggle":"collapse","data-target":"#navbarSupportedContent","aria-controls":"navbarSupportedContent","aria-expanded":"false","aria-label":"Toggle navigation",children:Object(N.jsx)("span",{className:"navbar-toggler-icon"})}),Object(N.jsxs)("div",{className:"collapse navbar-collapse",id:"navbarSupportedContent",children:[Object(N.jsxs)("ul",{className:"navbar-nav mr-auto",children:[Object(N.jsx)("li",{className:"nav-item",children:Object(N.jsx)(ae.a,{className:"nav-link",to:{pathname:"/"},children:r("common:Dashboard")})}),a&&Object(N.jsx)("li",{className:"nav-item",children:Object(N.jsx)(ae.a,{className:"nav-link",to:{pathname:"/workouts/history"},children:r("Workouts")})}),a&&Object(N.jsx)("li",{className:"nav-item",children:Object(N.jsx)(ae.a,{className:"nav-link",to:{pathname:"/workouts/statistics"},children:r("common:Statistics")})}),t&&Object(N.jsx)("li",{className:"nav-item",children:Object(N.jsx)(ae.a,{className:"nav-link",to:{pathname:"/admin"},children:"Admin"})}),a&&Object(N.jsx)("li",{className:"nav-item",children:Object(N.jsx)(ae.a,{className:"nav-link",to:{pathname:"/workouts/add"},children:Object(N.jsx)("strong",{children:r("common:Add workout")})})})]}),Object(N.jsxs)("ul",{className:"navbar-nav flex-row ml-md-auto d-none d-md-flex",children:[!a&&Object(N.jsx)("li",{className:"nav-item",children:Object(N.jsx)(ae.a,{className:"nav-link",to:{pathname:"/register"},children:r("user:Register")})}),!a&&Object(N.jsx)("li",{className:"nav-item",children:Object(N.jsx)(ae.a,{className:"nav-link",to:{pathname:"/login"},children:r("user:Login")})}),a&&Object(N.jsxs)(N.Fragment,{children:[!0===s?Object(N.jsx)("img",{alt:"Avatar",src:"".concat(T,"users/").concat(n,"/picture?").concat(Date.now()),className:"img-fluid App-nav-profile-img"}):Object(N.jsx)("i",{className:"fa fa-user-circle-o fa-2x no-picture","aria-hidden":"true"}),Object(N.jsx)("li",{className:"nav-item",children:Object(N.jsx)(ae.a,{className:"nav-link",to:{pathname:"/profile"},children:n})}),Object(N.jsx)("li",{className:"nav-item",children:Object(N.jsx)(ae.a,{className:"nav-link",to:{pathname:"/logout"},children:r("user:Logout")})})]}),Object(N.jsx)("li",{children:Object(N.jsx)(Ua,{})})]})]})]})})})}}]),a}(n.a.PureComponent),Wa=Object(y.a)()(Object(v.c)((function(e){var t=e.user;return{admin:t.admin,isAuthenticated:t.isAuthenticated,picture:t.picture,username:t.username}}))(Ia));function Ha(){return(Ha=Object.assign||function(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(s=0;s=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}function Ba(e,t){var a=e.title,s=e.titleId,n=qa(e,["title","titleId"]);return r.createElement("svg",Ha({id:"Layer_1",xmlns:"http://www.w3.org/2000/svg",xmlnsXlink:"http://www.w3.org/1999/xlink",x:"0px",y:"0px",viewBox:"0 0 512.001 512.001",style:{enableBackground:"new 0 0 512.001 512.001"},xmlSpace:"preserve",ref:t,"aria-labelledby":s},n),a?r.createElement("title",{id:s},a):null,Ca||(Ca=r.createElement("g",null,r.createElement("g",null,r.createElement("path",{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"})))),Ea||(Ea=r.createElement("g",null,r.createElement("g",null,r.createElement("path",{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"})))),Aa||(Aa=r.createElement("g",null,r.createElement("g",null,r.createElement("path",{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"})))),Ma||(Ma=r.createElement("g",null,r.createElement("g",null,r.createElement("path",{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"})))),Ta||(Ta=r.createElement("g",null,r.createElement("g",null,r.createElement("path",{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"})))),Pa||(Pa=r.createElement("g",null,r.createElement("g",null,r.createElement("path",{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"})))),za||(za=r.createElement("g",null,r.createElement("g",null,r.createElement("path",{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"})))))}var Ga,Va=r.forwardRef(Ba);a.p;function Ja(){return(Ja=Object.assign||function(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(s=0;s=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}function Ya(e,t){var a=e.title,s=e.titleId,n=Ka(e,["title","titleId"]);return r.createElement("svg",Ja({id:"Capa_1",xmlns:"http://www.w3.org/2000/svg",xmlnsXlink:"http://www.w3.org/1999/xlink",x:"0px",y:"0px",viewBox:"0 0 345.834 345.834",style:{enableBackground:"new 0 0 345.834 345.834"},xmlSpace:"preserve",ref:t,"aria-labelledby":s},n),a?r.createElement("title",{id:s},a):null,Ga||(Ga=r.createElement("g",null,r.createElement("path",{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"}),r.createElement("path",{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"}),r.createElement("path",{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"}),r.createElement("path",{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"}))))}var Xa=r.forwardRef(Ya);a.p;function $a(e){var t=Object(ue.a)().t,a=e.action;return Object(N.jsx)("div",{className:"container dashboard",children:Object(N.jsxs)("div",{className:"row",children:[Object(N.jsx)("div",{className:"col-2"}),Object(N.jsx)("div",{className:"card col-8",children:Object(N.jsx)("div",{className:"card-body",children:Object(N.jsxs)("div",{className:"text-center ",children:["sent"===a&&Object(N.jsxs)(N.Fragment,{children:[Object(N.jsx)("div",{className:"svg-icon",children:Object(N.jsx)(Xa,{})}),t("user:Check your email. If your address is in our database, you'll received an email with a link to reset your password.")]}),"updated"===a&&Object(N.jsxs)(N.Fragment,{children:[Object(N.jsx)("div",{className:"svg-icon",children:Object(N.jsx)(Va,{})}),Object(N.jsxs)(pe.a,{i18nKey:"user:updatedPasswordText",children:["Your password have been updated. Click",Object(N.jsx)(ae.a,{to:"/login",children:"here"})," to log in."]})]})]})})}),Object(N.jsx)("div",{className:"col-2"})]})})}var Za=a(244),Qa=a.n(Za),es=function(e){Object(x.a)(a,e);var t=Object(g.a)(a);function a(e,s){var r;return Object(f.a)(this,a),(r=t.call(this,e,s)).state={formData:{},displayModal:!1},r}return Object(O.a)(a,[{key:"componentDidMount",value:function(){this.initForm()}},{key:"componentDidUpdate",value:function(e){e.user!==this.props.user&&this.initForm()}},{key:"initForm",value:function(){var e=this.props.user,t={};Object.keys(e).map((function(a){return null===e[a]?t[a]="":t[a]="birth_date"===a?Object(D.a)(new Date(e[a]),"yyyy-MM-DD"):e[a]})),this.setState({formData:t})}},{key:"handleFormChange",value:function(e){var t=this.state.formData;"weekm"===e.target.name?t.weekm="Monday"===e.target.value:t[e.target.name]=e.target.value,this.setState(t)}},{key:"displayModal",value:function(e){this.setState((function(t){return Object(S.a)(Object(S.a)({},t),{},{displayModal:e})}))}},{key:"render",value:function(){var e=this,t=this.props,a=t.message,s=t.onDeleteUser,r=t.onHandleProfileFormSubmit,n=t.t,o=t.user,c=this.state,i=c.displayModal,l=c.formData;return Object(N.jsxs)("div",{children:[Object(N.jsx)(w.a,{children:Object(N.jsxs)("title",{children:["FitTrackee - ",n("user:Profile Edition")]})}),l.isAuthenticated&&Object(N.jsxs)("div",{className:"container",children:[i&&Object(N.jsx)(He,{title:n("common:Confirmation"),text:n("user:Are you sure you want to delete your account? All data will be deleted, this cannot be undone."),confirm:function(){s(o.username),e.displayModal(!1)},close:function(){return e.displayModal(!1)}}),Object(N.jsx)("h1",{className:"page-title",children:n("user:Profile Edition")}),Object(N.jsxs)("div",{className:"row",children:[Object(N.jsx)("div",{className:"col-md-2"}),Object(N.jsx)("div",{className:"col-md-8",children:Object(N.jsxs)("div",{className:"card",children:[Object(N.jsx)("div",{className:"card-header",children:o.username}),Object(N.jsx)("div",{className:"card-body",children:Object(N.jsx)("div",{className:"row",children:Object(N.jsxs)("div",{className:"col-md-12",children:[Object(N.jsxs)("form",{onSubmit:function(e){e.preventDefault(),r(l)},children:[Object(N.jsx)("div",{className:"form-group",children:Object(N.jsxs)("label",{children:[n("user:Email"),":",Object(N.jsx)("input",{name:"email",className:"form-control input-lg",type:"text",value:l.email,readOnly:!0})]})}),Object(N.jsx)("div",{className:"form-group",children:Object(N.jsxs)("label",{children:[n("user:Registration Date"),":",Object(N.jsx)("input",{name:"createdAt",className:"form-control input-lg",type:"text",value:l.created_at,disabled:!0})]})}),Object(N.jsx)("div",{className:"form-group",children:Object(N.jsxs)("label",{children:[n("user:Password"),":",Object(N.jsx)("input",{name:"password",className:"form-control input-lg",type:"password",onChange:function(t){return e.handleFormChange(t)}})]})}),Object(N.jsx)("div",{className:"form-group",children:Object(N.jsxs)("label",{children:[n("user:Password Confirmation"),":",Object(N.jsx)("input",{name:"password_conf",className:"form-control input-lg",type:"password",onChange:function(t){return e.handleFormChange(t)}})]})}),Object(N.jsx)("hr",{}),Object(N.jsx)("div",{className:"form-group",children:Object(N.jsxs)("label",{children:[n("user:First Name"),":",Object(N.jsx)("input",{name:"first_name",className:"form-control input-lg",type:"text",value:l.first_name,onChange:function(t){return e.handleFormChange(t)}})]})}),Object(N.jsx)("div",{className:"form-group",children:Object(N.jsxs)("label",{children:[n("user:Last Name"),":",Object(N.jsx)("input",{name:"last_name",className:"form-control input-lg",type:"text",value:l.last_name,onChange:function(t){return e.handleFormChange(t)}})]})}),Object(N.jsx)("div",{className:"form-group",children:Object(N.jsxs)("label",{children:[n("user:Birth Date"),Object(N.jsx)("input",{name:"birth_date",className:"form-control input-lg",type:"date",value:l.birth_date,onChange:function(t){return e.handleFormChange(t)}})]})}),Object(N.jsx)("div",{className:"form-group",children:Object(N.jsxs)("label",{children:[n("user:Location"),":",Object(N.jsx)("input",{name:"location",className:"form-control input-lg",type:"text",value:l.location,onChange:function(t){return e.handleFormChange(t)}})]})}),Object(N.jsx)("div",{className:"form-group",children:Object(N.jsxs)("label",{children:[n("user:Bio"),":",Object(N.jsx)("textarea",{name:"bio",className:"form-control input-lg",maxLength:"200",value:l.bio,onChange:function(t){return e.handleFormChange(t)}})]})}),Object(N.jsx)("div",{className:"form-group",children:Object(N.jsxs)("label",{children:[n("user:Language"),":",Object(N.jsx)("select",{name:"language",className:"form-control input-lg",value:l.language,onChange:function(t){return e.handleFormChange(t)},children:Ra.map((function(e){return Object(N.jsx)("option",{value:e.name,children:e.name},e.name)}))})]})}),Object(N.jsx)("div",{className:"form-group",children:Object(N.jsxs)("label",{children:[n("user:Timezone"),":",Object(N.jsx)(Qa.a,{className:"form-control timezone-custom",onChange:function(t){var a={target:{name:"timezone",value:t||"Europe/Paris"}};e.handleFormChange(a)},value:l.timezone})]})}),Object(N.jsx)("div",{className:"form-group",children:Object(N.jsxs)("label",{children:[n("user:First day of week"),":",Object(N.jsxs)("select",{name:"weekm",className:"form-control input-lg",value:l.weekm?"Monday":"Sunday",onChange:function(t){return e.handleFormChange(t)},children:[Object(N.jsx)("option",{value:"Sunday",children:n("user:Sunday")}),Object(N.jsx)("option",{value:"Monday",children:n("user:Monday")})]})]})}),Object(N.jsx)("button",{type:"submit",className:"btn btn-primary",children:n("common:Submit")}),Object(N.jsx)("button",{className:"btn btn-danger",onClick:function(t){t.preventDefault(),e.displayModal(!0)},children:n("user:Delete my account")}),Object(N.jsx)("button",{type:"submit",className:"btn btn-secondary",onClick:function(){return Ws.push("/profile")},children:n("common:Cancel")})]}),Object(N.jsx)(_,{message:a,t:n})]})})})]})}),Object(N.jsx)("div",{className:"col-md-2"})]})]})]})}}]),a}(n.a.Component),ts=Object(y.a)()(Object(v.c)((function(e){return{location:e.router.location,message:e.message,user:e.user}}),(function(e){return{onDeleteUser:function(t){e(Me(t))},onHandleProfileFormSubmit:function(t){e(function(e){return function(t){return!e.password===e.password_conf?t(De("Password and password confirmation don't match.")):(delete e.id,q.postData("auth/profile/edit",e).then((function(e){if("success"===e.status)return t(Ee()),Ws.push("/profile");t(De(e.message))})).catch((function(e){throw e})))}}(t))}}}))(es)),as=a(910),ss=a(911),rs=a(912),ns=a(245),os=["week","month","year"],cs=function(e){Object(x.a)(a,e);var t=Object(g.a)(a);function a(e,s){var r;Object(f.a)(this,a),r=t.call(this,e,s);var n=new Date;return r.state={displayedSports:e.sports.map((function(e){return e.id})),statsParams:{start:Object(vt.a)(Object(Et.a)(n,11)),end:Object(kt.a)(n),duration:"month",type:"by_time"}},r}return Object(O.a)(a,[{key:"componentDidUpdate",value:function(e){this.props.sports!==e.sports&&this.updateDisplayedSports()}},{key:"updateDisplayedSports",value:function(){var e=this.props.sports;this.setState({displayedSports:e.map((function(e){return e.id}))})}},{key:"handleOnChangeDuration",value:function(e){var t=e.target.name,a=new Date,s="year"===t?Object(Ut.a)(Object(as.a)(a,9)):"week"===t?Object(vt.a)(Object(Et.a)(a,2)):Object(vt.a)(Object(Et.a)(a,11)),r="year"===t?Object(ss.a)(a):"week"===t?Object(yt.a)(a):Object(kt.a)(a);this.setState({statsParams:{duration:t,end:r,start:s,type:"by_time"}})}},{key:"handleOnChangeSports",value:function(e){var t=this.state.displayedSports;t.includes(e)?this.setState({displayedSports:t.filter((function(t){return t!==e}))}):this.setState({displayedSports:t.concat([e])})}},{key:"handleOnClickArrows",value:function(e){var t,a,s=this.state.statsParams,r=s.start,n=s.end,o=s.duration;e?(t="year"===o?Object(Ut.a)(Object(as.a)(r,1)):"week"===o?Object(wt.a)(Object(rs.a)(r,1)):Object(vt.a)(Object(Et.a)(r,1)),a="year"===o?Object(ss.a)(Object(as.a)(n,1)):"week"===o?Object(yt.a)(Object(rs.a)(n,1)):Object(kt.a)(Object(Et.a)(n,1))):(t="year"===o?Object(Ut.a)(Object(Lt.a)(r,1)):"week"===o?Object(wt.a)(Object(ns.a)(r,1)):Object(vt.a)(Object(Ct.a)(r,1)),a="year"===o?Object(ss.a)(Object(Lt.a)(n,1)):"week"===o?Object(yt.a)(Object(ns.a)(n,1)):Object(kt.a)(Object(Ct.a)(n,1))),this.setState({statsParams:{duration:o,end:a,start:t,type:"by_time"}})}},{key:"render",value:function(){var e=this,t=this.state,a=t.displayedSports,s=t.statsParams,r=this.props,n=r.sports,o=r.t,c=r.user,i=Ne(n.filter((function(e){return c.sports_list.includes(e.id)})),o);return Object(N.jsxs)(N.Fragment,{children:[Object(N.jsx)(w.a,{children:Object(N.jsxs)("title",{children:["FitTrackee - ",o("statistics:Statistics")]})}),Object(N.jsxs)("div",{className:"container dashboard",children:[Object(N.jsxs)("div",{className:"card workout-card",children:[Object(N.jsx)("div",{className:"card-header",children:o("statistics:Statistics")}),Object(N.jsxs)("div",{className:"card-body".concat(0===c.nb_workouts?" stats-disabled":""),children:[Object(N.jsxs)("div",{className:"chart-filters row",children:[Object(N.jsx)("div",{className:"col chart-arrows",children:Object(N.jsx)("p",{className:"text-center",children:Object(N.jsx)("i",{className:"fa fa-chevron-left","aria-hidden":"true",onClick:function(){return e.handleOnClickArrows(!0)}})})}),Object(N.jsx)("div",{className:"col-md-3 time-frames justify-content-around",children:os.map((function(t){return Object(N.jsx)("div",{className:"time-frame",children:Object(N.jsxs)("label",{children:[Object(N.jsx)("input",{type:"radio",id:t,name:t,checked:t===s.duration,onChange:function(t){return e.handleOnChangeDuration(t)}}),Object(N.jsx)("span",{children:o("statistics:".concat(t))})]})},t)}))}),Object(N.jsx)("div",{className:"col chart-arrows",children:Object(N.jsx)("p",{className:"text-center",children:Object(N.jsx)("i",{className:"fa fa-chevron-right","aria-hidden":"true",onClick:function(){return e.handleOnClickArrows(!1)}})})})]}),Object(N.jsx)(Xt,{displayEmpty:!0,displayedSports:a,statsParams:s,t:o}),Object(N.jsx)("div",{className:"row chart-workouts",children:i.map((function(t){return Object(N.jsxs)("label",{className:"col workout-label",children:[Object(N.jsx)("input",{type:"checkbox",checked:a.includes(t.id),name:t.label,onChange:function(){return e.handleOnChangeSports(t.id)}}),Object(N.jsx)("span",{style:{color:xe[t.id-1]},children:" ".concat(t.label)})]},t.id)}))})]})]}),0===c.nb_workouts&&Object(N.jsx)(jt,{t:o})]})]})}}]),a}(n.a.Component),is=Object(y.a)()(Object(v.c)((function(e){return{sports:e.sports.data,user:e.user}}))(cs));function ls(e){var t=Object(ue.a)().t,a="user:".concat(e.formType.charAt(0).toUpperCase()).concat(e.formType.slice(1));return Object(N.jsxs)("div",{children:[Object(N.jsx)(w.a,{children:Object(N.jsxs)("title",{children:["FitTrackee - ",t("user:".concat(e.formType))]})}),Object(N.jsx)("h1",{className:"page-title",children:t(a)}),Object(N.jsx)("div",{className:"container",children:Object(N.jsxs)("div",{className:"row",children:[Object(N.jsx)("div",{className:"col-md-3"}),Object(N.jsxs)("div",{className:"col-md-6",children:[Object(N.jsx)("br",{}),"register"!==e.formType||e.isRegistrationAllowed?Object(N.jsxs)(N.Fragment,{children:[Object(N.jsxs)("form",{onSubmit:function(t){return e.handleUserFormSubmit(t,e.formType)},children:["register"===e.formType&&Object(N.jsx)("div",{className:"form-group",children:Object(N.jsx)("input",{className:"form-control input-lg",name:"username",placeholder:t("user:Enter a username"),required:!0,type:"text",value:e.userForm.username,onChange:e.onHandleFormChange})}),"password reset"!==e.formType&&Object(N.jsx)("div",{className:"form-group",children:Object(N.jsx)("input",{className:"form-control input-lg",name:"email",placeholder:t("user:Enter an email address"),required:!0,type:"email",value:e.userForm.email,onChange:e.onHandleFormChange})}),"reset your password"!==e.formType&&Object(N.jsxs)(N.Fragment,{children:[Object(N.jsx)("div",{className:"form-group",children:Object(N.jsx)("input",{className:"form-control input-lg",name:"password",placeholder:t("user:Enter a password"),required:!0,type:"password",value:e.userForm.password,onChange:e.onHandleFormChange})}),"login"!==e.formType&&Object(N.jsx)("div",{className:"form-group",children:Object(N.jsx)("input",{className:"form-control input-lg",name:"password_conf",placeholder:t("user:Enter the password confirmation"),required:!0,type:"password",value:e.userForm.password_conf,onChange:e.onHandleFormChange})})]}),Object(N.jsx)("input",{type:"submit",className:"btn btn-primary btn-lg btn-block",value:t("Submit")})]}),Object(N.jsx)("p",{className:"password-forget",children:"login"===e.formType&&Object(N.jsx)(ae.a,{to:{pathname:"/password-reset/request"},children:t("user:Forgot password?")})})]}):Object(N.jsxs)("div",{className:"card",children:[Object(N.jsx)("div",{className:"card-body",children:"Registration is disabled."}),Object(N.jsx)("div",{className:"card-body",children:Object(N.jsx)("button",{type:"submit",className:"btn btn-secondary btn-lg btn-block",onClick:function(){return Ws.go(-1)},children:"Back"})})]})]}),Object(N.jsx)("div",{className:"col-md-3"})]})})]})}var ds=function(e){Object(x.a)(a,e);var t=Object(g.a)(a);function a(e,s){var r;return Object(f.a)(this,a),(r=t.call(this,e,s)).state={formData:{username:"",email:"",password:"",password_conf:""}},r}return Object(O.a)(a,[{key:"componentDidUpdate",value:function(e){e.location.pathname!==this.props.location.pathname&&this.emptyForm()}},{key:"emptyForm",value:function(){var e=this.state.formData;Object.keys(e).map((function(t){return e[t]=""})),this.setState(e)}},{key:"onHandleFormChange",value:function(e){var t=this.state.formData;t[e.target.name]=e.target.value,this.setState(t)}},{key:"render",value:function(){var e=this,t=this.props,a=t.formType,s=t.isRegistrationAllowed,r=t.message,n=t.messages,o=t.onHandleUserFormSubmit,c=t.t,i=this.state.formData,l=this.props.location.query.token;return Object(N.jsx)("div",{children:F()||"password reset"===a&&!l?Object(N.jsx)(k.a,{to:"/"}):Object(N.jsxs)("div",{children:[Object(N.jsx)(_,{message:r,messages:n,t:c}),Object(N.jsx)(ls,{isRegistrationAllowed:s,formType:a,userForm:i,onHandleFormChange:function(t){return e.onHandleFormChange(t)},handleUserFormSubmit:function(e){e.preventDefault(),"password reset"===a&&(i.token=l),o(i,a)}})]})})}}]),a}(n.a.Component),us=Object(y.a)()(Object(v.c)((function(e){return{isRegistrationAllowed:e.application.config.is_registration_enabled,location:e.router.location,message:e.message,messages:e.messages}}),(function(e){return{onHandleUserFormSubmit:function(t,a){e(Ae(t,a="password reset"===a?"password/update":"reset your password"===a?"password/reset-request":a))}}}))(ds)),ms=function(e){Object(x.a)(a,e);var t=Object(g.a)(a);function a(e,s){var r;return Object(f.a)(this,a),(r=t.call(this,e,s)).state={displayModal:!1},r}return Object(O.a)(a,[{key:"componentDidMount",value:function(){this.props.loadUser(this.props.match.params.userName)}},{key:"componentDidUpdate",value:function(e){e.match.params.userName!==this.props.match.params.userName&&this.props.loadUser(this.props.match.params.userName)}},{key:"displayModal",value:function(e){this.setState((function(t){return Object(S.a)(Object(S.a)({},t),{},{displayModal:e})}))}},{key:"render",value:function(){var e=this,t=this.props,a=t.t,s=t.currentUser,r=t.onDeleteUser,n=t.users,o=this.state.displayModal,c=Object(he.a)(n,1)[0],i=!!c&&s.username===c.username;return Object(N.jsxs)("div",{children:[o&&Object(N.jsx)(He,{title:a("common:Confirmation"),text:a("user:Are you sure you want to delete this account? All data will be deleted, this cannot be undone."),confirm:function(){r(c.username),e.displayModal(!1)},close:function(){return e.displayModal(!1)}}),c&&Object(N.jsx)(xt,{editable:i,isDeletable:s.admin&&!i,onDeleteUser:r,displayModal:function(t){return e.displayModal(t)},t:a,user:c})]})}}]),a}(n.a.Component),js=Object(y.a)()(Object(v.c)((function(e){return{currentUser:e.user,users:e.users.data}}),(function(e){return{onDeleteUser:function(t){e(Me(t,!0))},loadUser:function(t){e(X("getData","users",{username:t}))}}}))(ms)),ps=function(e){Object(x.a)(a,e);var t=Object(g.a)(a);function a(e){var s;return Object(f.a)(this,a),(s=t.call(this,e)).props=e,s}return Object(O.a)(a,[{key:"componentDidMount",value:function(){this.props.loadAppConfig()}},{key:"render",value:function(){return Object(N.jsxs)("div",{className:"App",children:[Object(N.jsx)(Wa,{}),Object(N.jsxs)(k.d,{children:[Object(N.jsx)(k.b,{exact:!0,path:"/",component:ta}),Object(N.jsx)(k.b,{exact:!0,path:"/register",render:function(){return Object(N.jsx)(us,{formType:"register"})}}),Object(N.jsx)(k.b,{exact:!0,path:"/login",render:function(){return Object(N.jsx)(us,{formType:"login"})}}),Object(N.jsx)(k.b,{exact:!0,path:"/password-reset",render:function(){return Object(N.jsx)(us,{formType:"password reset"})}}),Object(N.jsx)(k.b,{exact:!0,path:"/password-reset/request",render:function(){return Object(N.jsx)(us,{formType:"reset your password"})}}),Object(N.jsx)(k.b,{exact:!0,path:"/password-reset/sent",render:function(){return Object(N.jsx)($a,{action:"sent"})}}),Object(N.jsx)(k.b,{exact:!0,path:"/updated-password",render:function(){return Object(N.jsx)($a,{action:"updated"})}}),Object(N.jsx)(k.b,{exact:!0,path:"/password-reset/sent",component:$a}),Object(N.jsx)(k.b,{exact:!0,path:"/logout",component:fa}),Object(N.jsx)(k.b,{exact:!0,path:"/profile/edit",component:ts}),Object(N.jsx)(k.b,{exact:!0,path:"/profile",component:gt}),Object(N.jsx)(k.b,{exact:!0,path:"/workouts/history",component:Ot}),Object(N.jsx)(k.b,{exact:!0,path:"/workouts/statistics",component:is}),Object(N.jsx)(k.b,{exact:!0,path:"/users/:userName",component:js}),Object(N.jsx)(k.b,{path:"/workouts",component:mt}),Object(N.jsx)(k.b,{path:"/admin",component:je}),Object(N.jsx)(k.b,{component:me})]}),Object(N.jsx)(aa,{})]})}}]),a}(n.a.Component),hs=Object(v.c)((function(){return{}}),(function(e){return{loadAppConfig:function(){e(Q("config"))}}}))(ps),bs=a(85);function fs(e){var t=e.store,a=e.history,s=e.children;return Object(N.jsx)(v.a,{store:t,children:Object(N.jsx)(bs.a,{history:a,children:s})})}var Os=Boolean("localhost"===window.location.hostname||"[::1]"===window.location.hostname||window.location.hostname.match(/^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/));function xs(e){navigator.serviceWorker.register(e).then((function(e){e.onupdatefound=function(){var t=e.installing;t.onstatechange=function(){"installed"===t.state&&(navigator.serviceWorker.controller?console.log("New content is available; please refresh."):console.log("Content is cached for offline use."))}}})).catch((function(e){console.error("Error during service worker registration:",e)}))}var gs,vs={data:[]},ks={language:"en",message:"",messages:[],user:{isAuthenticated:!1},workouts:Object(S.a)({},vs),application:{statistics:{},config:{gpx_limit_import:null,is_registration_enabled:null,max_single_file_size:null,max_users:null,max_zip_file_size:null,registration:null}},calendarWorkouts:Object(S.a)({},vs),chartData:[],gpx:null,loading:!1,records:Object(S.a)({},vs),sports:Object(S.a)({},vs),statistics:{data:{}},users:Object(S.a)({},vs)},ws=function(e,t,a){return a.target!==t?e:"SET_DATA"===a.type?Object(S.a)(Object(S.a)({},e),{},{data:a.data[a.target]}):"SET_PAGINATED_DATA"===a.type?Object(S.a)(Object(S.a)({},e),{},{data:a.data[a.target],pagination:a.pagination}):e},ys=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:ks.workouts,t=arguments.length>1?arguments[1]:void 0;switch(t.type){case"LOGOUT":return ks.workouts;case"PUSH_WORKOUTS":return Object(S.a)(Object(S.a)({},e),{},{data:e.data.concat(t.workouts)});case"REMOVE_WORKOUT":return Object(S.a)(Object(S.a)({},e),{},{data:e.data.filter((function(e){return e.id!==t.workoutId}))});default:return ws(e,"workouts",t)}},Ns=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:ks.application,t=arguments.length>1?arguments[1]:void 0;return"SET_APP_CONFIG"===t.type?Object(S.a)(Object(S.a)({},e),{},{config:t.data}):"SET_APP_STATS"===t.type?Object(S.a)(Object(S.a)({},e),{},{statistics:t.data}):e},_s=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:ks.calendarWorkouts,t=arguments.length>1?arguments[1]:void 0;switch(t.type){case"LOGOUT":return ks.calendarWorkouts;case"UPDATE_CALENDAR":return Object(S.a)(Object(S.a)({},e),{},{data:t.workouts});default:return ws(e,"calendarWorkouts",t)}},Ss=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:ks.chartData,t=arguments.length>1?arguments[1]:void 0;return"SET_CHART_DATA"===t.type?t.chartData:e},Ds=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:ks.gpx,t=arguments.length>1?arguments[1]:void 0;return"SET_GPX"===t.type?t.gpxContent:e},Cs=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:ks.language,t=arguments.length>1?arguments[1]:void 0;return"SET_LANGUAGE"===t.type?t.language:e},Es=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:ks.loading,t=arguments.length>1?arguments[1]:void 0;return"SET_LOADING"===t.type?t.loading:e},As=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:ks.message,t=arguments.length>1?arguments[1]:void 0;switch(t.type){case"AUTH_ERROR":case"PROFILE_ERROR":case"PROFILE_UPDATE_ERROR":case"PICTURE_ERROR":case"SET_ERROR":return t.message;case"CLEAN_ALL_MESSAGES":case"LOGOUT":case"PROFILE_SUCCESS":case"SET_APP_CONFIG":case"SET_RESULTS":case"@@router/LOCATION_CHANGE":return"";default:return e}},Ms=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:ks.messages,t=arguments.length>1?arguments[1]:void 0;switch(t.type){case"AUTH_ERRORS":case"APP_ERRORS":return t.messages;case"CLEAN_ALL_MESSAGES":case"LOGOUT":case"PROFILE_SUCCESS":case"@@router/LOCATION_CHANGE":return[];default:return e}},Ts=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:ks.records,t=arguments.length>1?arguments[1]:void 0;return"LOGOUT"===t.type?ks.records:ws(e,"records",t)},Ps=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:ks.sports,t=arguments.length>1?arguments[1]:void 0;return"UPDATE_SPORT_DATA"===t.type?Object(S.a)(Object(S.a)({},e),{},{data:e.data.map((function(e){return e.id===t.data.id&&(e.is_active=t.data.is_active),e}))}):ws(e,"sports",t)},zs=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:ks.users,t=arguments.length>1?arguments[1]:void 0;return"UPDATE_USER_DATA"===t.type?Object(S.a)(Object(S.a)({},e),{},{data:e.data.map((function(e){return e.username===t.data.username&&(e.admin=t.data.admin),e}))}):ws(e,"users",t)},Fs=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:ks.user,t=arguments.length>1?arguments[1]:void 0;switch(t.type){case"AUTH_ERROR":case"PROFILE_ERROR":case"LOGOUT":return window.localStorage.removeItem("authToken"),ks.user;case"PROFILE_SUCCESS":return t.profil;default:return e}},Rs=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:ks.statistics,t=arguments.length>1?arguments[1]:void 0;return"LOGOUT"===t.type?ks.statistics:ws(e,"statistics",t)},Ls=["/login","/register","/password-reset","/password-reset/request","/password-reset/sent","/updated-password"],Us=function(e,t){return"string"===typeof e||e instanceof String?e=t:e.pathname=t,e},Is=function(e){return window.localStorage.authToken||Ls.includes(e.pathname)||(e=Us(e,"/login")),window.localStorage.authToken&&Ls.includes(e.pathname)&&(e=Us(e,"/")),e},Ws=((gs=Object(s.a)()).location=Is(gs.location),Object(S.a)(Object(S.a)({},gs),{},{push:function(e){for(var t=arguments.length,a=new Array(t>1?t-1:0),s=1;s1?t-1:0),s=1;sgpx file","Longest duration":"Longest duration","Max. altitude":"Max. altitude","Max. speed":"Max. speed","Min. altitude":"Min. altitude","no folder inside":"no folder inside","files max":"files max","max size":"max size","No data to display":"No data to display","No Map":"No Map","No next workout":"No next workout","No next segment":"No next segment","No notes":"No notes","No previous workout":"No previous workout","No previous segment":"No previous segment","Notes":"Notes","pauses":"pauses","Personal records":"Personal records","See next workout":"See next workout","See next segment":"See next segment","See previous workout":"See previous workout","See previous segment":"See previous segment","segment":"segment","Segments":"Segments","speed":"speed","Start":"Start","Title":"Title","To":"To","total duration":"total duration","with gpx file":"with gpx file","without gpx file":"without gpx file","zipFile":"or zip file containing gpx files"}')},207:function(e){e.exports=JSON.parse('{"Actions":"Actions","Active":"Active","workouts exist":"workouts exist","Add admin rights":"Add admin rights","Add/remove admin rights, delete user account.":"Add/remove admin rights, delete user account.","Administration":"Administration","Application":"Application","Application configuration":"Application configuration","Back":"Back","Disable":"Disable","Enable":"Enable","Enable/disable sports.":"Enable/disable sports.","FitTrackee administration":"FitTrackee administration","id":"id","if 0, no limitation":"if 0, no limitation","Image":"Image","Label":"Label","Max. number of active users":"Max. number of active users","Max. files of zip archive":"Max. files of zip archive","Max. size of uploaded files":"Max. size of uploaded files","Max. size of uploaded files (in Mb)":"Max. size of uploaded files (in Mb)","Max. size of zip archive":"Max. size of zip archive","Max. size of zip archive (in Mb)":"Max. size of zip archive (in Mb)","Registration is currently disabled.":"Registration is currently disabled.","Registration is currently enabled.":"Registration is currently enabled.","Remove admin rights":"Remove admin rights","Sports":"Sports","Update application configuration (maximum number of registered users, maximum files size).":"Update application configuration (maximum number of registered users, maximum files size).","uploads":"uploads","user":"user","Users":"Users","users":"users"}')},208:function(e){e.exports=JSON.parse('{"workouts count":"workouts count","Add workout":"Add workout","admin rights":"admin rights","ascending":"ascending","Back":"Back","Back to home":"Back to home","Cancel":"Cancel","Confirmation":"Confirmation","Dashboard":"Dashboard","descending":"descending","Edit":"Edit","day":"day","days":"days","Next":"Next","No":"No","no":"no","No records.":"No records.","No workouts.":"No workouts.","Page not found":"Page not found","Previous":"Prev","registration date":"registration date","Sort":"Sort","Sort by":"Sort by","Sport":"Sport","sport":"sport","Sports":"Sports","sports":"sports","Statistics":"Statistics","Submit":"Submit","to":"to","user name":"user name","Workout":"Workout","Workouts":"Workouts","workout":"workout","workouts":"workouts","Yes":"Yes","yes":"yes"}')},209:function(e){e.exports=JSON.parse('{"Personal records":"Personal records","This month":"This month","Upload one !":"Upload one !"}')},210:function(e){e.exports=JSON.parse('{"3 to 12 characters required for username.":"3 to 12 characters required for username.","8 characters required for password.":"8 characters required for password.","An error occurred. Please contact the administrator.":"An error occurred. Please contact the administrator.","application":"application","Error during picture deletion.":"Error during picture deletion.","Error during picture update.":"Error during picture update.","Error during picture update, file size exceeds max size.":"Error during picture update, file size exceeds max size.","Error. Registration is disabled.":"Error. Registration is disabled.","Error. Please try again or contact the administrator.":"Error. Please try again or contact the administrator.","File extension not allowed.":"File extension not allowed.","File size is greater than the allowed size":"File size is greater than the allowed size","Incorrect id":"Incorrect id","Invalid credentials.":"Invalid credentials.","Invalid payload.":"Invalid payload.","Invalid token. Please log in again.":"Invalid token. Please log in again.","Max. files in a zip archive must be greater than 0":"Max. files in a zip archive must be greater than 0","Max. size of uploaded files must be greater than 0":"Max. size of uploaded files must be greater than 0","Max. size of zip archive must be equal or greater than max. size of uploaded files":"Max. size of zip archive must be equal or greater than max. size of uploaded files","Max. size of zip archive must be greater than 0":"Max. size of zip archive must be greater than 0","No file part.":"No file part.","No picture.":"No picture.","No selected file.":"No selected file.","no correct file.":"no correct file.","no gpx file for this workout":"no gpx file for this workout","Password and password confirmation don\'t match.":"Password and password confirmation don\'t match.","Provide a valid auth token":"Provide a valid auth token","records":"records","Signature expired. Please log in again.":"Signature expired. Please log in again.","Sorry. That user already exists.":"Sorry. That user already exists.","Sport can not be disabled, workouts exist.":"Sport can not be disabled, workouts exist.","Sport does not exist.":"Sport does not exist.","sports":"sports","statistics":"statistiques","User does not exist.":"User does not exist.","Valid email must be provided.\\n":"Valid email must be provided.","workouts":"workouts","You can not delete your account, no other user has admin rights.":"You can not delete your account, no other user has admin rights.","You do not have permissions.":"You do not have permissions."}')},211:function(e){e.exports=JSON.parse('{"Cycling (Sport)":"Cycling (Sport)","Cycling (Transport)":"Cycling (Transport)","Hiking":"Hiking","Mountain Biking":"Mountain Biking","Running":"Running","Walking":"Walking"}')},212:function(e){e.exports=JSON.parse('{"workouts":"workouts","distance":"distance","duration":"duration","month":"month","Statistics":"Statistics","year":"year","week":"week"}')},213:function(e){e.exports=JSON.parse('{"Admin":"Admin","Are you sure you want to delete this account? All data will be deleted, this cannot be undone.":"Are you sure you want to delete this account? All data will be deleted, this cannot be undone.","Are you sure you want to delete your account? All data will be deleted, this cannot be undone.":"Are you sure you want to delete your account? All data will be deleted, this cannot be undone.","Bio":"Bio","Birth Date":"Birth Date","Check your email. If your address is in our database, you\'ll received an email with a link to reset your password.":"Check your email. If your address is in our database, you\'ll received an email with a link to reset your password.","Delete my account":"Delete my account","Delete picture":"Delete picture","Delete user account":"Delete user account","Edit Profile":"Edit Profile","Email":"Email","Enter a username":"Enter a username","Enter an email address":"Enter an email address","Enter a password":"Enter a password","Enter the password confirmation":"Enter the password confirmation","First day of week":"First day of week","First Name":"First Name","Forgot password?":"Forgot password?","Invalid token. Please request a new token.":"Invalid token. Please request a new token.","Language":"Language","Last Name":"Last Name","Location":"Location","loggedOut":"You are now logged out. Click <1>here to log back in.","Login":"Login","login":"login","Logout":"Logout","Monday":"Monday","Password":"Password","Password Confirmation":"Password Confirmation","Password reset":"Password reset","password reset":"password reset","Profile":"Profile","Profile Edition":"Profile Edition","Register":"Register","register":"register","Registration Date":"Registration Date","Reset your password":"Reset your password","reset your password":"reset your password","Send":"Send","Sunday":"Sunday","Timezone":"Timezone","updatedPasswordText":"Your password have been updated. Click <1>here to log in.","Username":"Username"}')},214:function(e){e.exports=JSON.parse('{"Workouts":"S\xe9ances","Workout":"S\xe9ance","Workout Date":"Date de l\'s\xe9ance","Add a workout":"Ajouter une s\xe9ance","Are you sure you want to delete this workout?":"Etes-vous s\xfbr de vouloir supprimer cette s\xe9ance ?","Ave. speed":"Vitesse moyenne","Ascent":"D\xe9nivel\xe9 positif","Average speed":"Vitesse moyenne","Chart":"Analyse","data from gpx, without any cleaning":"donn\xe9es issues du fichier gpx, sans correction","Date":"Date","Delete workout":"Supprimer l\'s\xe9ance","Descent":"D\xe9nivel\xe9 n\xe9gatif","Distance":"Distance","distance":"distance","Duration":"Dur\xe9e","duration":"dur\xe9e","Edit a workout":"Editer une s\xe9ance","Edit workout":"Editer une workout","elevation":"altitude","End":"Arriv\xe9e","Farest distance":"Distance la + longue","Filter":"Filtrer","From":"A partir de","gpxFile":"fichier gpx","Longest duration":"Dur\xe9e la + longue","Max. altitude":"Altitude max","Max. speed":"Vitesse max","Min. altitude":"Altitude min","no folder inside":"pas de r\xe9pertoire","files max":" fichiers max","max size":"taille max","No data to display":"Pas de donn\xe9es \xe0 afficher","No Map":"Pas de carte","No next workout":"Pas d\'s\xe9ance suivante","No next segment":"Pas de segment suivant","No notes":"Pas de notes","No previous workout":"Pas d\'s\xe9ance pr\xe9c\xe9dente","No previous segment":"Pas de segment pr\xe9c\xe9dent","Notes":"Notes","pauses":"pauses","Personal records":"Records personnels","See next workout":"Voir l\'s\xe9ance suivante","See next segment":"Voir le segment suivant","See previous workout":"Voir l\'s\xe9ance pr\xe9c\xe9dente","See previous segment":"Voir le segment pr\xe9c\xe9dent","segment":"segment","Segments":"Segments","Start":"D\xe9part","speed":"vitesse","Title":"Titre","To":"Jusqu\'au","total duration":"dur\xe9e totale","with gpx file":"avec un fichier gpx","without gpx file":"sans fichier gpx","zipFile":"ou un fichier zip contenant des fichiers gpx"}')},215:function(e){e.exports=JSON.parse('{"Actions":"Actions","Active":"Active","Add admin rights":"Ajouter des droits d\'admin","Add/remove admin rights, delete user account.":"Ajouter/retirer des droits d\'adminsitration, supprimer des comptes utilisateurs.","Administration":"Administration","workouts exist":"des s\xe9ances existent","Application":"Application","Application configuration":"Configuration de l\'application","Back":"Retour","Disable":"d\xe9sactiver","Enable":"activer","Enable/disable sports.":"Activer/d\xe9sactiver des sports.","FitTrackee administration":"Administration de FitTrackee","id":"id","if 0, no limitation":"si \xe9gal \xe0 0, pas limite d\'inscription","Image":"Image","Label":"Label","Max. number of active users":"Nombre maximum d\'utilisateurs actifs","Max. files of zip archive":"Nombre max. de fichiers dans une archive zip","Max. size of uploaded files":"Taille max. des fichiers","Max. size of uploaded files (in Mb)":"Taille max. des fichiers (en Mo)","Max. size of zip archive":"Taille max. des archives zip","Max. size of zip archive (in Mb)":"Taille max. des archives zip (en Mo)","Registration is currently disabled.":"Les inscriptions sont actuellement d\xe9sactiv\xe9es.","Registration is currently enabled.":"Les inscriptions sont actuellement activ\xe9es.","Remove admin rights":"Retirer des droits d\'admin","Sports":"Sports","Update application configuration (maximum number of registered users, maximum files size).":"Configurer l\'application (nombre maximum d\'utilisateurs inscrits, taille maximale des fichers).","uploads":"fichiers","user":"user","Users":"Utilisateurs","users":"utilisateurs"}')},216:function(e){e.exports=JSON.parse('{"workouts count":"nombre d\'s\xe9ances","Add workout":"Ajouter une s\xe9ance","admin rights":"droits d\'admin","ascending":"ascendant","Back":"Revenir \xe0 la page pr\xe9c\xe9dente","Back to home":"Retour \xe0 l\'accueil","Cancel":"Annuler","Confirmation":"Confirmation","Dashboard":"Tableau de Bord","descending":"descendant","Edit":"Modifier","day":"jour","days":"jours","Next":"Page suivante","No":"Non","no":"non","No records.":"Pas de records.","No workouts.":"Pas d\'s\xe9ances.","Page not found":"Page introuvable","Previous":"Page pr\xe9c\xe9dente","registration date":"date d\'inscription","Sort":"Tri","Sort by":"Trier par","Sport":"Sport","sport":"sport","Sports":"Sports","sports":"sports","Statistics":"Statistiques","Submit":"Valider","to":"\xe0","user name":"utilisateur","Workout":"S\xe9ance","Workouts":"S\xe9ances","workout":"s\xe9ance","workouts":"s\xe9ances","Yes":"Oui","yes":"oui"}')},217:function(e){e.exports=JSON.parse('{"Personal records":"Mes records","This month":"Ce mois","Upload one !":"Ajoutez votre premi\xe8re s\xe9ance !"}')},218:function(e){e.exports=JSON.parse('{"3 to 12 characters required for username.":"3 \xe0 12 caract\xe8res requis pour le nom.","8 characters required for password.":"8 caract\xe8res minimum pour le mot de passe.","An error occurred. Please contact the administrator.":"Une erreur s\'est produite. Merci de contacter l\'administrateur.","application":"application","Error during picture deletion.":"Erreur lors de la suppression de l\'image.","Error during picture update.":"Erreur lors de la mise \xe0 jour de l\'image.","Error during picture update, file size exceeds max size.":"Erreur lors de la mise \xe0 jour de l\'image, la taille du ficher d\xe9passe la taille maximum autoris\xe9e","Error. Registration is disabled.":"Erreur. L\'inscription est d\xe9sactiv\xe9e.","Error. Please try again or contact the administrator.":"Erreur. Veuillez r\xe9essayer ou contacter l\'administrateur","File extension not allowed.":"Extension de fichier non autoris\xe9e.","File size is greater than the allowed size":"La taille du fichier est sup\xe9rieure \xe0 la limite autoris\xe9e","Incorrect id":"Id incorrect","Invalid credentials.":"Identifiants invalides.","Invalid payload.":"Donn\xe9es incorrectes.","Invalid token. Please log in again.":"Jeton invalide. Merci de vous reconnecter.","Max. files in a zip archive must be greater than 0":"Le nombre max. de fichiers dans une archive doit \xeatre sup\xe9rieur \xe0 0","Max. size of uploaded files must be greater than 0":"La taille max. des fichiers doit \xeatre sup\xe9rieure \xe0 0","Max. size of zip archive must be equal or greater than max. size of uploaded files":"La taille max. d\'une archive doit \xeatre sup\xe9rieure ou \xe9gale \xe0 la taille max. d\'un fichier","Max. size of zip archive must be greater than 0":"La taille max. d\'une archive doit \xeatre sup\xe9rieure \xe0 0","No file part.":"Pas de fichier fourni.","No picture.":"Pas d\'image.","No selected file.":"Pas de fichier s\xe9lectionn\xe9.","no correct file.":"fichier incorrect","no gpx file for this workout":"pas de fichier gpx pour cette s\xe9ance","Password and password confirmation don\'t match.":"Les mots de passe saisis sont diff\xe9rents.","Provide a valid auth token":"Merci de fournir un jeton valide","records":"records","Signature expired. Please log in again.":"Signature expir\xe9e. Merci de vous reconnecter.","Sorry. That user already exists.":"D\xe9sol\xe9. Cet utilisateur existe d\xe9j\xe0.","Sport can not be disabled, workouts exist.":"Le sport ne peut \xeatre d\xe9sactiv\xe9, des s\xe9ancees existent","Sport does not exist.":"Le sport n\'existe pas.","sports":"sports","statistics":"statistics","User does not exist.":"L\'utilisateur n\'existe pas.","Valid email must be provided.\\n":"L\'email fourni n\'est pas valide.","workouts":"s\xe9ances","You can not delete your account, no other user has admin rights.":"Vous ne pouvez pas supprimer votre compte, aucun autre utilisateur n\'a des droits d\'administration.","You do not have permissions.":"Vous n\'avez pas les permissions n\xe9cessaires."}')},219:function(e){e.exports=JSON.parse('{"Cycling (Sport)":"V\xe9lo (Sport)","Cycling (Transport)":"V\xe9lo (Transport)","Hiking":"Randonn\xe9e","Mountain Biking":"VTT","Running":"Course","Walking":"Marche"}')},220:function(e){e.exports=JSON.parse('{"workouts":"s\xe9ances","distance":"distance","duration":"dur\xe9e","month":"mois","Statistics":"Statistiques","year":"ann\xe9e","week":"semaine"}')},221:function(e){e.exports=JSON.parse('{"Admin":"Admin","Are you sure you want to delete this account? All data will be deleted, this cannot be undone.":"Etes-vous s\xfbr de vouloir supprimer ce compte ? Toutes les donn\xe9es seront d\xe9finitivement effac\xe9s.","Are you sure you want to delete your account? All data will be deleted, this cannot be undone.":"Etes-vous s\xfbr de vouloir supprimer votre compte ? Toutes les donn\xe9es seront d\xe9finitivement effac\xe9s.","Bio":"Bio","Birth Date":"Date de naissance","Check your email. If your address is in our database, you\'ll received an email with a link to reset your password.":"V\xe9rifiez vore boite mail. Si vote adresse est dans notre base de donn\xe9es, vous recevrez un email avec un lien pour r\xe9initialiser votre mot de passe","Delete my account":"Supprimer mon compte","Delete picture":"Supprimer l\'image","Delete user account":"Supprimer le compte","Edit Profile":"Editer le profil","Email":"Email","Enter a username":"Saisir un nom","Enter an email address":"Saisir une adresse e-mail","Enter a password":"Saisir un mot de passe","Enter the password confirmation":"Confirmer le mot de passe","First day of week":"Premier jour de la semaine","First Name":"Pr\xe9nom","Forgot password?":"Mot de passe oubli\xe9 ?","Invalid token. Please request a new token.":"Token invalid. Veuillez demander un nouveau token.","Language":"Langue","Last Name":"Nom","Location":"Lieu","loggedOut":"Vous \xeates d\xe9connect\xe9. Cliquez <1>ici pour vous reconnecter.","Login":"Se connecter","login":"se connecter","Logout":"Se d\xe9connecter","Monday":"Lundi","Password":"Mot de passe","Password Confirmation":"Confirmation du mot de passe","Password reset":"R\xe9initialiser votre mot de passe","password reset":"r\xe9initialiser votre mot de passe","Profile":"Profil","Profile Edition":"Edition du profil","Register":"S\'inscrire","register":"s\'inscrire","Registration Date":"Date d\'inscription","Reset your password":"R\xe9initialiser votre mot de passe","reset your password":"r\xe9initialiser votre mot de passe","Send":"Envoyer","Sunday":"Dimanche","Timezone":"Fuseau horaire","updatedPasswordText":"Votre mot de passe a \xe9t\xe9 mis \xe0 jour. Cliquez <1>ici pour vous connecter.","Username":"Nom d\'utilisateur"}')},281:function(e,t,a){},290:function(e,t){},894:function(e,t,a){"use strict";a.r(t),a.d(t,"history",(function(){return Ws})),a.d(t,"rootNode",(function(){return qs})),a.d(t,"store",(function(){return Bs}));var s=a(34),r=a(2),n=a.n(r),o=a(913),c=a(56),i=a.n(c),l=a(202),d=a(60),u=a(203),m=a(88),j=a(204),p=a(205),h={en:{workouts:a(206),administration:a(207),common:a(208),dashboard:a(209),messages:a(210),sports:a(211),statistics:a(212),user:a(213)},fr:{workouts:a(214),administration:a(215),common:a(216),dashboard:a(217),messages:a(218),sports:a(219),statistics:a(220),user:a(221)}};m.a.use(p.a).use(j.a).init({debug:!1,lng:"en",fallbackLng:"en",keySeparator:!1,interpolation:{escapeValue:!1},resources:h,ns:["common"],defaultNS:"common"});var b=m.a,f=a(10),O=a(11),x=a(14),g=a(13),v=a(12),k=a(24),w=(a(281),a(25)),y=a(896),N=a(1),_=function(e){Object(x.a)(a,e);var t=Object(g.a)(a);function a(){return Object(f.a)(this,a),t.apply(this,arguments)}return Object(O.a)(a,[{key:"render",value:function(){var e=this.props,t=e.message,a=e.messages,s=e.t,r=""!==t&&t?t.split("|").length>1?"".concat(s("messages:".concat(t.split("|")[0])),": ").concat(s("messages:".concat(t.split("|")[1]))):s("messages:".concat(t)):"";return Object(N.jsxs)("div",{className:"error-message",children:[""!==r&&Object(N.jsx)("code",{children:r}),a&&a.length>0&&(1===a.length?Object(N.jsx)("code",{children:a[0].value}):Object(N.jsx)("code",{children:Object(N.jsx)("ul",{children:a.map((function(e){return Object(N.jsx)("li",{children:s("messages:".concat(e.value))},e.id)}))})}))]})}}]),a}(n.a.PureComponent),S=a(16),D=a(915),C=a(914),E=a(226),A=["bytes","KB","MB","GB","TB"],M=function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],a=Math.floor(Math.log(e)/Math.log(1024));if(!e)return t?"0 bytes":{size:0,suffix:"bytes"};var s=(e/Math.pow(1024,a)).toFixed(1),r=A[a];return t?"".concat(s).concat(r):{size:s,suffix:r}},T="/api/",P=[{key:"workouts_count",label:"workouts count"},{key:"admin",label:"admin rights"},{key:"created_at",label:"registration date"},{key:"username",label:"user name"}],z=[{key:"asc",label:"ascending"},{key:"desc",label:"descending"}],F=function(){return!!window.localStorage.authToken},R=function(e){var t=0;return e.map((function(e){var a={id:t,value:e};return t++,a}))},L=function(e){var t={};e.noAuthorization||(t.Authorization="Bearer ".concat(window.localStorage.getItem("authToken"))),e.type&&(t["Content-Type"]=e.type);var a={method:e.method,headers:t};"application/json"===e.type&&e.body?a.body=JSON.stringify(e.body):e.body&&(a.body=e.body);var s=new Request("".concat(T).concat(e.url),a);return fetch(s).then((function(t){return"DELETE"===e.method||413===t.status?t:t.json()})).catch((function(e){return console.error(e),new Error("An error occurred. Please contact the administrator.")}))},U=function(e,t){if(!e)return"";var a=E.DateTime.fromISO(Object(D.a)(new Date(e),"yyyy-MM-dd'T'HH:mm:ss.SSSxxx")).setZone(t);return Object(C.a)(a.toFormat("yyyy-MM-dd HH:mm:ss"),"yyyy-MM-dd HH:mm:ss",new Date)},I=function(e,t){var a=e.label.toLowerCase(),s=t.label.toLowerCase();return a>s?1:a2&&void 0!==arguments[2]?arguments[2]:"common";return t.map((function(t){return Object(S.a)(Object(S.a)({},t),{},{label:e("".concat(a,":").concat(t.label))})})).sort(I)},H=function(e,t){var a=e;return t.id||"users"===e&&t.username?a="".concat(a,"/").concat(t.username?t.username:t.id):Object.keys(t).length>0&&(a+="?",Object.keys(t).filter((function(e){return t[e]})).map((function(e,s){return a+="".concat(0===s?"":"&").concat(e,"=").concat(t[e])}))),a},q=function(){function e(){Object(f.a)(this,e)}return Object(O.a)(e,null,[{key:"getData",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},a=H(e,t),s={url:a,method:"GET",type:"application/json"};return L(s)}},{key:"addData",value:function(e,t){return L({url:e,method:"POST",body:t,type:"application/json"})}},{key:"addDataWithFile",value:function(e,t){return L({url:e,method:"POST",body:t})}},{key:"postData",value:function(e,t){var a={url:"".concat(e).concat(t.id?"/".concat(t.id):""),method:"POST",body:t,type:"application/json"};return L(a)}},{key:"updateData",value:function(e,t){var a={url:"".concat(e).concat(t.id?"/".concat(t.id):t.username?"/".concat(t.username):""),method:"PATCH",body:t,type:"application/json"};return L(a)}},{key:"deleteData",value:function(e,t){var a={url:"".concat(e,"/").concat(t),method:"DELETE",type:"application/json"};return L(a)}}]),e}(),B=function(e,t){return{type:"SET_DATA",data:t,target:e}},G=function(e,t,a){return{type:"SET_PAGINATED_DATA",data:t,pagination:a,target:e}},V=function(e){return{type:"SET_ERROR",message:e}},J=function(e){return{type:"SET_LOADING",loading:e}},K=function(e){return{type:"UPDATE_SPORT_DATA",data:e}},Y=function(e){return{type:"UPDATE_USER_DATA",data:e}},X=function(e,t,a){var s=!(arguments.length>3&&void 0!==arguments[3])||arguments[3];return function(r){return r(J(!0)),a&&a.id&&"workouts"!==t&&isNaN(a.id)?(r(J(!1)),r(V("".concat(t,"|Incorrect id")))):(r({type:"CLEAN_ALL_MESSAGES"}),q[e](t,a).then((function(a){if("success"===a.status)if(s){if("users"===t&&"getData"===e)return r(G(t,a.data,a.pagination));r(B(t,a.data))}else"updateData"===e&&"sports"===t?r(K(a.data.sports[0])):"updateData"===e&&"users"===t&&r(Y(a.data.users[0]));else r(V("".concat(t,"|").concat(a.message||a.status)));r(J(!1))})).catch((function(e){r(J(!1)),r(V("".concat(t,"|").concat(e)))})))}},$=function(e){return function(t){m.a.changeLanguage(e).then(t(function(e){return{type:"SET_LANGUAGE",language:e}}(e)))}},Z=function(e){return{type:"SET_APP_CONFIG",data:e}},Q=function(e){return function(t){return q.getData(e).then((function(a){"success"===a.status?"config"===e?t(Z(a.data)):"stats/all"===e&&t({type:"SET_APP_STATS",data:a.data}):t(V("application|".concat(a.message)))})).catch((function(e){return t(V("application|".concat(e)))}))}},ee=function(e){Object(x.a)(a,e);var t=Object(g.a)(a);function a(e,s){var r;return Object(f.a)(this,a),(r=t.call(this,e,s)).state={formData:{}},r}return Object(O.a)(a,[{key:"componentDidMount",value:function(){this.initForm()}},{key:"componentDidUpdate",value:function(e){this.props.appConfig!==e.appConfig&&this.initForm()}},{key:"initForm",value:function(){var e=this.props.appConfig,t={};Object.keys(e).map((function(a){return null===e[a]?t[a]="":["max_single_file_size","max_zip_file_size"].includes(a)?t[a]=+(e[a]/1048576).toFixed(2):t[a]=e[a]})),this.setState({formData:t})}},{key:"handleFormChange",value:function(e){var t=this.state.formData;t[e.target.name]=+e.target.value,this.setState(t)}},{key:"render",value:function(){var e=this,t=this.props,a=t.isInEdition,s=t.loadAppConfig,r=t.message,n=t.messages,o=t.onHandleConfigFormSubmit,c=t.t,i=this.state.formData;return Object(N.jsxs)("div",{children:[(r||n)&&Object(N.jsx)(_,{message:r,messages:n,t:c}),Object.keys(i).length>0&&Object(N.jsx)("div",{className:"row",children:Object(N.jsx)("div",{className:"col-md-12",children:Object(N.jsxs)("div",{className:"card",children:[Object(N.jsx)("div",{className:"card-header",children:Object(N.jsx)("strong",{children:c("administration:Application configuration")})}),Object(N.jsx)("div",{className:"card-body",children:Object(N.jsxs)("form",{className:"app-config-form ".concat(a?"":"form-disabled"),onSubmit:function(e){e.preventDefault(),o(i)},children:[Object(N.jsxs)("div",{className:"form-group row",children:[Object(N.jsxs)("label",{className:"col-sm-6 col-form-label",htmlFor:"max_users",children:[c("administration:Max. number of active users"),Object(N.jsx)("sup",{children:Object(N.jsx)("i",{className:"fa fa-question-circle","aria-hidden":"true",title:c("administration:if 0, no limitation")})}),":"]}),Object(N.jsx)("input",{className:"col-sm-5",id:"max_users",name:"max_users",type:"number",min:"0",value:i.max_users,onChange:function(t){return e.handleFormChange(t)}})]}),Object(N.jsxs)("div",{className:"form-group row",children:[Object(N.jsxs)("label",{className:"col-sm-6 col-form-label",htmlFor:"max_single_file_size",children:[c("administration:Max. size of uploaded files (in Mb)"),":"]}),Object(N.jsx)("input",{className:"col-sm-5",id:"max_single_file_size",name:"max_single_file_size",type:"number",step:"0.1",min:"0",value:i.max_single_file_size,onChange:function(t){return e.handleFormChange(t)}})]}),Object(N.jsxs)("div",{className:"form-group row",children:[Object(N.jsxs)("label",{className:"col-sm-6 col-form-label",htmlFor:"max_zip_file_size",children:[c("administration:Max. size of zip archive (in Mb)"),":"]}),Object(N.jsx)("input",{className:"col-sm-5",id:"max_zip_file_size",name:"max_zip_file_size",type:"number",step:"0.1",min:"0",value:i.max_zip_file_size,onChange:function(t){return e.handleFormChange(t)}})]}),Object(N.jsxs)("div",{className:"form-group row",children:[Object(N.jsx)("label",{className:"col-sm-6 col-form-label",htmlFor:"gpx_limit_import",children:c("administration:Max. files of zip archive")}),Object(N.jsx)("input",{className:"col-sm-5",id:"gpx_limit_import",name:"gpx_limit_import",type:"number",min:"0",value:i.gpx_limit_import,onChange:function(t){return e.handleFormChange(t)}})]}),a?Object(N.jsxs)(N.Fragment,{children:[Object(N.jsx)("input",{type:"submit",className:"btn btn-primary",value:c("common:Submit")}),Object(N.jsx)("input",{type:"submit",className:"btn btn-secondary",onClick:function(e){e.preventDefault(),s(),Ws.push("/admin/application")},value:c("common:Cancel")})]}):Object(N.jsxs)(N.Fragment,{children:[Object(N.jsx)("input",{type:"submit",className:"btn btn-primary",onClick:function(e){e.preventDefault(),Ws.push("/admin/application/edit")},value:c("common:Edit")}),Object(N.jsx)("input",{type:"submit",className:"btn btn-secondary",onClick:function(){return Ws.push("/admin")},value:c("common:Back")})]})]})})]})})})]})}}]),a}(n.a.Component),te=Object(v.c)((function(e){return{message:e.message,messages:e.messages}}),(function(e){return{loadAppConfig:function(){e(Q("config"))},onHandleConfigFormSubmit:function(t){var a=Object.assign({},t);a.max_single_file_size*=1048576,a.max_zip_file_size*=1048576,e(function(e){return function(t){t({type:"CLEAN_ALL_MESSAGES"}),q.updateData("config",e).then((function(e){"success"===e.status?(t(Z(e.data)),Ws.push("/admin/application")):Array.isArray(e.message)?t({type:"APP_ERRORS",messages:R(e.message)}):t(V(e.message))})).catch((function(e){return t(V("application|".concat(e)))}))}}(a))}}}))(ee),ae=a(19),se=function(e){Object(x.a)(a,e);var t=Object(g.a)(a);function a(){return Object(f.a)(this,a),t.apply(this,arguments)}return Object(O.a)(a,[{key:"componentDidMount",value:function(){this.props.loadAppStats()}},{key:"render",value:function(){var e=this.props,t=e.appStats,a=e.t,s=M(t.uploads_dir_size,!1);return Object(N.jsxs)("div",{className:"row",children:[Object(N.jsx)("div",{className:"col-lg-3 col-md-6 col-sm-6",children:Object(N.jsx)("div",{className:"card workout-card",children:Object(N.jsxs)("div",{className:"card-body row",children:[Object(N.jsx)("div",{className:"col-3",children:Object(N.jsx)("i",{className:"fa fa-users fa-3x fa-color"})}),Object(N.jsxs)("div",{className:"col-9 text-right",children:[Object(N.jsx)("div",{className:"huge",children:t.users?t.users:0}),Object(N.jsx)("div",{children:"".concat(1===t.users?a("administration:user"):a("administration:users"))})]})]})})}),Object(N.jsx)("div",{className:"col-lg-3 col-md-6 col-sm-6",children:Object(N.jsx)("div",{className:"card workout-card",children:Object(N.jsxs)("div",{className:"card-body row",children:[Object(N.jsx)("div",{className:"col-3",children:Object(N.jsx)("i",{className:"fa fa-tags fa-3x fa-color"})}),Object(N.jsxs)("div",{className:"col-9 text-right",children:[Object(N.jsx)("div",{className:"huge",children:t.sports?t.sports:0}),Object(N.jsx)("div",{children:"".concat(1===t.sports?a("common:sport"):a("common:sports"))})]})]})})}),Object(N.jsx)("div",{className:"col-lg-3 col-md-6 col-sm-6",children:Object(N.jsx)("div",{className:"card workout-card",children:Object(N.jsxs)("div",{className:"card-body row",children:[Object(N.jsx)("div",{className:"col-3",children:Object(N.jsx)("i",{className:"fa fa-calendar fa-3x fa-color"})}),Object(N.jsxs)("div",{className:"col-9 text-right",children:[Object(N.jsx)("div",{className:"huge",children:t.workouts?t.workouts:0}),Object(N.jsx)("div",{children:"".concat(1===t.workouts?a("common:workout"):a("common:workouts"))})]})]})})}),Object(N.jsx)("div",{className:"col-lg-3 col-md-6 col-sm-6",children:Object(N.jsx)("div",{className:"card workout-card",children:Object(N.jsxs)("div",{className:"card-body row",children:[Object(N.jsx)("div",{className:"col-3",children:Object(N.jsx)("i",{className:"fa fa-folder-open fa-3x fa-color"})}),Object(N.jsxs)("div",{className:"col-9 text-right",children:[Object(N.jsx)("div",{className:"huge",children:s.size}),Object(N.jsxs)("div",{children:[s.suffix," (",a("administration:uploads"),")"]})]})]})})})]})}}]),a}(n.a.Component),re=Object(y.a)()(Object(v.c)((function(e){return{appStats:e.application.statistics}}),(function(e){return{loadAppStats:function(){e(Q("stats/all"))}}}))(se));function ne(e){var t=e.appConfig,a=e.t;return Object(N.jsxs)("div",{className:"card workout-card",children:[Object(N.jsx)("div",{className:"card-header",children:Object(N.jsx)("strong",{children:a("administration:Administration")})}),Object(N.jsxs)("div",{className:"card-body",children:[Object(N.jsx)(re,{}),Object(N.jsx)("br",{}),Object(N.jsxs)("dl",{className:"admin-items",children:[Object(N.jsx)("dt",{children:Object(N.jsx)(ae.a,{to:{pathname:"/admin/application"},children:a("administration:Application")})}),Object(N.jsxs)("dd",{children:[a("administration:Update application configuration (maximum number of registered users, maximum files size)."),Object(N.jsx)("br",{}),Object(N.jsx)("strong",{children:a("administration:Registration is currently ".concat(t.is_registration_enabled?"enabled":"disabled","."))})]}),Object(N.jsx)("br",{}),Object(N.jsx)("dt",{children:Object(N.jsx)(ae.a,{to:{pathname:"/admin/sports"},children:a("administration:Sports")})}),Object(N.jsx)("dd",{children:a("administration:Enable/disable sports.")}),Object(N.jsx)("br",{}),Object(N.jsx)("dt",{children:Object(N.jsx)(ae.a,{to:{pathname:"/admin/users"},children:a("administration:Users")})}),Object(N.jsx)("dd",{children:a("administration:Add/remove admin rights, delete user account.")})]})]})]})}var oe=function(e){Object(x.a)(a,e);var t=Object(g.a)(a);function a(){return Object(f.a)(this,a),t.apply(this,arguments)}return Object(O.a)(a,[{key:"componentDidMount",value:function(){this.props.loadSports()}},{key:"render",value:function(){var e=this.props,t=e.message,a=e.sports,s=e.t,r=e.updateSport;return Object(N.jsxs)("div",{children:[t&&Object(N.jsx)(_,{message:t,t:s}),Object(N.jsx)("div",{className:"row",children:Object(N.jsx)("div",{className:"col",children:Object(N.jsxs)("div",{className:"card",children:[Object(N.jsx)("div",{className:"card-header",children:Object(N.jsx)("strong",{children:s("administration:Sports")})}),Object(N.jsxs)("div",{className:"card-body",children:[a.length>0&&Object(N.jsxs)("table",{className:"table",children:[Object(N.jsx)("thead",{children:Object(N.jsxs)("tr",{children:[Object(N.jsx)("th",{children:s("administration:id")}),Object(N.jsx)("th",{children:s("administration:Image")}),Object(N.jsx)("th",{children:s("administration:Label")}),Object(N.jsx)("th",{children:s("administration:Active")}),Object(N.jsx)("th",{children:s("administration:Actions")})]})}),Object(N.jsx)("tbody",{children:a.map((function(e){return Object(N.jsxs)("tr",{children:[Object(N.jsxs)("td",{children:[Object(N.jsx)("span",{className:"heading-span-absolute",children:s("administration:id")}),e.id]}),Object(N.jsxs)("td",{children:[Object(N.jsx)("span",{className:"heading-span-absolute",children:s("administration:Image")}),Object(N.jsx)("img",{className:"admin-img",src:e.img?e.img:"/img/photo.png",alt:"sport logo"})]}),Object(N.jsxs)("td",{children:[Object(N.jsx)("span",{className:"heading-span-absolute",children:s("administration:Label")}),s("sports:".concat(e.label))]}),Object(N.jsxs)("td",{children:[Object(N.jsx)("span",{className:"heading-span-absolute",children:s("administration:Active")}),e.is_active?Object(N.jsx)("i",{className:"fa fa-check-square-o custom-fa","aria-hidden":"true","data-toggle":"tooltip"}):Object(N.jsx)("i",{className:"fa fa-square-o custom-fa","aria-hidden":"true","data-toggle":"tooltip"})]}),Object(N.jsxs)("td",{children:[Object(N.jsx)("span",{className:"heading-span-absolute",children:s("administration:Actions")}),Object(N.jsx)("input",{type:"submit",className:"btn btn-".concat(e.is_active?"dark":"primary"," btn-sm"),value:e.is_active?s("administration:Disable"):s("administration:Enable"),onClick:function(){return r(e.id,!e.is_active)}}),e.has_workouts&&Object(N.jsxs)("span",{className:"admin-message",children:[Object(N.jsx)("i",{className:"fa fa-warning custom-fa","aria-hidden":"true"}),s("administration:workouts exist")]})]})]},e.id)}))})]}),Object(N.jsx)("input",{type:"submit",className:"btn btn-secondary",onClick:function(){return Ws.push("/admin/")},value:s("common:Back")})]})]})})})]})}}]),a}(n.a.Component),ce=Object(v.c)((function(e){return{message:e.message,sports:e.sports.data,user:e.user}}),(function(e){return{loadSports:function(){e(X("getData","sports"))},updateSport:function(t,a){e(X("updateData","sports",{id:t,is_active:a},!1))}}}))(oe),ie=function(e){Object(x.a)(a,e);var t=Object(g.a)(a);function a(){return Object(f.a)(this,a),t.apply(this,arguments)}return Object(O.a)(a,[{key:"getUrl",value:function(e){var t=this.props,a=t.query,s=t.pathname,r=Object.assign({},a),n=a.page?+a.page:1;switch(e){case"prev":n-=1;break;case"next":n+=1;break;default:n=+e}return r.page=n,H(s,r)}},{key:"render",value:function(){var e,t=this,a=this.props,s=a.pagination,r=a.t;return Object(N.jsx)(N.Fragment,{children:s&&Object.keys(s).length>0&&Object(N.jsx)("nav",{"aria-label":"Page navigation example",children:Object(N.jsxs)("ul",{className:"pagination justify-content-center",children:[Object(N.jsx)("li",{className:"page-item ".concat(s.has_prev?"":"disabled"),children:Object(N.jsx)(ae.a,{className:"page-link",to:this.getUrl("prev"),"aria-disabled":!s.has_prev,children:r("common:Previous")})}),(e=s.pages,Array.from({length:e},(function(e,t){return t+1}))).map((function(e){return Object(N.jsx)("li",{className:"page-item ".concat(e===s.page?"active":""),children:Object(N.jsx)(ae.a,{className:"page-link",to:t.getUrl(e),children:e})},e)})),Object(N.jsx)("li",{className:"page-item ".concat(s.has_next?"":"disabled"),children:Object(N.jsx)(ae.a,{className:"page-link",to:this.getUrl("next"),"aria-disabled":!s.has_next,children:r("common:Next")})})]})})})}}]),a}(n.a.PureComponent),le=function(e){Object(x.a)(a,e);var t=Object(g.a)(a);function a(e,s){var r;return Object(f.a)(this,a),(r=t.call(this,e,s)).state={page:null,per_page:null,order_by:"created_at",order:"asc"},r}return Object(O.a)(a,[{key:"componentDidMount",value:function(){this.props.loadUsers(this.initState())}},{key:"componentDidUpdate",value:function(e){e.location.query!==this.props.location.query&&this.props.loadUsers(this.props.location.query)}},{key:"initState",value:function(){var e=this.props.location.query,t={page:e.page,per_page:e.per_page,order_by:e.order_by?e.order_by:"created_at",order:e.order?e.order:"asc"};return this.setState(t),t}},{key:"updatePage",value:function(e,t){var a=Object.assign({},this.state);a[e]=t,this.setState(a);var s=H(this.props.location.pathname,a);Ws.push(s)}},{key:"render",value:function(){var e=this,t=this.props,a=t.authUser,s=t.location,r=t.message,n=t.t,o=t.pagination,c=t.updateUser,i=t.users,l=W(n,P),d=W(n,z);return Object(N.jsxs)("div",{children:[r&&Object(N.jsx)(_,{message:r,t:n}),Object(N.jsx)("div",{className:"container",children:Object(N.jsx)("div",{className:"row",children:Object(N.jsx)("div",{className:"col",children:Object(N.jsxs)("div",{className:"card",children:[Object(N.jsx)("div",{className:"card-header",children:Object(N.jsx)("strong",{children:n("administration:Users")})}),Object(N.jsxs)("div",{className:"card-body",children:[Object(N.jsxs)("div",{className:"row user-filters",children:[Object(N.jsx)("div",{className:"col-lg-4 col-md-6 col-sm-12",children:Object(N.jsxs)("label",{htmlFor:"order_by",children:[n("common:Sort by"),":"," ",Object(N.jsx)("select",{id:"order_by",name:"order_by",value:this.state.order_by,onChange:function(t){return e.updatePage("order_by",t.target.value)},children:l.map((function(e){return Object(N.jsx)("option",{value:e.key,children:e.label},e.key)}))})," "]})}),Object(N.jsx)("div",{className:"col-lg-4 col-md-6 col-sm-12",children:Object(N.jsxs)("label",{htmlFor:"sort",children:[n("common:Sort"),":"," ",Object(N.jsx)("select",{id:"sort",name:"sort",value:this.state.order,onChange:function(t){return e.updatePage("order",t.target.value)},children:d.map((function(e){return Object(N.jsx)("option",{value:e.key,children:e.label},e.key)}))})," "]})})]}),Object(N.jsxs)("table",{className:"table",children:[Object(N.jsx)("thead",{children:Object(N.jsxs)("tr",{children:[Object(N.jsx)("th",{children:"#"}),Object(N.jsx)("th",{children:n("user:Username")}),Object(N.jsx)("th",{children:n("user:Email")}),Object(N.jsx)("th",{children:n("user:Registration Date")}),Object(N.jsx)("th",{children:n("workouts:Workouts")}),Object(N.jsx)("th",{children:n("user:Admin")}),Object(N.jsx)("th",{children:n("administration:Actions")})]})}),Object(N.jsx)("tbody",{children:i.map((function(e){return Object(N.jsxs)("tr",{children:[Object(N.jsxs)("td",{children:[Object(N.jsx)("span",{className:"heading-span-absolute",children:"#"}),!0===e.picture?Object(N.jsx)("img",{alt:"Avatar",src:"".concat(T,"users/").concat(e.username,"/picture?").concat(Date.now()),className:"img-fluid App-nav-profile-img"}):Object(N.jsx)("i",{className:"fa fa-user-circle-o fa-2x no-picture","aria-hidden":"true"})]}),Object(N.jsxs)("td",{children:[Object(N.jsx)("span",{className:"heading-span-absolute",children:n("user:Username")}),Object(N.jsx)(ae.a,{to:"/users/".concat(e.username),children:e.username})]}),Object(N.jsxs)("td",{children:[Object(N.jsx)("span",{className:"heading-span-absolute",children:n("user:Email")}),e.email]}),Object(N.jsxs)("td",{children:[Object(N.jsx)("span",{className:"heading-span-absolute",children:n("user:Registration Date")}),Object(D.a)(new Date(e.created_at),"dd/MM/yyyy HH:mm")]}),Object(N.jsxs)("td",{children:[Object(N.jsx)("span",{className:"heading-span-absolute",children:n("workouts:Workouts")}),e.nb_workouts]}),Object(N.jsxs)("td",{children:[Object(N.jsx)("span",{className:"heading-span-absolute",children:n("user:Admin")}),e.admin?Object(N.jsx)("i",{className:"fa fa-check-square-o custom-fa","aria-hidden":"true","data-toggle":"tooltip"}):Object(N.jsx)("i",{className:"fa fa-square-o custom-fa","aria-hidden":"true","data-toggle":"tooltip"})]}),Object(N.jsxs)("td",{children:[Object(N.jsx)("span",{className:"heading-span-absolute",children:n("administration:Actions")}),Object(N.jsx)("input",{type:"submit",className:"btn btn-".concat(e.admin?"dark":"primary"," btn-sm"),disabled:e.username===a.username,value:e.admin?n("administration:Remove admin rights"):n("administration:Add admin rights"),onClick:function(){return c(e.username,!e.admin)}})]})]},e.username)}))})]}),Object(N.jsx)(ie,{pagination:o,pathname:s.pathname,query:this.state,t:n}),Object(N.jsx)("input",{type:"submit",className:"btn btn-secondary",onClick:function(){return Ws.push("/admin/")},value:n("common:Back")})]})]})})})})]})}}]),a}(n.a.Component),de=Object(v.c)((function(e){return{authUser:e.user,location:e.router.location,message:e.message,pagination:e.users.pagination,users:e.users.data}}),(function(e){return{loadUsers:function(t){e(X("getData","users",t))},updateUser:function(t,a){e(X("updateData","users",{username:t,admin:a},!1))}}}))(le),ue=a(227);function me(){var e=Object(ue.a)().t;return Object(N.jsxs)("div",{children:[Object(N.jsx)(w.a,{children:Object(N.jsx)("title",{children:"fittrackee - 404"})}),Object(N.jsx)("h1",{className:"page-title",children:e("Page not found")})]})}var je=Object(y.a)()(Object(v.c)((function(e){return{appConfig:e.application.config,user:e.user}}))((function(e){var t=e.appConfig,a=e.t,s=e.user;return Object(N.jsxs)(N.Fragment,{children:[Object(N.jsx)(w.a,{children:Object(N.jsxs)("title",{children:["FitTrackee - ",a("administration:Administration")]})}),Object(N.jsx)("div",{className:"container dashboard",children:s.admin?Object(N.jsxs)(k.d,{children:[Object(N.jsx)(k.b,{exact:!0,path:"/admin",render:function(){return Object(N.jsx)(ne,{appConfig:t,t:a})}}),Object(N.jsx)(k.b,{exact:!0,path:"/admin/application",render:function(){return Object(N.jsx)(te,{appConfig:t,t:a,isInEdition:!1})}}),Object(N.jsx)(k.b,{exact:!0,path:"/admin/application/edit",render:function(){return Object(N.jsx)(te,{appConfig:t,t:a,isInEdition:!0})}}),Object(N.jsx)(k.b,{exact:!0,path:"/admin/sports",render:function(){return Object(N.jsx)(ce,{t:a})}}),Object(N.jsx)(k.b,{exact:!0,path:"/admin/users",render:function(){return Object(N.jsx)(de,{t:a})}}),Object(N.jsx)(k.b,{component:me})]}):Object(N.jsx)(me,{})})]})}))),pe=a(897),he=a(29),be=a(916),fe=a(230),Oe=a.n(fe),xe=["#55a8a3","#98C3A9","#D0838A","#ECC77E","#926692","#929292","#428bca"],ge=[{record_type:"AS",label:"Ave. speed"},{record_type:"FD",label:"Farest distance"},{record_type:"LD",label:"Longest duration"},{record_type:"MS",label:"Max. speed"}],ve=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;return t||(t="yyyy/MM/dd"),a||(a="HH:mm"),{workout_date:e?Object(D.a)(e,t):null,workout_time:e?Object(D.a)(e,a):null}},ke=function(e){var t=new Date(0);return(t=Object(be.a)(t.setSeconds(e),1)).getTime()},we=function(e){for(var t=0;ts?1:a2&&void 0!==arguments[2]&&arguments[2];return e.filter((function(e){return!a||e.is_active})).map((function(e){return Object(S.a)(Object(S.a)({},e),{},{label:t("sports:".concat(e.label))})})).sort(ye)},_e=function(){function e(){Object(f.a)(this,e)}return Object(O.a)(e,null,[{key:"loginOrRegisterOrPasswordReset",value:function(e,t){var a={url:"auth/".concat(e),method:"POST",noAuthorization:!0,body:t,type:"application/json"};return L(a)}},{key:"deletePicture",value:function(){return L({url:"auth/picture",method:"DELETE"})}}]),e}(),Se=function(e){return{type:"PICTURE_ERROR",message:e}},De=function(e){return{type:"PROFILE_UPDATE_ERROR",message:e}},Ce=function(){return function(e){return window.localStorage.getItem("authToken")?e(Ee()):{type:"LOGOUT"}}},Ee=function(){return function(e){return q.getData("auth/profile").then((function(t){return"success"===t.status?(e(X("getData","sports")),t.data.isAuthenticated=!0,t.data.language&&e($(t.data.language)),e({type:"PROFILE_SUCCESS",profil:t.data})):e({type:"PROFILE_ERROR",message:t.message})})).catch((function(e){throw e}))}},Ae=function(e,t){return function(a){if("register"===t||"password/update"===t){var s=function(e){var t=[];return!(arguments.length>1&&void 0!==arguments[1]&&arguments[1])&&(e.username.length<3||e.username.length>12)&&t.push("3 to 12 characters required for username."),e.password!==e.password_conf&&t.push("Password and password confirmation don't match."),e.password.length<8&&t.push("8 characters required for password."),t}(e,"password/update"===t);if(s.length>0)return a({type:"AUTH_ERRORS",messages:R(s)})}return a(function(e,t){return function(a){return _e.loginOrRegisterOrPasswordReset(e,t).then((function(t){if("success"===t.status){if("password/reset-request"===e)return Ws.push({pathname:"/password-reset/sent"});if("password/update"===e)return Ws.push({pathname:"/updated-password"});if("login"===e||"register"===e)return window.localStorage.setItem("authToken",t.auth_token),"register"===e&&a(Q("config")),a(Ee())}return a({type:"AUTH_ERROR",message:t.message})})).catch((function(e){throw e}))}}(t,e))}},Me=function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return function(a){return q.deleteData("users",e).then((function(e){204===e.status?(a(Q("config")),t?Ws.push("/admin/users"):(a({type:"LOGOUT"}),Ws.push("/"))):e.json().then((function(e){return a(V("".concat(e.message)))}))})).catch((function(e){return a(V("user|".concat(e)))}))}},Te=function(e){return{type:"SET_GPX",gpxContent:e}},Pe=function(e){return{type:"SET_CHART_DATA",chartData:e}},ze=function(e){return function(t){return q.updateData("workouts",e).then((function(e){"success"===e.status?(t(Ce()),Ws.push("/workouts/".concat(e.data.workouts[0].id))):t(V("workouts|".concat(e.message))),t(J(!1))})).catch((function(e){t(J(!1)),t(V("workouts|".concat(e)))}))}},Fe=function(e){return function(t){return q.getData("workouts",e).then((function(e){"success"===e.status?e.data.workouts.length>0&&t({type:"PUSH_WORKOUTS",workouts:e.data.workouts}):t(V("workouts|".concat(e.message)))})).catch((function(e){return t(V("workouts|".concat(e)))}))}};var Re=Object(v.c)((function(e){return{appConfig:e.application.config,loading:e.loading}}),(function(e){return{onAddWorkout:function(t){e(J(!0));var a=new FormData;a.append("file",t.target.form.gpxFile.files[0]),a.append("data",'{"sport_id": '.concat(t.target.form.sport.value,', "notes": "').concat(t.target.form.notes.value,'"}')),e(function(e){return function(t){return q.addDataWithFile("workouts",e).then((function(e){"created"===e.status?0===e.data.workouts.length?t(V("workouts|no correct file.")):1===e.data.workouts.length?(t(Ce()),Ws.push("/workouts/".concat(e.data.workouts[0].id))):(t(Ce()),Ws.push("/")):413===e.status?t(V("workouts|File size is greater than the allowed size")):t(V("workouts|".concat(e.message))),t(J(!1))})).catch((function(e){t(J(!1)),t(V("workouts|".concat(e)))}))}}(a))},onEditWorkout:function(t,a){e(ze({id:a.id,notes:t.target.form.notes.value,sport_id:+t.target.form.sport.value,title:t.target.form.title.value}))}}}))((function(e){var t=e.appConfig,a=e.loading,s=e.onAddWorkout,r=e.onEditWorkout,n=e.sports,o=e.t,c=e.workout,i=c?c.sport_id:"",l=Ne(n,o,!0),d="".concat(o("workouts:no folder inside"),", ").concat(t.gpx_limit_import," ").concat(o("workouts:files max"),", ").concat(o("workouts:max size"),": ").concat(M(t.max_zip_file_size)),u=M(t.max_single_file_size);return Object(N.jsxs)("form",{encType:"multipart/form-data",method:"post",onSubmit:function(e){return e.preventDefault()},children:[Object(N.jsx)("div",{className:"form-group",children:Object(N.jsxs)("label",{children:[o("common:Sport"),":",Object(N.jsxs)("select",{className:"form-control input-lg",defaultValue:i,disabled:a,name:"sport",required:!0,children:[Object(N.jsx)("option",{value:""}),l.map((function(e){return Object(N.jsx)("option",{value:e.id,children:e.label},e.id)}))]})]})}),c?Object(N.jsx)("div",{className:"form-group",children:Object(N.jsxs)("label",{children:[o("workouts:Title"),":",Object(N.jsx)("input",{name:"title",defaultValue:c?c.title:"",disabled:a,className:"form-control input-lg"})]})}):Object(N.jsx)("div",{className:"form-group",children:Object(N.jsxs)("label",{children:[Object(N.jsxs)(pe.a,{i18nKey:"workouts:gpxFile",children:[Object(N.jsx)("strong",{children:"gpx"})," file"]}),Object(N.jsx)("sup",{children:Object(N.jsx)("i",{className:"fa fa-question-circle","aria-hidden":"true","data-toggle":"tooltip",title:"".concat(o("workouts:max size"),": ").concat(u)})})," ",Object(N.jsxs)(pe.a,{i18nKey:"workouts:zipFile",children:["or ",Object(N.jsx)("strong",{children:" zip"})," file containing ",Object(N.jsx)("strong",{children:"gpx "}),"files"]}),Object(N.jsx)("sup",{children:Object(N.jsx)("i",{className:"fa fa-question-circle","aria-hidden":"true","data-toggle":"tooltip","data-placement":"top",title:d})})," ",":",Object(N.jsx)("input",{accept:".gpx, .zip",className:"form-control form-control-file gpx-file",disabled:a,name:"gpxFile",required:!0,type:"file"})]})}),Object(N.jsx)("div",{className:"form-group",children:Object(N.jsxs)("label",{children:[o("workouts:Notes"),":",Object(N.jsx)("textarea",{name:"notes",defaultValue:c?c.notes:"",disabled:a,className:"form-control input-lg",maxLength:"500"})]})}),a?Object(N.jsx)("div",{className:"loader"}):Object(N.jsxs)("div",{children:[Object(N.jsx)("input",{type:"submit",className:"btn btn-primary",onClick:function(e){return c?r(e,c):s(e)},value:o("common:Submit")}),Object(N.jsx)("input",{type:"submit",className:"btn btn-secondary",onClick:function(){return Ws.push("/")},value:o("common:Cancel")})]})]})}));var Le=Object(v.c)((function(e){return{user:e.user}}),(function(e){return{onAddOrEdit:function(t,a){var s,r=t.target.form.duration.value.split(":"),n=60*+r[0]*60+60*+r[1]+ +r[2],o={workout_date:"".concat(t.target.form.workout_date.value," ").concat(t.target.form.workout_time.value),distance:+t.target.form.distance.value,duration:n,notes:t.target.form.notes.value,sport_id:+t.target.form.sport_id.value,title:t.target.form.title.value};a?(o.id=a.id,e(ze(o))):e((s=o,function(e){return q.addData("workouts/no_gpx",s).then((function(t){"created"===t.status?(e(Ce()),Ws.push("/workouts/".concat(t.data.workouts[0].id))):e(V("workouts|".concat(t.message)))})).catch((function(t){return e(V("workouts|".concat(t)))}))}))}}}))((function(e){var t,a,s=e.onAddOrEdit,r=e.sports,n=e.t,o=e.user,c=e.workout,i=Ne(r,n,!0),l="";if(c){var d=ve(U(c.workout_date,o.timezone),"yyyy-MM-dd");t=d.workout_date,a=d.workout_time,l=c.sport_id}return Object(N.jsxs)("form",{onSubmit:function(e){return e.preventDefault()},children:[Object(N.jsx)("div",{className:"form-group",children:Object(N.jsxs)("label",{children:[n("workouts:Title"),":",Object(N.jsx)("input",{name:"title",defaultValue:c?c.title:"",className:"form-control input-lg"})]})}),Object(N.jsx)("div",{className:"form-group",children:Object(N.jsxs)("label",{children:[n("common:Sport"),":",Object(N.jsxs)("select",{className:"form-control input-lg",defaultValue:l,name:"sport_id",required:!0,children:[Object(N.jsx)("option",{value:""}),i.map((function(e){return Object(N.jsx)("option",{value:e.id,children:e.label},e.id)}))]})]})}),Object(N.jsx)("div",{className:"form-group",children:Object(N.jsxs)("label",{children:[n("workouts:Workout Date"),":",Object(N.jsx)("div",{className:"container",children:Object(N.jsxs)("div",{className:"row",children:[Object(N.jsx)("input",{name:"workout_date",defaultValue:t,className:"form-control col-md",required:!0,type:"date"}),Object(N.jsx)("input",{name:"workout_time",defaultValue:a,className:"form-control col-md",required:!0,type:"time"})]})})]})}),Object(N.jsx)("div",{className:"form-group",children:Object(N.jsxs)("label",{children:[n("workouts:Duration"),":",Object(N.jsx)("input",{name:"duration",defaultValue:c?c.duration:"",className:"form-control col-xs-4",pattern:"^([0-9]*[0-9]):([0-5][0-9]):([0-5][0-9])$",placeholder:"hh:mm:ss",required:!0,type:"text"})]})}),Object(N.jsx)("div",{className:"form-group",children:Object(N.jsxs)("label",{children:[n("workouts:Distance")," (km):",Object(N.jsx)("input",{name:"distance",defaultValue:c?c.distance:"",className:"form-control input-lg",min:0,required:!0,step:"0.001",type:"number"})]})}),Object(N.jsx)("div",{className:"form-group",children:Object(N.jsxs)("label",{children:[n("workouts:Notes"),":",Object(N.jsx)("textarea",{name:"notes",defaultValue:c?c.notes:"",className:"form-control input-lg",maxLength:"500"})]})}),Object(N.jsx)("input",{type:"submit",className:"btn btn-primary",onClick:function(e){return s(e,c)},value:n("common:Submit")}),Object(N.jsx)("input",{type:"submit",className:"btn btn-secondary",onClick:function(){return Ws.push("/")},value:n("common:Cancel")})]})})),Ue=function(e){Object(x.a)(a,e);var t=Object(g.a)(a);function a(e,s){var r;return Object(f.a)(this,a),(r=t.call(this,e,s)).state={withGpx:!0},r}return Object(O.a)(a,[{key:"handleRadioChange",value:function(e){this.setState({withGpx:"withGpx"===e.target.name?e.target.value:!e.target.value})}},{key:"render",value:function(){var e=this,t=this.props,a=t.loading,s=t.message,r=t.sports,n=t.t,o=t.workout,c=this.state.withGpx;return Object(N.jsxs)("div",{children:[Object(N.jsx)(w.a,{children:Object(N.jsxs)("title",{children:["FitTrackee -"," ",n(o?"workouts:Edit a workout":"workouts:Add a workout")]})}),Object(N.jsx)("br",{}),Object(N.jsx)("br",{}),Object(N.jsx)(_,{message:s,t:n}),Object(N.jsx)("div",{className:"container",children:Object(N.jsxs)("div",{className:"row",children:[Object(N.jsx)("div",{className:"col-md-2"}),Object(N.jsx)("div",{className:"col-md-8",children:Object(N.jsxs)("div",{className:"card add-workout",children:[Object(N.jsx)("h2",{className:"card-header text-center",children:n(o?"workouts:Edit a workout":"workouts:Add a workout")}),Object(N.jsx)("div",{className:"card-body",children:o?o.with_gpx?Object(N.jsx)(Re,{workout:o,sports:r,t:n}):Object(N.jsx)(Le,{workout:o,sports:r,t:n}):Object(N.jsxs)("div",{children:[Object(N.jsx)("form",{children:Object(N.jsxs)("div",{className:"form-group row",children:[Object(N.jsx)("div",{className:"col",children:Object(N.jsxs)("label",{className:"radioLabel",children:[Object(N.jsx)("input",{className:"add-workout-radio",type:"radio",name:"withGpx",disabled:a,checked:c,onChange:function(t){return e.handleRadioChange(t)}}),n("workouts:with gpx file")]})}),Object(N.jsx)("div",{className:"col",children:Object(N.jsxs)("label",{className:"radioLabel",children:[Object(N.jsx)("input",{className:"add-workout-radio",type:"radio",name:"withoutGpx",disabled:a,checked:!c,onChange:function(t){return e.handleRadioChange(t)}}),n("workouts:without gpx file")]})})]})}),c?Object(N.jsx)(Re,{sports:r,t:n}):Object(N.jsx)(Le,{sports:r,t:n})]})})]})}),Object(N.jsx)("div",{className:"col-md-2"})]})})]})}}]),a}(n.a.Component),Ie=Object(y.a)()(Object(v.c)((function(e){return{loading:e.loading}}))(Ue));var We=Object(v.c)((function(e){return{message:e.message,sports:e.sports.data,user:e.user}}))((function(e){var t=e.message,a=e.sports;return Object(N.jsx)("div",{children:Object(N.jsx)(Ie,{workout:null,message:t,sports:a})})}));function He(e){var t=Object(ue.a)().t;return Object(N.jsx)("div",{className:"custom-modal-backdrop",children:Object(N.jsx)("div",{className:"custom-modal",children:Object(N.jsxs)("div",{className:"modal-content",children:[Object(N.jsxs)("div",{className:"modal-header",children:[Object(N.jsx)("h5",{className:"modal-title",children:e.title}),Object(N.jsx)("button",{type:"button",className:"close","aria-label":"Close",onClick:function(){return e.close()},children:Object(N.jsx)("span",{"aria-hidden":"true",children:"\xd7"})})]}),Object(N.jsx)("div",{className:"modal-body",children:Object(N.jsx)("p",{children:e.text})}),Object(N.jsxs)("div",{className:"modal-footer",children:[Object(N.jsx)("button",{type:"button",className:"btn btn-primary",onClick:function(){return e.confirm()},children:t("common:Yes")}),Object(N.jsx)("button",{type:"button",className:"btn btn-secondary",onClick:function(){return e.close()},children:t("common:No")})]})]})})})}function qe(e){var t=e.dataType,a=e.displayModal,s=e.segmentId,r=e.sport,n=e.t,o=e.title,c=e.user,i=e.workout,l=i?ve(U(i.workout_date,c.timezone)):null,d="segment"===t&&1!==s?"/workouts/".concat(i.id,"/segment/").concat(s-1):"workout"===t&&i.previous_workout?"/workouts/".concat(i.previous_workout):null,u="segment"===t&&s0?Object(N.jsxs)("div",{children:[Object(N.jsxs)("div",{className:"row chart-radio",children:[Object(N.jsxs)("label",{className:"radioLabel col-md-1",children:[Object(N.jsx)("input",{type:"radio",name:"distance",checked:c,onChange:function(e){return a.handleRadioChange(e)}}),n("workouts:distance")]}),Object(N.jsxs)("label",{className:"radioLabel col-md-1",children:[Object(N.jsx)("input",{type:"radio",name:"duration",checked:!c,onChange:function(e){return a.handleRadioChange(e)}}),n("workouts:duration")]})]}),Object(N.jsxs)("div",{className:"row chart-radio",children:[Object(N.jsx)("div",{className:"col-md-5"}),Object(N.jsxs)("label",{className:"radioLabel col-md-1",children:[Object(N.jsx)("input",{type:"checkbox",name:"speed",checked:this.displayData("speed"),onChange:function(e){return a.handleLegendChange(e)}}),n("workouts:speed")]}),Object(N.jsxs)("label",{className:"radioLabel col-md-1",children:[Object(N.jsx)("input",{type:"checkbox",name:"elevation",checked:this.displayData("elevation"),onChange:function(e){return a.handleLegendChange(e)}}),n("workouts:elevation")]}),Object(N.jsx)("div",{className:"col-md-5"})]}),Object(N.jsx)("div",{className:"row chart",children:Object(N.jsx)(Be.f,{height:300,children:Object(N.jsxs)(Be.d,{data:r,margin:{top:15,right:30,left:20,bottom:15},onMouseMove:function(e){return o(e.activePayload)},onMouseLeave:function(){return o(null)},children:[Object(N.jsx)(Be.h,{allowDecimals:!1,dataKey:e,label:{value:n("workouts:".concat(e)),offset:0,position:"bottom"},scale:t,interval:i,tickFormatter:function(e){return c?e:Object(D.a)(e,"HH:mm:ss")},type:"number"}),Object(N.jsx)(Be.i,{label:{value:"".concat(n("workouts:speed")," (km/h)"),angle:-90,position:"left"},yAxisId:"left"}),Object(N.jsx)(Be.i,{label:{value:"".concat(n("workouts:elevation")," (m)"),angle:-90,position:"right"},yAxisId:"right",orientation:"right"}),this.displayData("elevation")&&Object(N.jsx)(Be.a,{yAxisId:"right",type:"linear",dataKey:"elevation",name:n("workouts:elevation"),fill:"#e5e5e5",stroke:"#cccccc",dot:!1,unit:" m"}),this.displayData("speed")&&Object(N.jsx)(Be.e,{yAxisId:"left",type:"linear",dataKey:"speed",name:n("workouts:speed"),stroke:"#8884d8",strokeWidth:2,dot:!1,unit:" km/h"}),Object(N.jsx)(Be.g,{labelFormatter:function(e){return c?"".concat(n("workouts:distance"),": ").concat(e," km"):"".concat(n("workouts:duration"),": ").concat(Object(D.a)(e,"HH:mm:ss"))}})]})})}),Object(N.jsx)("div",{className:"chart-info",children:n("workouts:data from gpx, without any cleaning")})]}):n("workouts:No data to display")})}}]),a}(n.a.Component),Ve=Object(v.c)((function(e){return{chartData:e.chartData}}),(function(e){return{loadWorkoutData:function(t){e(function(e){return function(t){if(e)return q.getData("workouts/".concat(e,"/chart_data")).then((function(e){"success"===e.status?t(Pe(we(e.data.chart_data))):t(V("workouts|".concat(e.message)))})).catch((function(e){return t(V("workouts|".concat(e)))}));t(Pe(null))}}(t))},loadSegmentData:function(t,a){e(function(e,t){return function(a){if(e)return q.getData("workouts/".concat(e,"/chart_data/segment/").concat(t)).then((function(e){"success"===e.status?a(Pe(we(e.data.chart_data))):a(V("workouts|".concat(e.message)))})).catch((function(e){return a(V("workouts|".concat(e)))}));a(Pe(null))}}(t,a))}}}))(Ge);function Je(e){var t=e.t,a=e.workout;return Object(N.jsx)("div",{className:"container",children:a.weather_start&&a.weather_end&&Object(N.jsxs)("table",{className:"table table-borderless weather-table text-center",children:[Object(N.jsx)("thead",{children:Object(N.jsxs)("tr",{children:[Object(N.jsx)("th",{}),Object(N.jsxs)("th",{children:[t("workouts:Start"),Object(N.jsx)("br",{}),Object(N.jsx)("img",{className:"weather-img",src:"/img/weather/".concat(a.weather_start.icon,".png"),alt:"workout weather (".concat(a.weather_start.icon,")"),title:a.weather_start.summary})]}),Object(N.jsxs)("th",{children:[t("workouts:End"),Object(N.jsx)("br",{}),Object(N.jsx)("img",{className:"weather-img",src:"/img/weather/".concat(a.weather_end.icon,".png"),alt:"workout weather (".concat(a.weather_end.icon,")"),title:a.weather_end.summary})]})]})}),Object(N.jsxs)("tbody",{children:[Object(N.jsxs)("tr",{children:[Object(N.jsx)("td",{children:Object(N.jsx)("img",{className:"weather-img-small",src:"/img/weather/temperature.png",alt:"Temperatures"})}),Object(N.jsxs)("td",{children:[Number(a.weather_start.temperature).toFixed(1),"\xb0C"]}),Object(N.jsxs)("td",{children:[Number(a.weather_end.temperature).toFixed(1),"\xb0C"]})]}),Object(N.jsxs)("tr",{children:[Object(N.jsx)("td",{children:Object(N.jsx)("img",{className:"weather-img-small",src:"/img/weather/pour-rain.png",alt:"Temperatures"})}),Object(N.jsxs)("td",{children:[Number(100*a.weather_start.humidity).toFixed(1),"%"]}),Object(N.jsxs)("td",{children:[Number(100*a.weather_end.humidity).toFixed(1),"%"]})]}),Object(N.jsxs)("tr",{children:[Object(N.jsx)("td",{children:Object(N.jsx)("img",{className:"weather-img-small",src:"/img/weather/breeze.png",alt:"Temperatures"})}),Object(N.jsxs)("td",{children:[Number(a.weather_start.wind).toFixed(1),"m/s"]}),Object(N.jsxs)("td",{children:[Number(a.weather_end.wind).toFixed(1),"m/s"]})]})]})]})})}function Ke(e){var t=e.t,a=e.workout,s="0:00:00"!==a.pauses&&null!==a.pauses;return Object(N.jsxs)("div",{className:"workout-details",children:[Object(N.jsxs)("p",{children:[Object(N.jsx)("i",{className:"fa fa-clock-o custom-fa","aria-hidden":"true"}),t("workouts:Duration"),": ",a.moving,a.records&&a.records.find((function(e){return"LD"===e.record_type}))&&Object(N.jsx)("sup",{children:Object(N.jsx)("i",{className:"fa fa-trophy custom-fa","aria-hidden":"true"})}),s&&Object(N.jsxs)("span",{children:[Object(N.jsx)("br",{}),"(",t("workouts:pauses"),": ",a.pauses,","," ",t("workouts:total duration"),": ",a.duration,")"]})]}),Object(N.jsxs)("p",{children:[Object(N.jsx)("i",{className:"fa fa-road custom-fa","aria-hidden":"true"}),t("workouts:Distance"),": ",a.distance," km",a.records&&a.records.find((function(e){return"FD"===e.record_type}))&&Object(N.jsx)("sup",{children:Object(N.jsx)("i",{className:"fa fa-trophy custom-fa","aria-hidden":"true"})})]}),Object(N.jsxs)("p",{children:[Object(N.jsx)("i",{className:"fa fa-tachometer custom-fa","aria-hidden":"true"}),t("workouts:Average speed"),": ",a.ave_speed," km/h",a.records&&a.records.find((function(e){return"AS"===e.record_type}))&&Object(N.jsx)("sup",{children:Object(N.jsx)("i",{className:"fa fa-trophy custom-fa","aria-hidden":"true"})}),Object(N.jsx)("br",{}),t("workouts:Max. speed"),": ",a.max_speed," km/h",a.records&&a.records.find((function(e){return"MS"===e.record_type}))&&Object(N.jsx)("sup",{children:Object(N.jsx)("i",{className:"fa fa-trophy custom-fa","aria-hidden":"true"})})]}),a.min_alt&&a.max_alt&&Object(N.jsxs)("p",{children:[Object(N.jsx)("i",{className:"fi-mountains custom-fa"}),t("workouts:Min. altitude"),": ",a.min_alt,"m",Object(N.jsx)("br",{}),t("workouts:Max. altitude"),": ",a.max_alt,"m"]}),a.ascent&&a.descent&&Object(N.jsxs)("p",{children:[Object(N.jsx)("i",{className:"fa fa-location-arrow custom-fa"}),t("workouts:Ascent"),": ",a.ascent,"m",Object(N.jsx)("br",{}),t("workouts:Descent"),": ",a.descent,"m"]}),Object(N.jsx)(Je,{workout:a,t:t})]})}var Ye=a(901),Xe=a(898),$e=a(917),Ze=a(899),Qe=a(900),et=a(241),tt=a.n(et);function at(e){var t=e.bounds,a=e.coordinates,s=e.jsonData,r=e.mapAttribution;return Object(Xe.a)().fitBounds(t),Object(N.jsxs)(N.Fragment,{children:[Object(N.jsx)($e.a,{attribution:r,url:"".concat(T,"workouts/map_tile/{s}/{z}/{x}/{y}.png")}),Object(N.jsx)(Ze.a,{data:s},tt()(s)),a.latitude&&Object(N.jsx)(Qe.a,{position:[a.latitude,a.longitude]})]})}var st=function(e){Object(x.a)(a,e);var t=Object(g.a)(a);function a(e,s){var r;return Object(f.a)(this,a),(r=t.call(this,e,s)).state={zoom:13},r}return Object(O.a)(a,[{key:"componentDidMount",value:function(){"workout"===this.props.dataType?this.props.loadWorkoutGpx(this.props.workout.id):this.props.loadSegmentGpx(this.props.workout.id,this.props.segmentId)}},{key:"componentDidUpdate",value:function(e){("workout"===this.props.dataType&&e.workout.id!==this.props.workout.id||"workout"===this.props.dataType&&"segment"===e.dataType)&&this.props.loadWorkoutGpx(this.props.workout.id),"segment"===this.props.dataType&&e.segmentId!==this.props.segmentId&&this.props.loadSegmentGpx(this.props.workout.id,this.props.segmentId)}},{key:"componentWillUnmount",value:function(){this.props.loadWorkoutGpx(null)}},{key:"render",value:function(){var e=this.props,t=e.coordinates,a=e.gpxContent,s=e.mapAttribution,r=e.workout,n=function(e){var t;if(e){var a=(new DOMParser).parseFromString(e,"text/xml");t=Oe.a.gpx(a)}return{jsonData:t}}(a).jsonData,o=[[r.bounds[0],r.bounds[1]],[r.bounds[2],r.bounds[3]]];return Object(N.jsx)("div",{children:n&&Object(N.jsx)(Ye.a,{zoom:this.state.zoom,bounds:o,boundsOptions:{padding:[10,10]},children:Object(N.jsx)(at,{bounds:o,coordinates:t,jsonData:n,mapAttribution:s})})})}}]),a}(n.a.Component),rt=Object(v.c)((function(e){return{gpxContent:e.gpx,mapAttribution:e.application.config.map_attribution}}),(function(e){return{loadWorkoutGpx:function(t){e(function(e){return function(t){if(e)return q.getData("workouts/".concat(e,"/gpx")).then((function(e){"success"===e.status?t(Te(e.data.gpx)):t(V("workouts|".concat(e.message)))})).catch((function(e){return t(V("workouts|".concat(e)))}));t(Te(null))}}(t))},loadSegmentGpx:function(t,a){e(function(e,t){return function(a){if(e)return q.getData("workouts/".concat(e,"/gpx/segment/").concat(t)).then((function(e){"success"===e.status?a(Te(e.data.gpx)):a(V("workouts|".concat(e.message)))})).catch((function(e){return a(V("workouts|".concat(e)))}));a(Te(null))}}(t,a))}}}))(st);function nt(e){var t=e.t;return Object(N.jsx)("div",{className:"workout-no-map text-center",children:t("workouts:No Map")})}function ot(e){var t=e.notes,a=e.t;return Object(N.jsx)("div",{className:"row",children:Object(N.jsx)("div",{className:"col",children:Object(N.jsx)("div",{className:"card workout-card",children:Object(N.jsxs)("div",{className:"card-body",children:["Notes",Object(N.jsx)("div",{className:"workout-notes",children:t||a("workouts:No notes")})]})})})})}function ct(e){var t=e.segments,a=e.t;return Object(N.jsx)("div",{className:"row",children:Object(N.jsx)("div",{className:"col",children:Object(N.jsx)("div",{className:"card workout-card",children:Object(N.jsxs)("div",{className:"card-body",children:[a("workouts:Segments"),Object(N.jsx)("div",{className:"workout-segments",children:Object(N.jsx)("ul",{children:t.map((function(e,t){return Object(N.jsxs)("li",{className:"workout-segments-list",children:[Object(N.jsxs)(ae.a,{to:"/workouts/".concat(e.workout_id,"/segment/").concat(t+1),children:[a("workouts:segment")," ",t+1]})," ","(",a("workouts:distance"),": ",e.distance," km,"," ",a("workouts:duration"),": ",e.duration,")"]},"segment-".concat(t))}))})})]})})})})}var it=function(e){Object(x.a)(a,e);var t=Object(g.a)(a);function a(e,s){var r;return Object(f.a)(this,a),(r=t.call(this,e,s)).state={displayModal:!1,coordinates:{latitude:null,longitude:null}},r}return Object(O.a)(a,[{key:"componentDidMount",value:function(){this.props.loadWorkout(this.props.match.params.workoutId)}},{key:"componentDidUpdate",value:function(e){e.match.params.workoutId!==this.props.match.params.workoutId&&this.props.loadWorkout(this.props.match.params.workoutId)}},{key:"displayModal",value:function(e){this.setState((function(t){return Object(S.a)(Object(S.a)({},t),{},{displayModal:e})}))}},{key:"updateCoordinates",value:function(e){var t=e&&e.length>0?{latitude:e[0].payload.latitude,longitude:e[0].payload.longitude}:{latitude:null,longitude:null};this.setState((function(e){return Object(S.a)(Object(S.a)({},e),{},{coordinates:t})}))}},{key:"render",value:function(){var e=this,t=this.props,a=t.message,s=t.onDeleteWorkout,r=t.sports,n=t.t,o=t.user,c=t.workouts,i=this.state,l=i.coordinates,d=i.displayModal,u=Object(he.a)(c,1)[0],m=u?u.title:n("workouts:Workout"),j=u?r.filter((function(e){return e.id===u.sport_id})):[],p=Object(he.a)(j,1)[0],h=parseInt(this.props.match.params.segmentId),b=h>=0?"segment":"workout";return Object(N.jsxs)("div",{className:"workout-page",children:[Object(N.jsx)(w.a,{children:Object(N.jsxs)("title",{children:["FitTrackee - ",m]})}),a?Object(N.jsx)(_,{message:a,t:n}):Object(N.jsxs)("div",{className:"container",children:[d&&Object(N.jsx)(He,{title:n("common:Confirmation"),text:n("workouts:Are you sure you want to delete this workout?"),confirm:function(){s(u.id),e.displayModal(!1)},close:function(){return e.displayModal(!1)}}),u&&p&&1===c.length&&Object(N.jsxs)("div",{children:[Object(N.jsx)("div",{className:"row",children:Object(N.jsx)("div",{className:"col",children:Object(N.jsxs)("div",{className:"card workout-card",children:[Object(N.jsx)("div",{className:"card-header",children:Object(N.jsx)(qe,{workout:u,dataType:b,segmentId:h,sport:p,t:n,title:m,user:o,displayModal:function(){return e.displayModal(!0)}})}),Object(N.jsx)("div",{className:"card-body",children:Object(N.jsxs)("div",{className:"row",children:[Object(N.jsx)("div",{className:"col-md-8",children:u.with_gpx?Object(N.jsx)(rt,{workout:u,coordinates:l,dataType:b,segmentId:h}):Object(N.jsx)(nt,{t:n})}),Object(N.jsx)("div",{className:"col",children:Object(N.jsx)(Ke,{workout:"workout"===b?u:u.segments[h-1],t:n})})]})})]})})}),u.with_gpx&&Object(N.jsx)("div",{className:"row",children:Object(N.jsx)("div",{className:"col",children:Object(N.jsx)("div",{className:"card workout-card",children:Object(N.jsx)("div",{className:"card-body",children:Object(N.jsx)("div",{className:"row",children:Object(N.jsxs)("div",{className:"col",children:[Object(N.jsx)("div",{className:"chart-title",children:n("workouts:Chart")}),Object(N.jsx)(Ve,{workout:u,dataType:b,segmentId:h,t:n,updateCoordinates:function(t){return e.updateCoordinates(t)}})]})})})})})}),"workout"===b&&Object(N.jsxs)(N.Fragment,{children:[Object(N.jsx)(ot,{notes:u.notes,t:n}),u.segments.length>1&&Object(N.jsx)(ct,{segments:u.segments,t:n})]})]})]})]})}}]),a}(n.a.Component),lt=Object(y.a)()(Object(v.c)((function(e){return{workouts:e.workouts.data,message:e.message,sports:e.sports.data,user:e.user}}),(function(e){return{loadWorkout:function(t){e(X("getData","workouts",{id:t}))},onDeleteWorkout:function(t){var a;e((a=t,function(e){return q.deleteData("workouts",a).then((function(t){var s;204===t.status?Promise.resolve(e((s=a,{type:"REMOVE_WORKOUT",workoutId:s}))).then((function(){return e(Ce())})).then((function(){return Ws.push("/")})):e(V("workouts|".concat(t.status)))})).catch((function(t){return e(V("workouts|".concat(t)))}))}))}}}))(it)),dt=function(e){Object(x.a)(a,e);var t=Object(g.a)(a);function a(){return Object(f.a)(this,a),t.apply(this,arguments)}return Object(O.a)(a,[{key:"componentDidMount",value:function(){this.props.loadWorkout(this.props.match.params.workoutId)}},{key:"render",value:function(){var e=this.props,t=e.message,a=e.sports,s=e.workouts,r=Object(he.a)(s,1)[0];return Object(N.jsx)("div",{children:a.length>0&&Object(N.jsx)(Ie,{workout:r,message:t,sports:a})})}}]),a}(n.a.Component),ut=Object(v.c)((function(e){return{workouts:e.workouts.data,message:e.message,sports:e.sports.data,user:e.user}}),(function(e){return{loadWorkout:function(t){e(X("getData","workouts",{id:t}))}}}))(dt);var mt=Object(v.c)((function(e){return{user:e.user}}))((function(){return Object(N.jsx)("div",{children:F()?Object(N.jsxs)(k.d,{children:[Object(N.jsx)(k.b,{exact:!0,path:"/workouts/add",component:We}),Object(N.jsx)(k.b,{exact:!0,path:"/workouts/:workoutId",component:lt}),Object(N.jsx)(k.b,{exact:!0,path:"/workouts/:workoutId/edit",component:ut}),Object(N.jsx)(k.b,{path:"/workouts/:workoutId/segment/:segmentId",component:lt}),Object(N.jsx)(k.b,{component:me})]}):Object(N.jsx)(k.a,{to:"/login"})})})),jt=function(e){Object(x.a)(a,e);var t=Object(g.a)(a);function a(){return Object(f.a)(this,a),t.apply(this,arguments)}return Object(O.a)(a,[{key:"render",value:function(){var e=this.props.t;return Object(N.jsx)("div",{className:"card text-center",children:Object(N.jsxs)("div",{className:"card-body",children:[e("common:No workouts.")," ",Object(N.jsx)(ae.a,{to:{pathname:"/workouts/add"},children:e("dashboard:Upload one !")})]})})}}]),a}(n.a.PureComponent),pt=function(e){Object(x.a)(a,e);var t=Object(g.a)(a);function a(){return Object(f.a)(this,a),t.apply(this,arguments)}return Object(O.a)(a,[{key:"render",value:function(){var e=this.props,t=e.loadWorkouts,a=e.sports,s=e.t,r=e.updateParams,n=Ne(a,s);return Object(N.jsx)("div",{className:"card",children:Object(N.jsx)("div",{className:"card-body workout-filter",children:Object(N.jsxs)("form",{onSubmit:function(e){return e.preventDefault()},children:[Object(N.jsxs)("div",{className:"form-group",children:[Object(N.jsxs)("label",{children:[s("workouts:From"),":",Object(N.jsx)("input",{className:"form-control col-md",name:"from",onChange:function(e){return r(e)},type:"date"})]}),Object(N.jsxs)("label",{children:[s("workouts:To"),":",Object(N.jsx)("input",{className:"form-control col-md",name:"to",onChange:function(e){return r(e)},type:"date"})]})]}),Object(N.jsx)("div",{className:"form-group",children:Object(N.jsxs)("label",{children:[s("common:Sport"),":",Object(N.jsxs)("select",{className:"form-control input-lg",name:"sport_id",onChange:function(e){return r(e)},children:[Object(N.jsx)("option",{value:""}),n.map((function(e){return Object(N.jsx)("option",{value:e.id,children:e.label},e.id)}))]})]})}),Object(N.jsx)("div",{className:"form-group",children:Object(N.jsxs)("label",{children:[s("workouts:Distance")," (km):",Object(N.jsx)("div",{className:"container",children:Object(N.jsxs)("div",{className:"row",children:[Object(N.jsx)("div",{className:"col-5",children:Object(N.jsx)("input",{className:"form-control",min:0,name:"distance_from",onChange:function(e){return r(e)},step:"1",type:"number"})}),Object(N.jsx)("div",{className:"col-2 align-middle text-center",children:s("common:to")}),Object(N.jsx)("div",{className:"col-5",children:Object(N.jsx)("input",{className:"form-control",min:0,name:"distance_to",onChange:function(e){return r(e)},step:"1",type:"number"})})]})})]})}),Object(N.jsx)("div",{className:"form-group",children:Object(N.jsxs)("label",{children:[s("workouts:Duration"),":",Object(N.jsx)("div",{className:"container",children:Object(N.jsxs)("div",{className:"row",children:[Object(N.jsx)("div",{className:"col-5",children:Object(N.jsx)("input",{className:"form-control",name:"duration_from",onChange:function(e){return r(e)},pattern:"^([0-9]*[0-9]):([0-5][0-9])$",placeholder:"hh:mm",type:"text"})}),Object(N.jsx)("div",{className:"col-2 align-middle text-center",children:s("common:to")}),Object(N.jsx)("div",{className:"col-5",children:Object(N.jsx)("input",{className:"form-control",name:"duration_to",onChange:function(e){return r(e)},pattern:"^([0-9]*[0-9]):([0-5][0-9])$",placeholder:"hh:mm",type:"text"})})]})})]})}),Object(N.jsx)("div",{className:"form-group",children:Object(N.jsxs)("label",{children:[s("workouts:Average speed")," (km/h):",Object(N.jsx)("div",{className:"container",children:Object(N.jsxs)("div",{className:"row",children:[Object(N.jsx)("div",{className:"col-5",children:Object(N.jsx)("input",{className:"form-control",min:0,name:"ave_speed_from",onChange:function(e){return r(e)},step:"1",type:"number"})}),Object(N.jsx)("div",{className:"col-2 align-middle text-center",children:s("common:to")}),Object(N.jsx)("div",{className:"col-5",children:Object(N.jsx)("input",{className:"form-control",min:0,name:"ave_speed_to",onChange:function(e){return r(e)},step:"1",type:"number"})})]})})]})}),Object(N.jsx)("div",{className:"form-group",children:Object(N.jsxs)("label",{children:[s("workouts:Max. speed")," (km/h):",Object(N.jsx)("div",{className:"container",children:Object(N.jsxs)("div",{className:"row",children:[Object(N.jsx)("div",{className:"col-5",children:Object(N.jsx)("input",{className:"form-control",min:0,name:"max_speed_from",onChange:function(e){return r(e)},step:"1",type:"number"})}),Object(N.jsx)("div",{className:"col-2 align-middle text-center",children:s("common:to")}),Object(N.jsx)("div",{className:"col-5",children:Object(N.jsx)("input",{className:"form-control",min:0,name:"max_speed_to",onChange:function(e){return r(e)},step:"1",type:"number"})})]})})]})}),Object(N.jsx)("input",{className:"btn btn-primary btn-lg btn-block",onClick:function(){return t()},type:"submit",value:s("workouts:Filter")})]})})})}}]),a}(n.a.PureComponent),ht=function(e){Object(x.a)(a,e);var t=Object(g.a)(a);function a(){return Object(f.a)(this,a),t.apply(this,arguments)}return Object(O.a)(a,[{key:"render",value:function(){var e=this.props,t=e.display,a=e.workout;return Object(N.jsxs)("div",{className:"workout-map".concat("list"===t?"-list":""),children:[Object(N.jsx)("img",{src:"".concat(T,"workouts/map/").concat(a.map,"?").concat(Date.now()),alt:"workout map"}),Object(N.jsxs)("div",{className:"map-attribution".concat("list"===t?"-list":""),children:[Object(N.jsx)("span",{className:"map-attribution-text",children:"\xa9"}),Object(N.jsx)("a",{className:"map-attribution-text",href:"http://www.openstreetmap.org/copyright",target:"_blank",rel:"noopener noreferrer",children:"OpenStreetMap"})]})]})}}]),a}(n.a.PureComponent),bt=function(e){Object(x.a)(a,e);var t=Object(g.a)(a);function a(){return Object(f.a)(this,a),t.apply(this,arguments)}return Object(O.a)(a,[{key:"render",value:function(){var e=this.props,t=e.loading,a=e.sports,s=e.t,r=e.user,n=e.workouts;return Object(N.jsx)("div",{className:"card workout-card",children:Object(N.jsxs)("div",{className:"card-body",children:[Object(N.jsxs)("table",{className:"table",children:[Object(N.jsx)("thead",{children:Object(N.jsxs)("tr",{children:[Object(N.jsx)("th",{scope:"col"}),Object(N.jsx)("th",{scope:"col",children:s("common:Workout")}),Object(N.jsx)("th",{scope:"col",children:s("workouts:Date")}),Object(N.jsx)("th",{scope:"col",children:s("workouts:Distance")}),Object(N.jsx)("th",{scope:"col",children:s("workouts:Duration")}),Object(N.jsx)("th",{scope:"col",children:s("workouts:Ave. speed")}),Object(N.jsx)("th",{scope:"col",children:s("workouts:Max. speed")})]})}),Object(N.jsx)("tbody",{children:!t&&a&&n.map((function(e,t){return Object(N.jsxs)("tr",{children:[Object(N.jsxs)("td",{children:[Object(N.jsx)("span",{className:"heading-span-absolute",children:s("common:Sport")}),Object(N.jsx)("img",{className:"workout-sport",src:a.filter((function(t){return t.id===e.sport_id})).map((function(e){return e.img})),alt:"workout sport logo"})]}),Object(N.jsxs)("td",{className:"workout-title",children:[Object(N.jsx)("span",{className:"heading-span-absolute",children:s("common:Workout")}),Object(N.jsx)(ae.a,{to:"/workouts/".concat(e.id),children:e.title}),e.map&&Object(N.jsx)(ht,{workout:e,display:"list"})]}),Object(N.jsxs)("td",{children:[Object(N.jsx)("span",{className:"heading-span-absolute",children:s("workouts:Date")}),Object(D.a)(U(e.workout_date,r.timezone),"dd/MM/yyyy HH:mm")]}),Object(N.jsxs)("td",{className:"text-right",children:[Object(N.jsx)("span",{className:"heading-span-absolute",children:s("workouts:Distance")}),Number(e.distance).toFixed(2)," km"]}),Object(N.jsxs)("td",{className:"text-right",children:[Object(N.jsx)("span",{className:"heading-span-absolute",children:s("workouts:Duration")}),e.moving]}),Object(N.jsxs)("td",{className:"text-right",children:[Object(N.jsx)("span",{className:"heading-span-absolute",children:s("workouts:Ave. speed")}),e.ave_speed," km/h"]}),Object(N.jsxs)("td",{className:"text-right",children:[Object(N.jsx)("span",{className:"heading-span-absolute",children:s("workouts:Max. speed")}),e.max_speed," km/h"]})]},t)}))})]}),t&&Object(N.jsx)("div",{className:"loader"})]})})}}]),a}(n.a.PureComponent),ft=function(e){Object(x.a)(a,e);var t=Object(g.a)(a);function a(e,s){var r;return Object(f.a)(this,a),(r=t.call(this,e,s)).state={params:{page:1,per_page:10}},r}return Object(O.a)(a,[{key:"componentDidMount",value:function(){this.props.loadWorkouts(this.state.params)}},{key:"setParams",value:function(e){var t=this.state.params;""===e.target.value?delete t[e.target.name]:t[e.target.name]=e.target.value,t.page=1,this.setState(t)}},{key:"render",value:function(){var e=this,t=this.props,a=t.loading,s=t.loadWorkouts,r=t.loadMoreWorkouts,n=t.message,o=t.sports,c=t.t,i=t.user,l=t.workouts,d=this.state.params,u=!(l.length>0)||null===l[l.length-1].previous_workout;return Object(N.jsxs)("div",{children:[Object(N.jsx)(w.a,{children:Object(N.jsxs)("title",{children:["FitTrackee - ",c("common:Workouts")]})}),n?Object(N.jsx)(_,{message:n,t:c}):Object(N.jsx)("div",{className:"container history",children:Object(N.jsxs)("div",{className:"row",children:[Object(N.jsx)("div",{className:"col-md-3",children:Object(N.jsx)(pt,{sports:o,loadWorkouts:function(){return s(d)},t:c,updateParams:function(t){return e.setParams(t)}})}),Object(N.jsxs)("div",{className:"col-md-9 workouts-result",children:[Object(N.jsx)(bt,{workouts:l,loading:a,sports:o,t:c,user:i}),!u&&Object(N.jsx)("input",{type:"submit",className:"btn btn-default btn-md btn-block",value:"Load more workouts",onClick:function(){d.page+=1,r(d),e.setState(d)}}),0===l.length&&Object(N.jsx)(jt,{t:c})]})]})})]})}}]),a}(n.a.Component),Ot=Object(y.a)()(Object(v.c)((function(e){return{workouts:e.workouts.data,loading:e.loading,message:e.message,sports:e.sports.data,user:e.user}}),(function(e){return{loadWorkouts:function(t){e(X("getData","workouts",t))},loadMoreWorkouts:function(t){e(Fe(t))}}}))(ft));var xt=Object(y.a)()(Object(v.c)((function(e){return{appConfig:e.application.config,pathname:e.router.location.pathname,message:e.message}}),(function(e){return{onDeletePicture:function(){e((function(e){return _e.deletePicture().then((function(t){return 204===t.status?e(Ee()):e(Se(t.message))})).catch((function(e){throw e}))}))},onUploadPicture:function(t){e(function(e){return function(t){e.preventDefault();var a=new FormData;return a.append("file",e.target.picture.files[0]),e.target.reset(),q.addDataWithFile("auth/picture",a).then((function(e){if("success"===e.status)return t(Ee());var a=413===e.status?"Error during picture update, file size exceeds max size.":e.message;return t(Se(a))})).catch((function(e){throw e}))}}(t))}}}))((function(e){var t=e.appConfig,a=e.displayModal,s=e.editable,r=e.isDeletable,n=e.message,o=e.onDeletePicture,c=e.onUploadPicture,i=e.pathname,l=e.t,d=e.user,u=d.created_at?Object(D.a)(new Date(d.created_at),"dd/MM/yyyy HH:mm"):"",m=d.birth_date?Object(D.a)(new Date(d.birth_date),"dd/MM/yyyy"):"",j=M(t.max_single_file_size);return Object(N.jsxs)("div",{children:[Object(N.jsx)(w.a,{children:Object(N.jsxs)("title",{children:["FitTrackee - ",l("user:Profile")]})}),Object(N.jsx)(_,{message:n,t:l}),Object(N.jsxs)("div",{className:"container",children:[Object(N.jsx)("h1",{className:"page-title",children:l("user:Profile")}),Object(N.jsx)("div",{className:"row",children:Object(N.jsx)("div",{className:"col-md-12",children:Object(N.jsxs)("div",{className:"card",children:[Object(N.jsx)("div",{className:"card-header userName",children:Object(N.jsx)("strong",{children:d.username})}),Object(N.jsxs)("div",{className:"card-body",children:[Object(N.jsxs)("div",{className:"row",children:[Object(N.jsxs)("div",{className:"col-md-8",children:[Object(N.jsxs)("p",{children:[Object(N.jsx)("span",{className:"user-label",children:l("user:Email")}),": ",d.email]}),Object(N.jsxs)("p",{children:[Object(N.jsx)("span",{className:"user-label",children:l("user:Registration Date")}),": ",u]}),Object(N.jsxs)("p",{children:[Object(N.jsx)("span",{className:"user-label",children:l("user:First Name")}),": ",d.first_name]}),Object(N.jsxs)("p",{children:[Object(N.jsx)("span",{className:"user-label",children:l("user:Last Name")}),": ",d.last_name]}),Object(N.jsxs)("p",{children:[Object(N.jsx)("span",{className:"user-label",children:l("user:Birth Date")}),": ",m]}),Object(N.jsxs)("p",{children:[Object(N.jsx)("span",{className:"user-label",children:l("user:Location")}),": ",d.location]}),Object(N.jsxs)("p",{children:[Object(N.jsx)("span",{className:"user-label",children:l("user:Bio")}),":"," ",d.bio]}),Object(N.jsxs)("p",{children:[Object(N.jsx)("span",{className:"user-label",children:l("user:Language")}),": ",d.language]}),Object(N.jsxs)("p",{children:[Object(N.jsx)("span",{className:"user-label",children:l("user:Timezone")}),": ",d.timezone]}),Object(N.jsxs)("p",{children:[Object(N.jsx)("span",{className:"user-label",children:l("user:First day of week")}),": ",d.weekm?l("user:Monday"):l("user:Sunday")]})]}),Object(N.jsxs)("div",{className:"col-md-4",children:[!0===d.picture&&Object(N.jsxs)("div",{children:[Object(N.jsx)("img",{alt:"Profile",src:"".concat(T,"users/").concat(d.username,"/picture")+"?".concat(Date.now()),className:"img-fluid App-profile-img-small"}),s&&Object(N.jsxs)(N.Fragment,{children:[Object(N.jsx)("br",{}),Object(N.jsx)("button",{type:"submit",onClick:function(){return o()},children:l("user:Delete picture")}),Object(N.jsx)("br",{}),Object(N.jsx)("br",{})]})]}),s&&Object(N.jsxs)("form",{encType:"multipart/form-data",onSubmit:function(e){return c(e)},children:[Object(N.jsx)("input",{type:"file",name:"picture",accept:".png,.jpg,.gif"}),Object(N.jsx)("br",{}),Object(N.jsx)("button",{type:"submit",children:l("user:Send")})," (max. size: ".concat(j,")")]})," "]})]}),s&&Object(N.jsx)("button",{className:"btn btn-primary",onClick:function(){return Ws.push("/profile/edit")},children:l("common:Edit")}),r&&Object(N.jsx)("button",{className:"btn btn-danger",onClick:function(){return a(!0)},children:l("user:Delete user account")}),Object(N.jsx)("button",{className:"btn btn-secondary",onClick:function(){return"/profile"===i?Ws.push("/"):Ws.go(-1)},children:l("/profile"===i?"common:Back to home":"common:Back")})]})]})})})]})]})})));var gt=Object(y.a)()(Object(v.c)((function(e){return{user:e.user}}))((function(e){var t=e.t,a=e.user;return Object(N.jsx)("div",{children:Object(N.jsx)(xt,{editable:!0,t:t,user:a})})}))),vt=a(902),kt=a(903),wt=a(904),yt=a(905),Nt=a(242),_t=a(247),St=a(906),Dt=a(907),Ct=a(113),Et=a(908),At=a(150);function Mt(e){var t=e.isDisabled,a=e.isMore,s=e.sportImg,r=e.workout;return Object(N.jsx)(ae.a,{className:"calendar-workout".concat(a),to:"/workouts/".concat(r.id),children:Object(N.jsxs)(N.Fragment,{children:[Object(N.jsx)("img",{alt:"workout sport logo",className:"workout-sport ".concat(t),src:s,title:r.title}),r.records.length>0&&Object(N.jsx)("sup",{children:Object(N.jsx)("i",{className:"fa fa-trophy custom-fa-small","aria-hidden":"true",title:r.records.map((function(e){return" ".concat(ge.filter((function(t){return t.record_type===e.record_type}))[0].label)}))})})]})})}var Tt=function(e){Object(x.a)(a,e);var t=Object(g.a)(a);function a(e,s){var r;return Object(f.a)(this,a),(r=t.call(this,e,s)).state={isHidden:!0},r}return Object(O.a)(a,[{key:"handleDisplayMore",value:function(){this.setState({isHidden:!this.state.isHidden})}},{key:"render",value:function(){var e=this,t=this.props,a=t.dayWorkouts,s=t.isDisabled,r=t.sports,n=this.state.isHidden;return Object(N.jsxs)("div",{children:[a.map((function(e){return Object(N.jsx)(Mt,{workout:e,isDisabled:s,isMore:"",sportImg:r.filter((function(t){return t.id===e.sport_id})).map((function(e){return e.img}))},e.id)})),a.length>2&&Object(N.jsx)("i",{className:"fa fa-".concat(n?"plus":"times"," calendar-more"),"aria-hidden":"true",onClick:function(){return e.handleDisplayMore()},title:"show more workouts"}),!n&&Object(N.jsx)("div",{className:"calendar-display-more",children:a.map((function(e){return Object(N.jsx)(Mt,{workout:e,isDisabled:s,isMore:"-more",sportImg:r.filter((function(t){return t.id===e.sport_id})).map((function(e){return e.img}))},e.id)}))})]})}}]),a}(n.a.Component),Pt=function(e,t){var a=Object(vt.a)(e),s=Object(kt.a)(e),r=t?1:0;return{start:Object(wt.a)(a,{weekStartsOn:r}),end:Object(yt.a)(s)}},zt=function(e){Object(x.a)(a,e);var t=Object(g.a)(a);function a(e,s){var r;Object(f.a)(this,a),r=t.call(this,e,s);var n=new Date;return r.state={currentMonth:n,startDate:Pt(n,e.weekm).start,endDate:Pt(n,e.weekm).end,weekStartOnMonday:e.weekm},r}return Object(O.a)(a,[{key:"componentDidMount",value:function(){this.props.loadMonthWorkouts(this.state.startDate,this.state.endDate)}},{key:"renderHeader",value:function(e){var t=this;return Object(N.jsxs)("div",{className:"header row flex-middle",children:[Object(N.jsx)("div",{className:"col col-start",onClick:function(){return t.handlePrevMonth()},children:Object(N.jsx)("i",{className:"fa fa-chevron-left","aria-hidden":"true"})}),Object(N.jsx)("div",{className:"col col-center",children:Object(N.jsx)("span",{children:Object(D.a)(this.state.currentMonth,"MMM yyyy",e)})}),Object(N.jsx)("div",{className:"col col-end",onClick:function(){return t.handleNextMonth()},children:Object(N.jsx)("i",{className:"fa fa-chevron-right","aria-hidden":"true"})})]})}},{key:"renderDays",value:function(e){for(var t=[],a=this.state.startDate,s=0;s<7;s++)t.push(Object(N.jsx)("div",{className:"col col-center",children:Object(D.a)(Object(Nt.a)(a,s),"EEE",e)},s));return Object(N.jsx)("div",{className:"days row",children:t})}},{key:"filterWorkouts",value:function(e){var t=this.props,a=t.workouts,s=t.user;return a?a.filter((function(t){return Object(_t.a)(U(t.workout_date,s.timezone),e)})).reverse():[]}},{key:"renderCells",value:function(){for(var e=this.state,t=e.currentMonth,a=e.startDate,s=e.endDate,r=e.weekStartOnMonday,n=this.props.sports,o=[],c=[],i=a,l="";i<=s;){for(var d=0;d<7;d++){l=Object(D.a)(i,"d");var u=this.filterWorkouts(i),m=Object(St.a)(i,t)?"":"-disabled",j=r?[5,6].includes(d):[0,6].includes(d);c.push(Object(N.jsx)("div",{className:"col cell ".concat(j?" weekend":"").concat(Object(Dt.a)(i)?" today":""),children:Object(N.jsxs)("div",{className:"img".concat(m),children:[Object(N.jsx)("span",{className:"number",children:l}),Object(N.jsx)(Tt,{dayWorkouts:u,isDisabled:m,sports:n})]})},i)),i=Object(Nt.a)(i,1)}o.push(Object(N.jsx)("div",{className:"row",children:c},i)),c=[]}return Object(N.jsx)("div",{className:"body",children:o})}},{key:"updateStateDate",value:function(e){var t=Pt(e,this.state.weekStartOnMonday),a=t.start,s=t.end;this.setState({currentMonth:e,startDate:a,endDate:s}),this.props.loadMonthWorkouts(a,s)}},{key:"handleNextMonth",value:function(){var e=Object(Ct.a)(this.state.currentMonth,1);this.updateStateDate(e)}},{key:"handlePrevMonth",value:function(){var e=Object(Et.a)(this.state.currentMonth,1);this.updateStateDate(e)}},{key:"render",value:function(){var e={locale:"fr"===this.props.language?At.fr:At.enGB};return Object(N.jsx)("div",{className:"card workout-card",children:Object(N.jsxs)("div",{className:"calendar",children:[this.renderHeader(e),this.renderDays(e),this.renderCells()]})})}}]),a}(n.a.Component),Ft=Object(v.c)((function(e){return{workouts:e.calendarWorkouts.data,language:e.language,sports:e.sports.data,user:e.user}}),(function(e){return{loadMonthWorkouts:function(t,a){var s,r,n="yyyy-MM-dd";e((s=Object(D.a)(t,n),r=Object(D.a)(a,n),function(e){return q.getData("workouts",{from:s,to:r,order:"desc",per_page:100}).then((function(t){"success"===t.status?e({type:"UPDATE_CALENDAR",workouts:t.data.workouts}):e(V("workouts|".concat(t.message)))})).catch((function(t){return e(V("workouts|".concat(t)))}))}))}}}))(zt);function Rt(e){var t=e.records,a=e.sports,s=e.t,r=e.user,n=Ne(a,s),o=t.reduce((function(e,t){var a=n.find((function(e){return e.id===t.sport_id}));return void 0===e[a.label]&&(e[a.label]={img:a.img,records:[]}),e[a.label].records.push(function(e,t){var a;switch(e.record_type){case"AS":case"MS":a="".concat(e.value," km/h");break;case"FD":a="".concat(e.value," km");break;default:a=e.value}var s=ge.filter((function(t){return t.record_type===e.record_type})),r=Object(he.a)(s,1)[0];return{workout_date:ve(U(e.workout_date,t)).workout_date,workout_id:e.workout_id,id:e.id,record_type:r.label,value:a}}(t,r.timezone)),e}),{});return Object(N.jsxs)("div",{className:"card workout-card",children:[Object(N.jsx)("div",{className:"card-header",children:s("workouts:Personal records")}),Object(N.jsx)("div",{className:"card-body",children:0===Object.keys(o).length?s("common:No records."):Object.keys(o).sort().map((function(e){return Object(N.jsxs)("div",{children:[Object(N.jsxs)("span",{className:"heading-span",children:[Object(N.jsx)("img",{alt:"".concat(e," logo"),className:"record-logo",src:o[e].img}),e]}),Object(N.jsxs)("table",{className:"table table-borderless table-sm record-table",children:[Object(N.jsx)("thead",{children:Object(N.jsx)("tr",{children:Object(N.jsxs)("th",{colSpan:"3",children:[Object(N.jsx)("img",{alt:"".concat(e," logo"),className:"record-logo",src:o[e].img}),e]})})}),Object(N.jsx)("tbody",{children:o[e].records.map((function(e){return Object(N.jsxs)("tr",{className:"record-tr",children:[Object(N.jsx)("td",{className:"record-td",children:s("workouts:".concat(e.record_type))}),Object(N.jsx)("td",{className:"record-td text-right",children:e.value}),Object(N.jsx)("td",{className:"record-td text-right",children:Object(N.jsx)(ae.a,{to:"/workouts/".concat(e.workout_id),children:e.workout_date})})]},e.id)}))})]})]},e)}))})]})}var Lt=a(243),Ut=a(909),It=[{duration:"week",dateFormat:"yyyy-MM-dd",xAxis:"dd/MM"},{duration:"month",dateFormat:"yyyy-MM",xAxis:"MM/yyyy"},{duration:"year",dateFormat:"yyyy",xAxis:"yyyy"}],Wt=function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],a="0";t&&(a=String(Math.floor(e/86400)),e%=86400);var s=String(Math.floor(e/3600)).padStart(2,"0");e%=3600;var r=String(Math.floor(e/60)).padStart(2,"0"),n=String(e%60).padStart(2,"0");return t?"".concat("0"===a?"":"".concat(a,"d:")).concat("00"===s?"":"".concat(s,"h:")).concat(r,"m:").concat(n,"s"):"".concat("00"===s?"":"".concat(s,":")).concat(r,":").concat(n)},Ht=function(e,t){return 0===t?"":"distance"===e?"".concat(t.toFixed(2)," km"):"duration"===e?Wt(t):t},qt=function(e,t){switch(e){case"week":return Object(Nt.a)(t,7);case"year":return Object(Lt.a)(t,1);case"month":default:return Object(Ct.a)(t,1)}},Bt=function(e,t,a,s,r){for(var n=[],o=[],c=[],i=function(r){var i=It.filter((function(e){return e.duration===a.duration})),l=Object(he.a)(i,1)[0],d=Object(D.a)(r,l.dateFormat),u=Object(D.a)(r,l.xAxis),m={date:u},j={date:u},p={date:u};e[d]&&Object.keys(e[d]).filter((function(e){return!s||s.includes(+e)})).map((function(a){var s=t.filter((function(e){return e.id===+a}))[0].label;return m[s]=e[d][a].nb_workouts,j[s]=e[d][a].total_distance,p[s]=e[d][a].total_duration,null})),n.push(m),o.push(j),c.push(p)},l=function(e,t,a){switch(e){case"week":return Object(wt.a)(t,{weekStartsOn:a?1:0});case"year":return Object(Ut.a)(t);case"month":default:return Object(vt.a)(t)}}(a.duration,a.start,r);l<=a.end;l=qt(a.duration,l))i(l);return{workouts:n,distance:o,duration:c}},Gt=function(e,t){return"duration"===e?Wt(t,!0):"distance"===e?t.toFixed(2):t};function Vt(e){if(e.active){var t=e.displayedData,a=e.payload,s=e.label,r=0;return a.map((function(e){return r+=e.value})),Object(N.jsxs)("div",{className:"custom-tooltip",children:[Object(N.jsx)("p",{className:"custom-tooltip-label",children:s}),a.map((function(e){return Object(N.jsxs)("p",{style:{color:e.fill},children:[e.name,": ",Gt(t,e.value)," ",e.unit]},e.name)})),a.length>0&&Object(N.jsxs)("p",{children:["Total: ",Gt(t,r)]})]})}return null}function Jt(e){var t=e.displayedData,a=e.x,s=e.y,r=e.width,n=e.value;if(!n)return null;var o=Ht(t,n);return Object(N.jsx)("g",{children:Object(N.jsx)("text",{x:a+r/2,y:s-10,fill:"#666",fontSize:"11",textAnchor:"middle",dominantBaseline:"middle",children:o})})}var Kt=function(e){Object(x.a)(a,e);var t=Object(g.a)(a);function a(e,s){var r;return Object(f.a)(this,a),(r=t.call(this,e,s)).state={displayedData:"distance"},r}return Object(O.a)(a,[{key:"handleRadioChange",value:function(e){this.setState({displayedData:e.target.name})}},{key:"render",value:function(){var e=this,t=this.state.displayedData,a=this.props,s=a.sports,r=a.stats,n=a.t;return 0===Object.keys(r).length?n("common:No workouts."):Object(N.jsxs)("div",{className:"chart-stats",children:[Object(N.jsxs)("div",{className:"row chart-radio",children:[Object(N.jsxs)("label",{className:"radioLabel col",children:[Object(N.jsx)("input",{type:"radio",name:"distance",checked:"distance"===t,onChange:function(t){return e.handleRadioChange(t)}}),n("statistics:distance")]}),Object(N.jsxs)("label",{className:"radioLabel col",children:[Object(N.jsx)("input",{type:"radio",name:"duration",checked:"duration"===t,onChange:function(t){return e.handleRadioChange(t)}}),n("statistics:duration")]}),Object(N.jsxs)("label",{className:"radioLabel col",children:[Object(N.jsx)("input",{type:"radio",name:"workouts",checked:"workouts"===t,onChange:function(t){return e.handleRadioChange(t)}}),n("statistics:workouts")]})]}),Object(N.jsx)(Be.f,{height:300,children:Object(N.jsxs)(Be.c,{data:r[t],margin:{top:15,bottom:0},children:[Object(N.jsx)(Be.h,{dataKey:"date",interval:0}),Object(N.jsx)(Be.i,{tickFormatter:function(e){return Ht(t,e)}}),Object(N.jsx)(Be.g,{content:Object(N.jsx)(Vt,{displayedData:t})}),s.map((function(e,a){return Object(N.jsx)(Be.b,{isAnimationActive:!1,dataKey:e.label,stackId:"a",fill:xe[a],label:a===s.length-1?Object(N.jsx)(Jt,{displayedData:t}):"",name:n("sports:".concat(e.label))},e.id)}))]})})]})}}]),a}(n.a.PureComponent),Yt=function(e){Object(x.a)(a,e);var t=Object(g.a)(a);function a(){return Object(f.a)(this,a),t.apply(this,arguments)}return Object(O.a)(a,[{key:"componentDidMount",value:function(){this.updateData()}},{key:"componentDidUpdate",value:function(e){(this.props.user.username&&this.props.user.username!==e.user.username||this.props.statsParams!==e.statsParams)&&this.updateData()}},{key:"updateData",value:function(){this.props.user.username&&this.props.loadWorkouts(this.props.user.username,this.props.user.weekm,this.props.statsParams)}},{key:"render",value:function(){var e=this.props,t=e.displayedSports,a=e.sports,s=e.statistics,r=e.statsParams,n=e.displayEmpty,o=e.t,c=e.user;if(!n&&0===Object.keys(s).length)return Object(N.jsx)("span",{children:o("common:No workouts.")});var i=Bt(s,a,r,t,c.weekm);return Object(N.jsx)(Kt,{sports:a,stats:i,t:o})}}]),a}(n.a.PureComponent),Xt=Object(v.c)((function(e){return{sports:e.sports.data,statistics:e.statistics.data,user:e.user}}),(function(e){return{loadWorkouts:function(t,a,s){var r="yyyy-MM-dd",n="week"===s.duration?"".concat(s.duration).concat(a?"m":""):s.duration,o={from:Object(D.a)(s.start,r),to:Object(D.a)(s.end,r),time:n};e(function(e,t,a){return function(s){return q.getData("stats/".concat(e,"/").concat(t),a).then((function(e){"success"===e.status?s(B("statistics",e.data)):s(V("statistics|".concat(e.message)))})).catch((function(e){return s(V("statistics|".concat(e)))}))}}(t,s.type,o))}}}))(Yt),$t=function(e){Object(x.a)(a,e);var t=Object(g.a)(a);function a(e,s){var r;Object(f.a)(this,a),r=t.call(this,e,s);var n=new Date;return r.state={start:Object(vt.a)(n),end:Object(kt.a)(n),duration:"week",type:"by_time"},r}return Object(O.a)(a,[{key:"render",value:function(){var e=this.props.t;return Object(N.jsxs)("div",{className:"card workout-card",children:[Object(N.jsx)("div",{className:"card-header",children:e("dashboard:This month")}),Object(N.jsx)("div",{className:"card-body",children:Object(N.jsx)(Xt,{displayEmpty:!1,statsParams:this.state,t:e})})]})}}]),a}(n.a.Component);function Zt(e){var t=e.t,a=e.user,s=a.total_duration.match(/day/g)?"".concat(a.total_duration.split(" ")[0]," ").concat(a.total_duration.match(/days/g)?t("common:days"):t("common:day")):"0 ".concat(t("common:days"),","),r=a.total_duration.match(/day/g)?a.total_duration.split(", ")[1]:a.total_duration;return r="".concat(r.split(":")[0],"h ").concat(r.split(":")[1],"min"),Object(N.jsxs)("div",{className:"row",children:[Object(N.jsx)("div",{className:"col-lg-3 col-md-6 col-sm-6",children:Object(N.jsx)("div",{className:"card workout-card",children:Object(N.jsxs)("div",{className:"card-body row",children:[Object(N.jsx)("div",{className:"col-3",children:Object(N.jsx)("i",{className:"fa fa-calendar fa-3x fa-color"})}),Object(N.jsxs)("div",{className:"col-9 text-right",children:[Object(N.jsx)("div",{className:"huge",children:a.nb_workouts}),Object(N.jsx)("div",{children:"".concat(1===a.nb_workouts?t("common:workout"):t("common:workouts"))})]})]})})}),Object(N.jsx)("div",{className:"col-lg-3 col-md-6 col-sm-6",children:Object(N.jsx)("div",{className:"card workout-card",children:Object(N.jsxs)("div",{className:"card-body row",children:[Object(N.jsx)("div",{className:"col-3",children:Object(N.jsx)("i",{className:"fa fa-road fa-3x fa-color"})}),Object(N.jsxs)("div",{className:"col-9 text-right",children:[Object(N.jsx)("div",{className:"huge",children:Number(a.total_distance).toFixed(2)}),Object(N.jsx)("div",{children:"km"})]})]})})}),Object(N.jsx)("div",{className:"col-lg-3 col-md-6 col-sm-6",children:Object(N.jsx)("div",{className:"card workout-card",children:Object(N.jsxs)("div",{className:"card-body row",children:[Object(N.jsx)("div",{className:"col-3",children:Object(N.jsx)("i",{className:"fa fa-clock-o fa-3x fa-color"})}),Object(N.jsxs)("div",{className:"col-9 text-right",children:[Object(N.jsx)("div",{className:"huge",children:s}),Object(N.jsx)("div",{children:r})]})]})})}),Object(N.jsx)("div",{className:"col-lg-3 col-md-6 col-sm-6",children:Object(N.jsx)("div",{className:"card workout-card",children:Object(N.jsxs)("div",{className:"card-body row",children:[Object(N.jsx)("div",{className:"col-3",children:Object(N.jsx)("i",{className:"fa fa-tags fa-3x fa-color"})}),Object(N.jsxs)("div",{className:"col-9 text-right",children:[Object(N.jsx)("div",{className:"huge",children:a.nb_sports}),Object(N.jsx)("div",{children:"".concat(1===a.nb_sports?t("common:sport"):t("common:sports"))})]})]})})})]})}function Qt(e){var t=e.sports,a=e.t,s=e.user,r=e.workout;return Object(N.jsxs)("div",{className:"card workout-card text-center",children:[Object(N.jsx)("div",{className:"card-header",children:Object(N.jsxs)(ae.a,{to:"/workouts/".concat(r.id),children:[t.filter((function(e){return e.id===r.sport_id})).map((function(e){return a("sports:".concat(e.label))}))," ","-"," ",Object(D.a)(U(r.workout_date,s.timezone),"dd/MM/yyyy HH:mm")]})}),Object(N.jsx)("div",{className:"card-body",children:Object(N.jsxs)("div",{className:"row",children:[r.map&&Object(N.jsx)("div",{className:"col",children:Object(N.jsx)(ht,{workout:r})}),Object(N.jsx)("div",{className:"col",children:Object(N.jsxs)("p",{children:[Object(N.jsx)("i",{className:"fa fa-clock-o","aria-hidden":"true"})," ",a("workouts:Duration"),": ",r.moving,r.map?Object(N.jsxs)("span",{children:[Object(N.jsx)("br",{}),Object(N.jsx)("br",{})]}):" - ",Object(N.jsx)("i",{className:"fa fa-road","aria-hidden":"true"})," ",a("workouts:Distance"),": ",r.distance," km"]})})]})})]})}var ea=function(e){Object(x.a)(a,e);var t=Object(g.a)(a);function a(e,s){var r;return Object(f.a)(this,a),(r=t.call(this,e,s)).state={page:1},r}return Object(O.a)(a,[{key:"componentDidMount",value:function(){this.props.loadWorkouts()}},{key:"render",value:function(){var e=this,t=this.props,a=t.loadMoreWorkouts,s=t.message,r=t.records,n=t.sports,o=t.t,c=t.user,i=t.workouts,l=!(i.length>0)||null===i[i.length-1].previous_workout,d=this.state.page;return Object(N.jsxs)("div",{children:[Object(N.jsx)(w.a,{children:Object(N.jsxs)("title",{children:["FitTrackee - ",o("common:Dashboard")]})}),s?Object(N.jsx)(_,{message:s,t:o}):i&&c.total_duration&&n.length>0&&Object(N.jsxs)("div",{className:"container dashboard",children:[Object(N.jsx)(Zt,{user:c,t:o}),Object(N.jsxs)("div",{className:"row",children:[Object(N.jsxs)("div",{className:"col-md-4",children:[Object(N.jsx)($t,{t:o}),Object(N.jsx)(Rt,{t:o,records:r,sports:n,user:c})]}),Object(N.jsxs)("div",{className:"col-md-8",children:[Object(N.jsx)(Ft,{weekm:c.weekm}),i.length>0?i.map((function(e){return Object(N.jsx)(Qt,{workout:e,sports:n,t:o,user:c},e.id)})):Object(N.jsx)(jt,{t:o}),!l&&Object(N.jsx)("input",{type:"submit",className:"btn btn-default btn-md btn-block",value:"Load more workouts",onClick:function(){a(d+1),e.setState({page:d+1})}})]})]})]})]})}}]),a}(n.a.Component),ta=Object(y.a)()(Object(v.c)((function(e){return{workouts:e.workouts.data,message:e.message,records:e.records.data,sports:e.sports.data,user:e.user}}),(function(e){return{loadWorkouts:function(){e(X("getData","workouts",{page:1})),e(X("getData","records"))},loadMoreWorkouts:function(t){e(Fe({page:t}))}}}))(ea));function aa(){return Object(N.jsx)("footer",{className:"footer",children:Object(N.jsxs)("div",{className:"container",children:[Object(N.jsx)("strong",{children:"FitTrackee"})," v","0.4.7"," -"," ",Object(N.jsx)("a",{href:"https://github.com/SamR1/FitTrackee",target:"_blank",rel:"noopener noreferrer",children:"source code"})," ","under"," ",Object(N.jsx)("a",{href:"https://choosealicense.com/licenses/gpl-3.0/",target:"_blank",rel:"noopener noreferrer",children:"GPLv3"})," ","license -"," ",Object(N.jsx)("a",{href:"https://samr1.github.io/FitTrackee/",target:"_blank",rel:"noopener noreferrer",children:"documentation"})]})})}var sa,ra,na,oa,ca,ia,la,da,ua,ma,ja,pa,ha,ba=function(e){Object(x.a)(a,e);var t=Object(g.a)(a);function a(){return Object(f.a)(this,a),t.apply(this,arguments)}return Object(O.a)(a,[{key:"componentDidMount",value:function(){this.props.UserLogout()}},{key:"render",value:function(){return Object(N.jsx)("div",{className:"container dashboard",children:Object(N.jsxs)("div",{className:"row",children:[Object(N.jsx)("div",{className:"col-2"}),Object(N.jsx)("div",{className:"card col-8",children:Object(N.jsx)("div",{className:"card-body",children:Object(N.jsx)("div",{className:"text-center",children:Object(N.jsxs)(pe.a,{i18nKey:"user:loggedOut",children:["You are now logged out. Click ",Object(N.jsx)(ae.a,{to:"/login",children:"here"})," to log back in."]})})})}),Object(N.jsx)("div",{className:"col-2"})]})})}}]),a}(n.a.Component),fa=Object(v.c)((function(e){return{user:e.user}}),(function(e){return{UserLogout:function(){e({type:"LOGOUT"})}}}))(ba);function Oa(){return(Oa=Object.assign||function(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(s=0;s=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}function ga(e,t){var a=e.title,s=e.titleId,n=xa(e,["title","titleId"]);return r.createElement("svg",Oa({id:"Capa_1",enableBackground:"new 0 0 512 512",height:512,viewBox:"0 0 512 512",width:512,xmlns:"http://www.w3.org/2000/svg",ref:t,"aria-labelledby":s},n),a?r.createElement("title",{id:s},a):null,sa||(sa=r.createElement("path",{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",fill:"#f0f9ff"})),ra||(ra=r.createElement("path",{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",fill:"#f40055"})),na||(na=r.createElement("path",{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",fill:"#c20044"})),oa||(oa=r.createElement("path",{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",fill:"#f40055"})),ca||(ca=r.createElement("path",{d:"m313.425 313.425v9.557l181.765 151.211c7.683-6.204 13.288-14.874 15.613-24.796l-163.446-135.971z",fill:"#c20044"})),ia||(ia=r.createElement("path",{d:"m53.273 27.803 145.302 120.879v-120.879z",fill:"#406bd4"})),la||(la=r.createElement("path",{d:"m313.425 150.571v-122.768h148.082z",fill:"#3257b0"})),da||(da=r.createElement("path",{d:"m394.732 198.575 117.268-97.556v97.556z",fill:"#3257b0"})),ua||(ua=r.createElement("g",{fill:"#406bd4"},r.createElement("path",{d:"m0 99.317v99.258h119.313z"}),r.createElement("path",{d:"m0 313.425v97.699l117.44-97.699z"}),r.createElement("path",{d:"m50.49 484.197 148.085-122.676v122.676z"}))),ma||(ma=r.createElement("path",{d:"m313.425 484.197v-124.139l149.221 124.139z",fill:"#3257b0"})),ja||(ja=r.createElement("path",{d:"m512 409.423-115.395-95.998h115.395z",fill:"#3257b0"})),pa||(pa=r.createElement("path",{d:"m512 222.142h-222.142v-194.339h-67.716v194.339h-222.142v67.716h222.142v194.339h67.716v-194.339h222.142z",fill:"#f40055"})),ha||(ha=r.createElement("path",{d:"m289.858 222.142v-194.339h-33.858v456.394h33.858v-194.339h222.142v-67.716z",fill:"#c20044"})))}var va,ka,wa,ya,Na=r.forwardRef(ga);a.p;function _a(){return(_a=Object.assign||function(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(s=0;s=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}function Da(e,t){var a=e.title,s=e.titleId,n=Sa(e,["title","titleId"]);return r.createElement("svg",_a({id:"Capa_1",enableBackground:"new 0 0 512 512",height:512,viewBox:"0 0 512 512",width:512,xmlns:"http://www.w3.org/2000/svg",ref:t,"aria-labelledby":s},n),a?r.createElement("title",{id:s},a):null,va||(va=r.createElement("path",{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",fill:"#406bd4"})),ka||(ka=r.createElement("path",{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",fill:"#c20044"})),wa||(wa=r.createElement("path",{d:"m160.795 27.803h190.409v456.394h-190.409z",fill:"#f0f9ff"})),ya||(ya=r.createElement("path",{d:"m256 27.803h95.205v456.394h-95.205z",fill:"#cee5f5"})))}var Ca,Ea,Aa,Ma,Ta,Pa,za,Fa=r.forwardRef(Da),Ra=(a.p,[{name:"en",selected:!0,flag:Object(N.jsx)(Na,{})},{name:"fr",selected:!1,flag:Object(N.jsx)(Fa,{})}]),La=function(e){Object(x.a)(a,e);var t=Object(g.a)(a);function a(e){var s;return Object(f.a)(this,a),(s=t.call(this,e)).state={isOpen:!1},s}return Object(O.a)(a,[{key:"toggleDropdown",value:function(){this.setState((function(e){return{isOpen:!e.isOpen}}))}},{key:"render",value:function(){var e=this,t=this.state.isOpen,a=this.props,s=a.language,r=a.onUpdateLanguage;return Object(N.jsx)("div",{className:"dropdown-wrapper",onClick:function(){return e.toggleDropdown()},children:Object(N.jsx)("ul",{className:"dropdown-list i18n-flag",children:Ra.filter((function(e){return t?e:e.name===s})).map((function(e){return Object(N.jsxs)("li",{className:"dropdown-item".concat(e.name===s&&t?" dropdown-item-selected":""),onClick:function(){return r(e.name,s)},children:[e.flag," ",e.name]},e.name)}))})})}}]),a}(r.Component),Ua=Object(v.c)((function(e){return{language:e.language}}),(function(e){return{onUpdateLanguage:function(t,a){t!==a&&e($(t))}}}))(La),Ia=function(e){Object(x.a)(a,e);var t=Object(g.a)(a);function a(){return Object(f.a)(this,a),t.apply(this,arguments)}return Object(O.a)(a,[{key:"render",value:function(){var e=this.props,t=e.admin,a=e.isAuthenticated,s=e.picture,r=e.t,n=e.username;return Object(N.jsx)("header",{children:Object(N.jsx)("nav",{className:"navbar navbar-expand-lg navbar-light bg-light",children:Object(N.jsxs)("div",{className:"container",children:[Object(N.jsx)("span",{className:"navbar-brand",children:"FitTrackee"}),Object(N.jsx)("button",{className:"navbar-toggler",type:"button","data-toggle":"collapse","data-target":"#navbarSupportedContent","aria-controls":"navbarSupportedContent","aria-expanded":"false","aria-label":"Toggle navigation",children:Object(N.jsx)("span",{className:"navbar-toggler-icon"})}),Object(N.jsxs)("div",{className:"collapse navbar-collapse",id:"navbarSupportedContent",children:[Object(N.jsxs)("ul",{className:"navbar-nav mr-auto",children:[Object(N.jsx)("li",{className:"nav-item",children:Object(N.jsx)(ae.a,{className:"nav-link",to:{pathname:"/"},children:r("common:Dashboard")})}),a&&Object(N.jsx)("li",{className:"nav-item",children:Object(N.jsx)(ae.a,{className:"nav-link",to:{pathname:"/workouts/history"},children:r("Workouts")})}),a&&Object(N.jsx)("li",{className:"nav-item",children:Object(N.jsx)(ae.a,{className:"nav-link",to:{pathname:"/workouts/statistics"},children:r("common:Statistics")})}),t&&Object(N.jsx)("li",{className:"nav-item",children:Object(N.jsx)(ae.a,{className:"nav-link",to:{pathname:"/admin"},children:"Admin"})}),a&&Object(N.jsx)("li",{className:"nav-item",children:Object(N.jsx)(ae.a,{className:"nav-link",to:{pathname:"/workouts/add"},children:Object(N.jsx)("strong",{children:r("common:Add workout")})})})]}),Object(N.jsxs)("ul",{className:"navbar-nav flex-row ml-md-auto d-none d-md-flex",children:[!a&&Object(N.jsx)("li",{className:"nav-item",children:Object(N.jsx)(ae.a,{className:"nav-link",to:{pathname:"/register"},children:r("user:Register")})}),!a&&Object(N.jsx)("li",{className:"nav-item",children:Object(N.jsx)(ae.a,{className:"nav-link",to:{pathname:"/login"},children:r("user:Login")})}),a&&Object(N.jsxs)(N.Fragment,{children:[!0===s?Object(N.jsx)("img",{alt:"Avatar",src:"".concat(T,"users/").concat(n,"/picture?").concat(Date.now()),className:"img-fluid App-nav-profile-img"}):Object(N.jsx)("i",{className:"fa fa-user-circle-o fa-2x no-picture","aria-hidden":"true"}),Object(N.jsx)("li",{className:"nav-item",children:Object(N.jsx)(ae.a,{className:"nav-link",to:{pathname:"/profile"},children:n})}),Object(N.jsx)("li",{className:"nav-item",children:Object(N.jsx)(ae.a,{className:"nav-link",to:{pathname:"/logout"},children:r("user:Logout")})})]}),Object(N.jsx)("li",{children:Object(N.jsx)(Ua,{})})]})]})]})})})}}]),a}(n.a.PureComponent),Wa=Object(y.a)()(Object(v.c)((function(e){var t=e.user;return{admin:t.admin,isAuthenticated:t.isAuthenticated,picture:t.picture,username:t.username}}))(Ia));function Ha(){return(Ha=Object.assign||function(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(s=0;s=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}function Ba(e,t){var a=e.title,s=e.titleId,n=qa(e,["title","titleId"]);return r.createElement("svg",Ha({id:"Layer_1",xmlns:"http://www.w3.org/2000/svg",xmlnsXlink:"http://www.w3.org/1999/xlink",x:"0px",y:"0px",viewBox:"0 0 512.001 512.001",style:{enableBackground:"new 0 0 512.001 512.001"},xmlSpace:"preserve",ref:t,"aria-labelledby":s},n),a?r.createElement("title",{id:s},a):null,Ca||(Ca=r.createElement("g",null,r.createElement("g",null,r.createElement("path",{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"})))),Ea||(Ea=r.createElement("g",null,r.createElement("g",null,r.createElement("path",{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"})))),Aa||(Aa=r.createElement("g",null,r.createElement("g",null,r.createElement("path",{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"})))),Ma||(Ma=r.createElement("g",null,r.createElement("g",null,r.createElement("path",{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"})))),Ta||(Ta=r.createElement("g",null,r.createElement("g",null,r.createElement("path",{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"})))),Pa||(Pa=r.createElement("g",null,r.createElement("g",null,r.createElement("path",{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"})))),za||(za=r.createElement("g",null,r.createElement("g",null,r.createElement("path",{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"})))))}var Ga,Va=r.forwardRef(Ba);a.p;function Ja(){return(Ja=Object.assign||function(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(s=0;s=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}function Ya(e,t){var a=e.title,s=e.titleId,n=Ka(e,["title","titleId"]);return r.createElement("svg",Ja({id:"Capa_1",xmlns:"http://www.w3.org/2000/svg",xmlnsXlink:"http://www.w3.org/1999/xlink",x:"0px",y:"0px",viewBox:"0 0 345.834 345.834",style:{enableBackground:"new 0 0 345.834 345.834"},xmlSpace:"preserve",ref:t,"aria-labelledby":s},n),a?r.createElement("title",{id:s},a):null,Ga||(Ga=r.createElement("g",null,r.createElement("path",{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"}),r.createElement("path",{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"}),r.createElement("path",{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"}),r.createElement("path",{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"}))))}var Xa=r.forwardRef(Ya);a.p;function $a(e){var t=Object(ue.a)().t,a=e.action;return Object(N.jsx)("div",{className:"container dashboard",children:Object(N.jsxs)("div",{className:"row",children:[Object(N.jsx)("div",{className:"col-2"}),Object(N.jsx)("div",{className:"card col-8",children:Object(N.jsx)("div",{className:"card-body",children:Object(N.jsxs)("div",{className:"text-center ",children:["sent"===a&&Object(N.jsxs)(N.Fragment,{children:[Object(N.jsx)("div",{className:"svg-icon",children:Object(N.jsx)(Xa,{})}),t("user:Check your email. If your address is in our database, you'll received an email with a link to reset your password.")]}),"updated"===a&&Object(N.jsxs)(N.Fragment,{children:[Object(N.jsx)("div",{className:"svg-icon",children:Object(N.jsx)(Va,{})}),Object(N.jsxs)(pe.a,{i18nKey:"user:updatedPasswordText",children:["Your password have been updated. Click",Object(N.jsx)(ae.a,{to:"/login",children:"here"})," to log in."]})]})]})})}),Object(N.jsx)("div",{className:"col-2"})]})})}var Za=a(244),Qa=a.n(Za),es=function(e){Object(x.a)(a,e);var t=Object(g.a)(a);function a(e,s){var r;return Object(f.a)(this,a),(r=t.call(this,e,s)).state={formData:{},displayModal:!1},r}return Object(O.a)(a,[{key:"componentDidMount",value:function(){this.initForm()}},{key:"componentDidUpdate",value:function(e){e.user!==this.props.user&&this.initForm()}},{key:"initForm",value:function(){var e=this.props.user,t={};Object.keys(e).map((function(a){return null===e[a]?t[a]="":t[a]="birth_date"===a?Object(D.a)(new Date(e[a]),"yyyy-MM-DD"):e[a]})),this.setState({formData:t})}},{key:"handleFormChange",value:function(e){var t=this.state.formData;"weekm"===e.target.name?t.weekm="Monday"===e.target.value:t[e.target.name]=e.target.value,this.setState(t)}},{key:"displayModal",value:function(e){this.setState((function(t){return Object(S.a)(Object(S.a)({},t),{},{displayModal:e})}))}},{key:"render",value:function(){var e=this,t=this.props,a=t.message,s=t.onDeleteUser,r=t.onHandleProfileFormSubmit,n=t.t,o=t.user,c=this.state,i=c.displayModal,l=c.formData;return Object(N.jsxs)("div",{children:[Object(N.jsx)(w.a,{children:Object(N.jsxs)("title",{children:["FitTrackee - ",n("user:Profile Edition")]})}),l.isAuthenticated&&Object(N.jsxs)("div",{className:"container",children:[i&&Object(N.jsx)(He,{title:n("common:Confirmation"),text:n("user:Are you sure you want to delete your account? All data will be deleted, this cannot be undone."),confirm:function(){s(o.username),e.displayModal(!1)},close:function(){return e.displayModal(!1)}}),Object(N.jsx)("h1",{className:"page-title",children:n("user:Profile Edition")}),Object(N.jsxs)("div",{className:"row",children:[Object(N.jsx)("div",{className:"col-md-2"}),Object(N.jsx)("div",{className:"col-md-8",children:Object(N.jsxs)("div",{className:"card",children:[Object(N.jsx)("div",{className:"card-header",children:o.username}),Object(N.jsx)("div",{className:"card-body",children:Object(N.jsx)("div",{className:"row",children:Object(N.jsxs)("div",{className:"col-md-12",children:[Object(N.jsxs)("form",{onSubmit:function(e){e.preventDefault(),r(l)},children:[Object(N.jsx)("div",{className:"form-group",children:Object(N.jsxs)("label",{children:[n("user:Email"),":",Object(N.jsx)("input",{name:"email",className:"form-control input-lg",type:"text",value:l.email,readOnly:!0})]})}),Object(N.jsx)("div",{className:"form-group",children:Object(N.jsxs)("label",{children:[n("user:Registration Date"),":",Object(N.jsx)("input",{name:"createdAt",className:"form-control input-lg",type:"text",value:l.created_at,disabled:!0})]})}),Object(N.jsx)("div",{className:"form-group",children:Object(N.jsxs)("label",{children:[n("user:Password"),":",Object(N.jsx)("input",{name:"password",className:"form-control input-lg",type:"password",onChange:function(t){return e.handleFormChange(t)}})]})}),Object(N.jsx)("div",{className:"form-group",children:Object(N.jsxs)("label",{children:[n("user:Password Confirmation"),":",Object(N.jsx)("input",{name:"password_conf",className:"form-control input-lg",type:"password",onChange:function(t){return e.handleFormChange(t)}})]})}),Object(N.jsx)("hr",{}),Object(N.jsx)("div",{className:"form-group",children:Object(N.jsxs)("label",{children:[n("user:First Name"),":",Object(N.jsx)("input",{name:"first_name",className:"form-control input-lg",type:"text",value:l.first_name,onChange:function(t){return e.handleFormChange(t)}})]})}),Object(N.jsx)("div",{className:"form-group",children:Object(N.jsxs)("label",{children:[n("user:Last Name"),":",Object(N.jsx)("input",{name:"last_name",className:"form-control input-lg",type:"text",value:l.last_name,onChange:function(t){return e.handleFormChange(t)}})]})}),Object(N.jsx)("div",{className:"form-group",children:Object(N.jsxs)("label",{children:[n("user:Birth Date"),Object(N.jsx)("input",{name:"birth_date",className:"form-control input-lg",type:"date",value:l.birth_date,onChange:function(t){return e.handleFormChange(t)}})]})}),Object(N.jsx)("div",{className:"form-group",children:Object(N.jsxs)("label",{children:[n("user:Location"),":",Object(N.jsx)("input",{name:"location",className:"form-control input-lg",type:"text",value:l.location,onChange:function(t){return e.handleFormChange(t)}})]})}),Object(N.jsx)("div",{className:"form-group",children:Object(N.jsxs)("label",{children:[n("user:Bio"),":",Object(N.jsx)("textarea",{name:"bio",className:"form-control input-lg",maxLength:"200",value:l.bio,onChange:function(t){return e.handleFormChange(t)}})]})}),Object(N.jsx)("div",{className:"form-group",children:Object(N.jsxs)("label",{children:[n("user:Language"),":",Object(N.jsx)("select",{name:"language",className:"form-control input-lg",value:l.language,onChange:function(t){return e.handleFormChange(t)},children:Ra.map((function(e){return Object(N.jsx)("option",{value:e.name,children:e.name},e.name)}))})]})}),Object(N.jsx)("div",{className:"form-group",children:Object(N.jsxs)("label",{children:[n("user:Timezone"),":",Object(N.jsx)(Qa.a,{className:"form-control timezone-custom",onChange:function(t){var a={target:{name:"timezone",value:t||"Europe/Paris"}};e.handleFormChange(a)},value:l.timezone})]})}),Object(N.jsx)("div",{className:"form-group",children:Object(N.jsxs)("label",{children:[n("user:First day of week"),":",Object(N.jsxs)("select",{name:"weekm",className:"form-control input-lg",value:l.weekm?"Monday":"Sunday",onChange:function(t){return e.handleFormChange(t)},children:[Object(N.jsx)("option",{value:"Sunday",children:n("user:Sunday")}),Object(N.jsx)("option",{value:"Monday",children:n("user:Monday")})]})]})}),Object(N.jsx)("button",{type:"submit",className:"btn btn-primary",children:n("common:Submit")}),Object(N.jsx)("button",{className:"btn btn-danger",onClick:function(t){t.preventDefault(),e.displayModal(!0)},children:n("user:Delete my account")}),Object(N.jsx)("button",{type:"submit",className:"btn btn-secondary",onClick:function(){return Ws.push("/profile")},children:n("common:Cancel")})]}),Object(N.jsx)(_,{message:a,t:n})]})})})]})}),Object(N.jsx)("div",{className:"col-md-2"})]})]})]})}}]),a}(n.a.Component),ts=Object(y.a)()(Object(v.c)((function(e){return{location:e.router.location,message:e.message,user:e.user}}),(function(e){return{onDeleteUser:function(t){e(Me(t))},onHandleProfileFormSubmit:function(t){e(function(e){return function(t){return!e.password===e.password_conf?t(De("Password and password confirmation don't match.")):(delete e.id,q.postData("auth/profile/edit",e).then((function(e){if("success"===e.status)return t(Ee()),Ws.push("/profile");t(De(e.message))})).catch((function(e){throw e})))}}(t))}}}))(es)),as=a(910),ss=a(911),rs=a(912),ns=a(245),os=["week","month","year"],cs=function(e){Object(x.a)(a,e);var t=Object(g.a)(a);function a(e,s){var r;Object(f.a)(this,a),r=t.call(this,e,s);var n=new Date;return r.state={displayedSports:e.sports.map((function(e){return e.id})),statsParams:{start:Object(vt.a)(Object(Et.a)(n,11)),end:Object(kt.a)(n),duration:"month",type:"by_time"}},r}return Object(O.a)(a,[{key:"componentDidUpdate",value:function(e){this.props.sports!==e.sports&&this.updateDisplayedSports()}},{key:"updateDisplayedSports",value:function(){var e=this.props.sports;this.setState({displayedSports:e.map((function(e){return e.id}))})}},{key:"handleOnChangeDuration",value:function(e){var t=e.target.name,a=new Date,s="year"===t?Object(Ut.a)(Object(as.a)(a,9)):"week"===t?Object(vt.a)(Object(Et.a)(a,2)):Object(vt.a)(Object(Et.a)(a,11)),r="year"===t?Object(ss.a)(a):"week"===t?Object(yt.a)(a):Object(kt.a)(a);this.setState({statsParams:{duration:t,end:r,start:s,type:"by_time"}})}},{key:"handleOnChangeSports",value:function(e){var t=this.state.displayedSports;t.includes(e)?this.setState({displayedSports:t.filter((function(t){return t!==e}))}):this.setState({displayedSports:t.concat([e])})}},{key:"handleOnClickArrows",value:function(e){var t,a,s=this.state.statsParams,r=s.start,n=s.end,o=s.duration;e?(t="year"===o?Object(Ut.a)(Object(as.a)(r,1)):"week"===o?Object(wt.a)(Object(rs.a)(r,1)):Object(vt.a)(Object(Et.a)(r,1)),a="year"===o?Object(ss.a)(Object(as.a)(n,1)):"week"===o?Object(yt.a)(Object(rs.a)(n,1)):Object(kt.a)(Object(Et.a)(n,1))):(t="year"===o?Object(Ut.a)(Object(Lt.a)(r,1)):"week"===o?Object(wt.a)(Object(ns.a)(r,1)):Object(vt.a)(Object(Ct.a)(r,1)),a="year"===o?Object(ss.a)(Object(Lt.a)(n,1)):"week"===o?Object(yt.a)(Object(ns.a)(n,1)):Object(kt.a)(Object(Ct.a)(n,1))),this.setState({statsParams:{duration:o,end:a,start:t,type:"by_time"}})}},{key:"render",value:function(){var e=this,t=this.state,a=t.displayedSports,s=t.statsParams,r=this.props,n=r.sports,o=r.t,c=r.user,i=Ne(n.filter((function(e){return c.sports_list.includes(e.id)})),o);return Object(N.jsxs)(N.Fragment,{children:[Object(N.jsx)(w.a,{children:Object(N.jsxs)("title",{children:["FitTrackee - ",o("statistics:Statistics")]})}),Object(N.jsxs)("div",{className:"container dashboard",children:[Object(N.jsxs)("div",{className:"card workout-card",children:[Object(N.jsx)("div",{className:"card-header",children:o("statistics:Statistics")}),Object(N.jsxs)("div",{className:"card-body".concat(0===c.nb_workouts?" stats-disabled":""),children:[Object(N.jsxs)("div",{className:"chart-filters row",children:[Object(N.jsx)("div",{className:"col chart-arrows",children:Object(N.jsx)("p",{className:"text-center",children:Object(N.jsx)("i",{className:"fa fa-chevron-left","aria-hidden":"true",onClick:function(){return e.handleOnClickArrows(!0)}})})}),Object(N.jsx)("div",{className:"col-md-3 time-frames justify-content-around",children:os.map((function(t){return Object(N.jsx)("div",{className:"time-frame",children:Object(N.jsxs)("label",{children:[Object(N.jsx)("input",{type:"radio",id:t,name:t,checked:t===s.duration,onChange:function(t){return e.handleOnChangeDuration(t)}}),Object(N.jsx)("span",{children:o("statistics:".concat(t))})]})},t)}))}),Object(N.jsx)("div",{className:"col chart-arrows",children:Object(N.jsx)("p",{className:"text-center",children:Object(N.jsx)("i",{className:"fa fa-chevron-right","aria-hidden":"true",onClick:function(){return e.handleOnClickArrows(!1)}})})})]}),Object(N.jsx)(Xt,{displayEmpty:!0,displayedSports:a,statsParams:s,t:o}),Object(N.jsx)("div",{className:"row chart-workouts",children:i.map((function(t){return Object(N.jsxs)("label",{className:"col workout-label",children:[Object(N.jsx)("input",{type:"checkbox",checked:a.includes(t.id),name:t.label,onChange:function(){return e.handleOnChangeSports(t.id)}}),Object(N.jsx)("span",{style:{color:xe[t.id-1]},children:" ".concat(t.label)})]},t.id)}))})]})]}),0===c.nb_workouts&&Object(N.jsx)(jt,{t:o})]})]})}}]),a}(n.a.Component),is=Object(y.a)()(Object(v.c)((function(e){return{sports:e.sports.data,user:e.user}}))(cs));function ls(e){var t=Object(ue.a)().t,a="user:".concat(e.formType.charAt(0).toUpperCase()).concat(e.formType.slice(1));return Object(N.jsxs)("div",{children:[Object(N.jsx)(w.a,{children:Object(N.jsxs)("title",{children:["FitTrackee - ",t("user:".concat(e.formType))]})}),Object(N.jsx)("h1",{className:"page-title",children:t(a)}),Object(N.jsx)("div",{className:"container",children:Object(N.jsxs)("div",{className:"row",children:[Object(N.jsx)("div",{className:"col-md-3"}),Object(N.jsxs)("div",{className:"col-md-6",children:[Object(N.jsx)("br",{}),"register"!==e.formType||e.isRegistrationAllowed?Object(N.jsxs)(N.Fragment,{children:[Object(N.jsxs)("form",{onSubmit:function(t){return e.handleUserFormSubmit(t,e.formType)},children:["register"===e.formType&&Object(N.jsx)("div",{className:"form-group",children:Object(N.jsx)("input",{className:"form-control input-lg",name:"username",placeholder:t("user:Enter a username"),required:!0,type:"text",value:e.userForm.username,onChange:e.onHandleFormChange})}),"password reset"!==e.formType&&Object(N.jsx)("div",{className:"form-group",children:Object(N.jsx)("input",{className:"form-control input-lg",name:"email",placeholder:t("user:Enter an email address"),required:!0,type:"email",value:e.userForm.email,onChange:e.onHandleFormChange})}),"reset your password"!==e.formType&&Object(N.jsxs)(N.Fragment,{children:[Object(N.jsx)("div",{className:"form-group",children:Object(N.jsx)("input",{className:"form-control input-lg",name:"password",placeholder:t("user:Enter a password"),required:!0,type:"password",value:e.userForm.password,onChange:e.onHandleFormChange})}),"login"!==e.formType&&Object(N.jsx)("div",{className:"form-group",children:Object(N.jsx)("input",{className:"form-control input-lg",name:"password_conf",placeholder:t("user:Enter the password confirmation"),required:!0,type:"password",value:e.userForm.password_conf,onChange:e.onHandleFormChange})})]}),Object(N.jsx)("input",{type:"submit",className:"btn btn-primary btn-lg btn-block",value:t("Submit")})]}),Object(N.jsx)("p",{className:"password-forget",children:"login"===e.formType&&Object(N.jsx)(ae.a,{to:{pathname:"/password-reset/request"},children:t("user:Forgot password?")})})]}):Object(N.jsxs)("div",{className:"card",children:[Object(N.jsx)("div",{className:"card-body",children:"Registration is disabled."}),Object(N.jsx)("div",{className:"card-body",children:Object(N.jsx)("button",{type:"submit",className:"btn btn-secondary btn-lg btn-block",onClick:function(){return Ws.go(-1)},children:"Back"})})]})]}),Object(N.jsx)("div",{className:"col-md-3"})]})})]})}var ds=function(e){Object(x.a)(a,e);var t=Object(g.a)(a);function a(e,s){var r;return Object(f.a)(this,a),(r=t.call(this,e,s)).state={formData:{username:"",email:"",password:"",password_conf:""}},r}return Object(O.a)(a,[{key:"componentDidUpdate",value:function(e){e.location.pathname!==this.props.location.pathname&&this.emptyForm()}},{key:"emptyForm",value:function(){var e=this.state.formData;Object.keys(e).map((function(t){return e[t]=""})),this.setState(e)}},{key:"onHandleFormChange",value:function(e){var t=this.state.formData;t[e.target.name]=e.target.value,this.setState(t)}},{key:"render",value:function(){var e=this,t=this.props,a=t.formType,s=t.isRegistrationAllowed,r=t.message,n=t.messages,o=t.onHandleUserFormSubmit,c=t.t,i=this.state.formData,l=this.props.location.query.token;return Object(N.jsx)("div",{children:F()||"password reset"===a&&!l?Object(N.jsx)(k.a,{to:"/"}):Object(N.jsxs)("div",{children:[Object(N.jsx)(_,{message:r,messages:n,t:c}),Object(N.jsx)(ls,{isRegistrationAllowed:s,formType:a,userForm:i,onHandleFormChange:function(t){return e.onHandleFormChange(t)},handleUserFormSubmit:function(e){e.preventDefault(),"password reset"===a&&(i.token=l),o(i,a)}})]})})}}]),a}(n.a.Component),us=Object(y.a)()(Object(v.c)((function(e){return{isRegistrationAllowed:e.application.config.is_registration_enabled,location:e.router.location,message:e.message,messages:e.messages}}),(function(e){return{onHandleUserFormSubmit:function(t,a){e(Ae(t,a="password reset"===a?"password/update":"reset your password"===a?"password/reset-request":a))}}}))(ds)),ms=function(e){Object(x.a)(a,e);var t=Object(g.a)(a);function a(e,s){var r;return Object(f.a)(this,a),(r=t.call(this,e,s)).state={displayModal:!1},r}return Object(O.a)(a,[{key:"componentDidMount",value:function(){this.props.loadUser(this.props.match.params.userName)}},{key:"componentDidUpdate",value:function(e){e.match.params.userName!==this.props.match.params.userName&&this.props.loadUser(this.props.match.params.userName)}},{key:"displayModal",value:function(e){this.setState((function(t){return Object(S.a)(Object(S.a)({},t),{},{displayModal:e})}))}},{key:"render",value:function(){var e=this,t=this.props,a=t.t,s=t.currentUser,r=t.onDeleteUser,n=t.users,o=this.state.displayModal,c=Object(he.a)(n,1)[0],i=!!c&&s.username===c.username;return Object(N.jsxs)("div",{children:[o&&Object(N.jsx)(He,{title:a("common:Confirmation"),text:a("user:Are you sure you want to delete this account? All data will be deleted, this cannot be undone."),confirm:function(){r(c.username),e.displayModal(!1)},close:function(){return e.displayModal(!1)}}),c&&Object(N.jsx)(xt,{editable:i,isDeletable:s.admin&&!i,onDeleteUser:r,displayModal:function(t){return e.displayModal(t)},t:a,user:c})]})}}]),a}(n.a.Component),js=Object(y.a)()(Object(v.c)((function(e){return{currentUser:e.user,users:e.users.data}}),(function(e){return{onDeleteUser:function(t){e(Me(t,!0))},loadUser:function(t){e(X("getData","users",{username:t}))}}}))(ms)),ps=function(e){Object(x.a)(a,e);var t=Object(g.a)(a);function a(e){var s;return Object(f.a)(this,a),(s=t.call(this,e)).props=e,s}return Object(O.a)(a,[{key:"componentDidMount",value:function(){this.props.loadAppConfig()}},{key:"render",value:function(){return Object(N.jsxs)("div",{className:"App",children:[Object(N.jsx)(Wa,{}),Object(N.jsxs)(k.d,{children:[Object(N.jsx)(k.b,{exact:!0,path:"/",component:ta}),Object(N.jsx)(k.b,{exact:!0,path:"/register",render:function(){return Object(N.jsx)(us,{formType:"register"})}}),Object(N.jsx)(k.b,{exact:!0,path:"/login",render:function(){return Object(N.jsx)(us,{formType:"login"})}}),Object(N.jsx)(k.b,{exact:!0,path:"/password-reset",render:function(){return Object(N.jsx)(us,{formType:"password reset"})}}),Object(N.jsx)(k.b,{exact:!0,path:"/password-reset/request",render:function(){return Object(N.jsx)(us,{formType:"reset your password"})}}),Object(N.jsx)(k.b,{exact:!0,path:"/password-reset/sent",render:function(){return Object(N.jsx)($a,{action:"sent"})}}),Object(N.jsx)(k.b,{exact:!0,path:"/updated-password",render:function(){return Object(N.jsx)($a,{action:"updated"})}}),Object(N.jsx)(k.b,{exact:!0,path:"/password-reset/sent",component:$a}),Object(N.jsx)(k.b,{exact:!0,path:"/logout",component:fa}),Object(N.jsx)(k.b,{exact:!0,path:"/profile/edit",component:ts}),Object(N.jsx)(k.b,{exact:!0,path:"/profile",component:gt}),Object(N.jsx)(k.b,{exact:!0,path:"/workouts/history",component:Ot}),Object(N.jsx)(k.b,{exact:!0,path:"/workouts/statistics",component:is}),Object(N.jsx)(k.b,{exact:!0,path:"/users/:userName",component:js}),Object(N.jsx)(k.b,{path:"/workouts",component:mt}),Object(N.jsx)(k.b,{path:"/admin",component:je}),Object(N.jsx)(k.b,{component:me})]}),Object(N.jsx)(aa,{})]})}}]),a}(n.a.Component),hs=Object(v.c)((function(){return{}}),(function(e){return{loadAppConfig:function(){e(Q("config"))}}}))(ps),bs=a(85);function fs(e){var t=e.store,a=e.history,s=e.children;return Object(N.jsx)(v.a,{store:t,children:Object(N.jsx)(bs.a,{history:a,children:s})})}var Os=Boolean("localhost"===window.location.hostname||"[::1]"===window.location.hostname||window.location.hostname.match(/^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/));function xs(e){navigator.serviceWorker.register(e).then((function(e){e.onupdatefound=function(){var t=e.installing;t.onstatechange=function(){"installed"===t.state&&(navigator.serviceWorker.controller?console.log("New content is available; please refresh."):console.log("Content is cached for offline use."))}}})).catch((function(e){console.error("Error during service worker registration:",e)}))}var gs,vs={data:[]},ks={language:"en",message:"",messages:[],user:{isAuthenticated:!1},workouts:Object(S.a)({},vs),application:{statistics:{},config:{gpx_limit_import:null,is_registration_enabled:null,max_single_file_size:null,max_users:null,max_zip_file_size:null,registration:null}},calendarWorkouts:Object(S.a)({},vs),chartData:[],gpx:null,loading:!1,records:Object(S.a)({},vs),sports:Object(S.a)({},vs),statistics:{data:{}},users:Object(S.a)({},vs)},ws=function(e,t,a){return a.target!==t?e:"SET_DATA"===a.type?Object(S.a)(Object(S.a)({},e),{},{data:a.data[a.target]}):"SET_PAGINATED_DATA"===a.type?Object(S.a)(Object(S.a)({},e),{},{data:a.data[a.target],pagination:a.pagination}):e},ys=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:ks.workouts,t=arguments.length>1?arguments[1]:void 0;switch(t.type){case"LOGOUT":return ks.workouts;case"PUSH_WORKOUTS":return Object(S.a)(Object(S.a)({},e),{},{data:e.data.concat(t.workouts)});case"REMOVE_WORKOUT":return Object(S.a)(Object(S.a)({},e),{},{data:e.data.filter((function(e){return e.id!==t.workoutId}))});default:return ws(e,"workouts",t)}},Ns=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:ks.application,t=arguments.length>1?arguments[1]:void 0;return"SET_APP_CONFIG"===t.type?Object(S.a)(Object(S.a)({},e),{},{config:t.data}):"SET_APP_STATS"===t.type?Object(S.a)(Object(S.a)({},e),{},{statistics:t.data}):e},_s=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:ks.calendarWorkouts,t=arguments.length>1?arguments[1]:void 0;switch(t.type){case"LOGOUT":return ks.calendarWorkouts;case"UPDATE_CALENDAR":return Object(S.a)(Object(S.a)({},e),{},{data:t.workouts});default:return ws(e,"calendarWorkouts",t)}},Ss=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:ks.chartData,t=arguments.length>1?arguments[1]:void 0;return"SET_CHART_DATA"===t.type?t.chartData:e},Ds=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:ks.gpx,t=arguments.length>1?arguments[1]:void 0;return"SET_GPX"===t.type?t.gpxContent:e},Cs=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:ks.language,t=arguments.length>1?arguments[1]:void 0;return"SET_LANGUAGE"===t.type?t.language:e},Es=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:ks.loading,t=arguments.length>1?arguments[1]:void 0;return"SET_LOADING"===t.type?t.loading:e},As=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:ks.message,t=arguments.length>1?arguments[1]:void 0;switch(t.type){case"AUTH_ERROR":case"PROFILE_ERROR":case"PROFILE_UPDATE_ERROR":case"PICTURE_ERROR":case"SET_ERROR":return t.message;case"CLEAN_ALL_MESSAGES":case"LOGOUT":case"PROFILE_SUCCESS":case"SET_APP_CONFIG":case"SET_RESULTS":case"@@router/LOCATION_CHANGE":return"";default:return e}},Ms=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:ks.messages,t=arguments.length>1?arguments[1]:void 0;switch(t.type){case"AUTH_ERRORS":case"APP_ERRORS":return t.messages;case"CLEAN_ALL_MESSAGES":case"LOGOUT":case"PROFILE_SUCCESS":case"@@router/LOCATION_CHANGE":return[];default:return e}},Ts=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:ks.records,t=arguments.length>1?arguments[1]:void 0;return"LOGOUT"===t.type?ks.records:ws(e,"records",t)},Ps=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:ks.sports,t=arguments.length>1?arguments[1]:void 0;return"UPDATE_SPORT_DATA"===t.type?Object(S.a)(Object(S.a)({},e),{},{data:e.data.map((function(e){return e.id===t.data.id&&(e.is_active=t.data.is_active),e}))}):ws(e,"sports",t)},zs=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:ks.users,t=arguments.length>1?arguments[1]:void 0;return"UPDATE_USER_DATA"===t.type?Object(S.a)(Object(S.a)({},e),{},{data:e.data.map((function(e){return e.username===t.data.username&&(e.admin=t.data.admin),e}))}):ws(e,"users",t)},Fs=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:ks.user,t=arguments.length>1?arguments[1]:void 0;switch(t.type){case"AUTH_ERROR":case"PROFILE_ERROR":case"LOGOUT":return window.localStorage.removeItem("authToken"),ks.user;case"PROFILE_SUCCESS":return t.profil;default:return e}},Rs=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:ks.statistics,t=arguments.length>1?arguments[1]:void 0;return"LOGOUT"===t.type?ks.statistics:ws(e,"statistics",t)},Ls=["/login","/register","/password-reset","/password-reset/request","/password-reset/sent","/updated-password"],Us=function(e,t){return"string"===typeof e||e instanceof String?e=t:e.pathname=t,e},Is=function(e){return window.localStorage.authToken||Ls.includes(e.pathname)||(e=Us(e,"/login")),window.localStorage.authToken&&Ls.includes(e.pathname)&&(e=Us(e,"/")),e},Ws=((gs=Object(s.a)()).location=Is(gs.location),Object(S.a)(Object(S.a)({},gs),{},{push:function(e){for(var t=arguments.length,a=new Array(t>1?t-1:0),s=1;s1?t-1:0),s=1;s 1\n ? `${t(`messages:${message.split('|')[0]}`)}: ${t(\n `messages:${message.split('|')[1]}`\n )}`\n : t(`messages:${message}`)\n return (\n
\n {singleMessage !== '' && {singleMessage}}\n {messages &&\n messages.length > 0 &&\n (messages.length === 1 ? (\n {messages[0].value}\n ) : (\n \n
    \n {messages.map(msg => (\n
  • {t(`messages:${msg.value}`)}
  • \n ))}\n
\n
\n ))}\n
\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.6' // 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
\n {(message || messages) && (\n \n )}\n {Object.keys(formData).length > 0 && (\n
\n
\n
\n
\n \n {t('administration:Application configuration')}\n \n
\n
\n {\n e.preventDefault()\n onHandleConfigFormSubmit(formData)\n }}\n >\n
\n \n {t(\n // eslint-disable-next-line max-len\n 'administration:Max. number of active users'\n )}\n \n \n \n :\n \n this.handleFormChange(e)}\n />\n
\n
\n \n {t(\n 'administration:Max. size of uploaded files (in Mb)'\n )}\n :\n \n this.handleFormChange(e)}\n />\n
\n
\n \n {t('administration:Max. size of zip archive (in Mb)')}:\n \n this.handleFormChange(e)}\n />\n
\n
\n \n {t('administration:Max. files of zip archive')}\n \n this.handleFormChange(e)}\n />\n
\n {isInEdition ? (\n <>\n \n {\n e.preventDefault()\n loadAppConfig()\n history.push('/admin/application')\n }}\n value={t('common:Cancel')}\n />\n \n ) : (\n <>\n {\n e.preventDefault()\n history.push('/admin/application/edit')\n }}\n value={t('common:Edit')}\n />\n history.push('/admin')}\n value={t('common:Back')}\n />\n \n )}\n \n
\n
\n
\n
\n )}\n
\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
\n
\n
\n
\n
\n \n
\n
\n
\n {appStats.users ? appStats.users : 0}\n
\n
{`${\n appStats.users === 1\n ? t('administration:user')\n : t('administration:users')\n }`}
\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n {appStats.sports ? appStats.sports : 0}\n
\n
{`${\n appStats.sports === 1 ? t('common:sport') : t('common:sports')\n }`}
\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n {appStats.workouts ? appStats.workouts : 0}\n
\n
{`${\n appStats.workouts === 1\n ? t('common:workout')\n : t('common:workouts')\n }`}
\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
{uploadDirSize.size}
\n
\n {uploadDirSize.suffix} ({t('administration:uploads')})\n
\n
\n
\n
\n
\n
\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
\n
\n {t('administration:Administration')}\n
\n
\n \n
\n
\n
\n \n {t('administration:Application')}\n \n
\n
\n {t(\n 'administration:Update application configuration ' +\n '(maximum number of registered users, maximum files size).'\n )}\n
\n \n {t(\n `administration:Registration is currently ${\n appConfig.is_registration_enabled ? 'enabled' : 'disabled'\n }.`\n )}\n \n
\n
\n
\n \n {t('administration:Sports')}\n \n
\n
{t('administration:Enable/disable sports.')}
\n
\n
\n \n {t('administration:Users')}\n \n
\n
\n {t(\n 'administration:Add/remove admin rights, ' +\n 'delete user account.'\n )}\n
\n
\n
\n
\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
\n {message && }\n
\n
\n
\n
\n {t('administration:Sports')}\n
\n
\n {sports.length > 0 && (\n \n \n \n \n \n \n \n \n \n \n \n {sports.map(sport => (\n \n \n \n \n \n \n \n ))}\n \n
{t('administration:id')}{t('administration:Image')}{t('administration:Label')}{t('administration:Active')}{t('administration:Actions')}
\n \n {t('administration:id')}\n \n {sport.id}\n \n \n {t('administration:Image')}\n \n \n \n \n {t('administration:Label')}\n \n {t(`sports:${sport.label}`)}\n \n \n {t('administration:Active')}\n \n {sport.is_active ? (\n \n ) : (\n \n )}\n \n \n {t('administration:Actions')}\n \n \n updateSport(sport.id, !sport.is_active)\n }\n />\n {sport.has_workouts && (\n \n \n {t('administration:workouts exist')}\n \n )}\n
\n )}\n history.push('/admin/')}\n value={t('common:Back')}\n />\n
\n
\n
\n
\n
\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 \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
\n {message && }\n
\n
\n
\n
\n
\n {t('administration:Users')}\n
\n
\n
\n
\n \n
\n
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n {users.map(user => (\n \n \n \n \n \n \n \n \n \n ))}\n \n
#{t('user:Username')}{t('user:Email')}{t('user:Registration Date')}{t('workouts:Workouts')}{t('user:Admin')}{t('administration:Actions')}
\n #\n {user.picture === true ? (\n \n ) : (\n \n )}\n \n \n {t('user:Username')}\n \n \n {user.username}\n \n \n \n {t('user:Email')}\n \n {user.email}\n \n \n {t('user:Registration Date')}\n \n {format(\n new Date(user.created_at),\n 'dd/MM/yyyy HH:mm'\n )}\n \n \n {t('workouts:Workouts')}\n \n {user.nb_workouts}\n \n \n {t('user:Admin')}\n \n {user.admin ? (\n \n ) : (\n \n )}\n \n \n {t('administration:Actions')}\n \n \n updateUser(user.username, !user.admin)\n }\n />\n
\n \n history.push('/admin/')}\n value={t('common:Back')}\n />\n
\n
\n
\n
\n
\n
\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
\n \n fittrackee - 404\n \n

{t('Page not found')}

\n
\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 \n FitTrackee - {t('administration:Administration')}\n \n
\n {user.admin ? (\n \n }\n />\n (\n \n )}\n />\n (\n \n )}\n />\n }\n />\n }\n />\n \n \n ) : (\n \n )}\n
\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 event.preventDefault()}\n >\n
\n \n
\n {workout ? (\n
\n \n
\n ) : (\n
\n \n
\n )}\n
\n \n
\n {loading ? (\n
\n ) : (\n
\n \n workout ? onEditWorkout(event, workout) : onAddWorkout(event)\n }\n value={t('common:Submit')}\n />\n history.push('/')}\n value={t('common:Cancel')}\n />\n
\n )}\n \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
event.preventDefault()}>\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n onAddOrEdit(event, workout)}\n value={t('common:Submit')}\n />\n history.push('/')}\n value={t('common:Cancel')}\n />\n \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
\n \n \n FitTrackee -{' '}\n {workout\n ? t('workouts:Edit a workout')\n : t('workouts:Add a workout')}\n \n \n
\n
\n \n
\n
\n
\n
\n
\n

\n {workout\n ? t('workouts:Edit a workout')\n : t('workouts:Add a workout')}\n

\n
\n {workout ? (\n workout.with_gpx ? (\n \n ) : (\n \n )\n ) : (\n
\n
\n
\n
\n \n
\n
\n \n
\n
\n
\n {withGpx ? (\n \n ) : (\n \n )}\n
\n )}\n
\n
\n
\n
\n
\n
\n
\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
\n \n
\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
\n
\n
\n
\n
{props.title}
\n props.close()}\n >\n ×\n \n
\n
\n

{props.text}

\n
\n
\n props.confirm()}\n >\n {t('common:Yes')}\n \n props.close()}\n >\n {t('common:No')}\n \n
\n
\n
\n
\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
\n
\n
\n {previousUrl ? (\n \n \n \n ) : (\n \n )}\n
\n
\n \"sport\n
\n
\n {dataType === 'workout' ? (\n <>\n {title}{' '}\n \n \n \n displayModal(true)}\n title={t('workouts:Delete workout')}\n />\n \n ) : (\n <>\n {/* prettier-ignore */}\n \n {title}\n {' '}\n - {t('workouts:segment')} {segmentId}\n \n )}\n
\n {workoutDate && (\n \n {`${workoutDate.workout_date} - ${workoutDate.workout_time}`}\n \n )}\n
\n
\n {nextUrl ? (\n \n \n \n ) : (\n \n )}\n
\n
\n
\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
\n {chartData && chartData.length > 0 ? (\n
\n
\n \n \n
\n
\n
\n \n \n
\n
\n
\n \n updateCoordinates(e.activePayload)}\n onMouseLeave={() => updateCoordinates(null)}\n >\n \n displayDistance ? value : format(value, 'HH:mm:ss')\n }\n type=\"number\"\n />\n \n \n {this.displayData('elevation') && (\n \n )}\n {this.displayData('speed') && (\n \n )}\n \n displayDistance\n ? `${t('workouts:distance')}: ${value} km`\n : `${t('workouts:duration')}: ${format(\n value,\n 'HH:mm:ss'\n )}`\n }\n />\n \n \n
\n
\n {t('workouts:data from gpx, without any cleaning')}\n
\n
\n ) : (\n t('workouts:No data to display')\n )}\n
\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
\n {workout.weather_start && workout.weather_end && (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n {t('workouts:Start')}\n
\n \n
\n {t('workouts:End')}\n
\n \n
\n \n {Number(workout.weather_start.temperature).toFixed(1)}°C{Number(workout.weather_end.temperature).toFixed(1)}°C
\n \n \n {Number(workout.weather_start.humidity * 100).toFixed(1)}%\n {Number(workout.weather_end.humidity * 100).toFixed(1)}%
\n \n {Number(workout.weather_start.wind).toFixed(1)}m/s{Number(workout.weather_end.wind).toFixed(1)}m/s
\n )}\n
\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
\n

\n \n {t('workouts:Duration')}: {workout.moving}\n {workout.records &&\n workout.records.find(record => record.record_type === 'LD') && (\n \n \n \n )}\n {withPauses && (\n \n
({t('workouts:pauses')}: {workout.pauses},{' '}\n {t('workouts:total duration')}: {workout.duration})\n
\n )}\n

\n

\n \n {t('workouts:Distance')}: {workout.distance} km\n {workout.records &&\n workout.records.find(record => record.record_type === 'FD') && (\n \n \n \n )}\n

\n

\n \n {t('workouts:Average speed')}: {workout.ave_speed} km/h\n {workout.records &&\n workout.records.find(record => record.record_type === 'AS') && (\n \n \n \n )}\n
\n {t('workouts:Max. speed')}: {workout.max_speed} km/h\n {workout.records &&\n workout.records.find(record => record.record_type === 'MS') && (\n \n \n \n )}\n

\n {workout.min_alt && workout.max_alt && (\n

\n \n {t('workouts:Min. altitude')}: {workout.min_alt}m\n
\n {t('workouts:Max. altitude')}: {workout.max_alt}m\n

\n )}\n {workout.ascent && workout.descent && (\n

\n \n {t('workouts:Ascent')}: {workout.ascent}m\n
\n {t('workouts:Descent')}: {workout.descent}m\n

\n )}\n \n
\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 \n \n {coordinates.latitude && (\n \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
\n {jsonData && (\n \n \n \n )}\n
\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
{t('workouts:No Map')}
\n )\n}\n","import React from 'react'\n\nexport default function WorkoutNotes(props) {\n const { notes, t } = props\n return (\n
\n
\n
\n
\n Notes\n
\n {notes ? notes : t('workouts:No notes')}\n
\n
\n
\n
\n
\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
\n
\n
\n
\n {t('workouts:Segments')}\n
\n
    \n {segments.map((segment, index) => (\n \n \n {t('workouts:segment')} {index + 1}\n {' '}\n ({t('workouts:distance')}: {segment.distance} km,{' '}\n {t('workouts:duration')}: {segment.duration})\n \n ))}\n
\n
\n
\n
\n
\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 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
\n \n FitTrackee - {title}\n \n {message ? (\n \n ) : (\n
\n {displayModal && (\n {\n onDeleteWorkout(workout.id)\n this.displayModal(false)\n }}\n close={() => this.displayModal(false)}\n />\n )}\n {workout && sport && workouts.length === 1 && (\n
\n
\n
\n
\n
\n this.displayModal(true)}\n />\n
\n
\n
\n
\n {workout.with_gpx ? (\n \n ) : (\n \n )}\n
\n
\n \n
\n
\n
\n
\n
\n
\n {workout.with_gpx && (\n
\n
\n
\n
\n
\n
\n
\n {t('workouts:Chart')}\n
\n \n this.updateCoordinates(e)\n }\n />\n
\n
\n
\n
\n
\n
\n )}\n {dataType === 'workout' && (\n <>\n \n {workout.segments.length > 1 && (\n \n )}\n \n )}\n
\n )}\n
\n )}\n
\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
\n {sports.length > 0 && (\n \n )}\n
\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
\n {isLoggedIn() ? (\n \n \n \n \n \n \n \n ) : (\n \n )}\n
\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
\n
\n {t('common:No workouts.')}{' '}\n \n {t('dashboard:Upload one !')}\n \n
\n
\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
\n
\n
event.preventDefault()}>\n
\n \n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n loadWorkouts()}\n type=\"submit\"\n value={t('workouts:Filter')}\n />\n \n
\n
\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
\n \n
\n ©\n \n OpenStreetMap\n \n
\n
\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
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n {!loading &&\n sports &&\n workouts.map((workout, idx) => (\n // eslint-disable-next-line react/no-array-index-key\n \n \n \n \n \n \n \n \n \n ))}\n \n
\n {t('common:Workout')}{t('workouts:Date')}{t('workouts:Distance')}{t('workouts:Duration')}{t('workouts:Ave. speed')}{t('workouts:Max. speed')}
\n \n {t('common:Sport')}\n \n s.id === workout.sport_id)\n .map(s => s.img)}\n alt=\"workout sport logo\"\n />\n \n \n {t('common:Workout')}\n \n \n {workout.title}\n \n {workout.map && (\n \n )}\n \n \n {t('workouts:Date')}\n \n {format(\n getDateWithTZ(workout.workout_date, user.timezone),\n 'dd/MM/yyyy HH:mm'\n )}\n \n \n {t('workouts:Distance')}\n \n {Number(workout.distance).toFixed(2)} km\n \n \n {t('workouts:Duration')}\n \n {workout.moving}\n \n \n {t('workouts:Ave. speed')}\n \n {workout.ave_speed} km/h\n \n \n {t('workouts:Max. speed')}\n \n {workout.max_speed} km/h\n
\n {loading &&
}\n
\n
\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
\n \n FitTrackee - {t('common:Workouts')}\n \n {message ? (\n \n ) : (\n
\n
\n
\n loadWorkouts(params)}\n t={t}\n updateParams={e => this.setParams(e)}\n />\n
\n
\n \n {!paginationEnd && (\n {\n params.page += 1\n loadMoreWorkouts(params)\n this.setState(params)\n }}\n />\n )}\n {workouts.length === 0 && }\n
\n
\n
\n )}\n
\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
\n \n FitTrackee - {t('user:Profile')}\n \n \n
\n

{t('user:Profile')}

\n
\n
\n
\n
\n {user.username}\n
\n
\n
\n
\n

\n {/* eslint-disable-next-line max-len */}\n \n {t('user:Email')}\n : {user.email}\n

\n

\n \n {t('user:Registration Date')}\n \n : {createdAt}\n

\n

\n {t('user:First Name')}\n : {user.first_name}\n

\n

\n {/* eslint-disable-next-line max-len */}\n \n {t('user:Last Name')}\n : {user.last_name}\n

\n

\n {t('user:Birth Date')}\n : {birthDate}\n

\n

\n {/* eslint-disable-next-line max-len */}\n \n {t('user:Location')}\n : {user.location}\n

\n

\n {t('user:Bio')}:{' '}\n {user.bio}\n

\n

\n {/* eslint-disable-next-line max-len */}\n \n {t('user:Language')}\n : {user.language}\n

\n

\n {/* eslint-disable-next-line max-len */}\n \n {t('user:Timezone')}\n : {user.timezone}\n

\n

\n \n {t('user:First day of week')}\n \n : {user.weekm ? t('user:Monday') : t('user:Sunday')}\n

\n
\n
\n {user.picture === true && (\n
\n \n {editable && (\n <>\n
\n onDeletePicture()}\n >\n {t('user:Delete picture')}\n \n
\n
\n \n )}\n
\n )}\n {editable && (\n onUploadPicture(event)}\n >\n \n
\n \n {` (max. size: ${fileSizeLimit})`}\n \n )}{' '}\n
\n
\n {editable && (\n history.push('/profile/edit')}\n >\n {t('common:Edit')}\n \n )}\n {isDeletable && (\n displayModal(true)}\n >\n {t('user:Delete user account')}\n \n )}\n \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 \n
\n
\n
\n
\n
\n
\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
\n \n
\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 \n <>\n \n {workout.records.length > 0 && (\n \n \n ` ${\n recordsLabels.filter(\n r => r.record_type === rec.record_type\n )[0].label\n }`\n )}\n />\n \n )}\n \n \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
\n {dayWorkouts.map(act => (\n s.id === act.sport_id).map(s => s.img)}\n />\n ))}\n {dayWorkouts.length > 2 && (\n this.handleDisplayMore()}\n title=\"show more workouts\"\n />\n )}\n {!isHidden && (\n
\n {dayWorkouts.map(act => (\n s.id === act.sport_id)\n .map(s => s.img)}\n />\n ))}\n
\n )}\n
\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
\n
this.handlePrevMonth()}>\n \n
\n
\n \n {format(this.state.currentMonth, dateFormat, localeOptions)}\n \n
\n
this.handleNextMonth()}>\n \n
\n
\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
\n {format(addDays(startDate, i), dateFormat, localeOptions)}\n
\n )\n }\n return
{days}
\n }\n\n filterWorkouts(day) {\n const { workouts, user } = this.props\n if (workouts) {\n return workouts\n .filter(act =>\n isSameDay(getDateWithTZ(act.workout_date, user.timezone), day)\n )\n .reverse()\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 \n
\n {formattedDate}\n \n
\n
\n )\n day = addDays(day, 1)\n }\n rows.push(\n
\n {days}\n
\n )\n days = []\n }\n return
{rows}
\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
\n
\n {this.renderHeader(localeOptions)}\n {this.renderDays(localeOptions)}\n {this.renderCells()}\n
\n
\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
\n
{t('workouts:Personal records')}
\n
\n {Object.keys(recordsBySport).length === 0\n ? t('common:No records.')\n : Object.keys(recordsBySport)\n .sort()\n .map(sportLabel => (\n
\n \n \n {sportLabel}\n \n {/* eslint-disable-next-line max-len */}\n \n \n \n \n \n \n \n {recordsBySport[sportLabel].records.map(rec => (\n \n \n \n \n \n ))}\n \n
\n \n {sportLabel}\n
\n {t(`workouts:${rec.record_type}`)}\n {rec.value}\n \n {rec.workout_date}\n \n
\n
\n ))}\n
\n
\n )\n}\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 {\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
\n

{label}

\n {payload.map(p => (\n

\n {p.name}: {formatValue(displayedData, p.value)} {p.unit}\n

\n ))}\n {payload.length > 0 && (\n

Total: {formatValue(displayedData, total)}

\n )}\n
\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 \n \n {formattedValue}\n \n \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
\n
\n \n \n \n
\n \n \n \n formatValue(displayedData, value)} />\n }\n />\n {sports.map((s, i) => (\n \n ) : (\n ''\n )\n }\n name={t(`sports:${s.label}`)}\n />\n ))}\n \n \n
\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 {t('common:No workouts.')}\n }\n const stats = formatStats(\n statistics,\n sports,\n statsParams,\n displayedSports,\n user.weekm\n )\n return \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 { 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
\n
{t('dashboard:This month')}
\n
\n \n
\n
\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
\n
\n
\n
\n
\n \n
\n
\n
{user.nb_workouts}
\n
{`${\n user.nb_workouts === 1\n ? t('common:workout')\n : t('common:workouts')\n }`}
\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n {Number(user.total_distance).toFixed(2)}\n
\n
km
\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
{days}
\n
{duration}
\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
{user.nb_sports}
\n
{`${\n user.nb_sports === 1 ? t('common:sport') : t('common:sports')\n }`}
\n
\n
\n
\n
\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 function WorkoutCard(props) {\n const { sports, t, user, workout } = props\n\n return (\n
\n
\n \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 \n
\n
\n
\n {workout.map && (\n
\n \n
\n )}\n
\n

\n {' '}\n {t('workouts:Duration')}: {workout.moving}\n {workout.map ? (\n \n
\n
\n
\n ) : (\n ' - '\n )}\n {' '}\n {t('workouts:Distance')}: {workout.distance} km\n

\n
\n
\n
\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 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
\n \n FitTrackee - {t('common:Dashboard')}\n \n {message ? (\n \n ) : (\n workouts &&\n user.total_duration &&\n sports.length > 0 && (\n
\n \n
\n
\n \n \n
\n
\n \n {workouts.length > 0 ? (\n workouts.map(workout => (\n \n ))\n ) : (\n \n )}\n {!paginationEnd && (\n {\n loadMoreWorkouts(page + 1)\n this.setState({ page: page + 1 })\n }}\n />\n )}\n
\n
\n
\n )\n )}\n
\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
\n
\n FitTrackee v{version} -{' '}\n \n source code\n {' '}\n under{' '}\n \n GPLv3\n {' '}\n license -{' '}\n \n documentation\n \n
\n
\n )\n}\n","var _path, _path2, _path3, _path4, _path5, _path6, _path7, _path8, _g, _path9, _path10, _path11, _path12;\n\nfunction _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\nfunction SvgEn(_ref, svgRef) {\n var 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, _path || (_path = /*#__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 })), _path2 || (_path2 = /*#__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 })), _path3 || (_path3 = /*#__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 })), _path4 || (_path4 = /*#__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 })), _path5 || (_path5 = /*#__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 })), _path6 || (_path6 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"m53.273 27.803 145.302 120.879v-120.879z\",\n fill: \"#406bd4\"\n })), _path7 || (_path7 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"m313.425 150.571v-122.768h148.082z\",\n fill: \"#3257b0\"\n })), _path8 || (_path8 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"m394.732 198.575 117.268-97.556v97.556z\",\n fill: \"#3257b0\"\n })), _g || (_g = /*#__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 }))), _path9 || (_path9 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"m313.425 484.197v-124.139l149.221 124.139z\",\n fill: \"#3257b0\"\n })), _path10 || (_path10 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"m512 409.423-115.395-95.998h115.395z\",\n fill: \"#3257b0\"\n })), _path11 || (_path11 = /*#__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 })), _path12 || (_path12 = /*#__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}\n\nvar ForwardRef = /*#__PURE__*/React.forwardRef(SvgEn);\nexport default __webpack_public_path__ + \"static/media/en.9e6dbfb0.svg\";\nexport { ForwardRef as ReactComponent };","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
\n
\n
\n
\n
\n
\n \n You are now logged out. Click here to\n log back in.\n \n
\n
\n
\n
\n
\n
\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","var _path, _path2, _path3, _path4;\n\nfunction _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\nfunction SvgFr(_ref, svgRef) {\n var 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, _path || (_path = /*#__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 })), _path2 || (_path2 = /*#__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 })), _path3 || (_path3 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"m160.795 27.803h190.409v456.394h-190.409z\",\n fill: \"#f0f9ff\"\n })), _path4 || (_path4 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"m256 27.803h95.205v456.394h-95.205z\",\n fill: \"#cee5f5\"\n })));\n}\n\nvar ForwardRef = /*#__PURE__*/React.forwardRef(SvgFr);\nexport default __webpack_public_path__ + \"static/media/fr.d0f9280c.svg\";\nexport { ForwardRef as ReactComponent };","var _g, _g2, _g3, _g4, _g5, _g6, _g7;\n\nfunction _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\nfunction SvgPassword(_ref, svgRef) {\n var 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, _g || (_g = /*#__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 })))), _g2 || (_g2 = /*#__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 })))), _g3 || (_g3 = /*#__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 })))), _g4 || (_g4 = /*#__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 })))), _g5 || (_g5 = /*#__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 })))), _g6 || (_g6 = /*#__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 })))), _g7 || (_g7 = /*#__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}\n\nvar ForwardRef = /*#__PURE__*/React.forwardRef(SvgPassword);\nexport default __webpack_public_path__ + \"static/media/password.afe6a2a5.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: ,\n },\n {\n name: 'fr',\n selected: false,\n flag: ,\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
this.toggleDropdown()}>\n
    \n {languages\n .filter(language =>\n isOpen ? language : language.name === selected\n )\n .map(language => (\n onUpdateLanguage(language.name, selected)}\n >\n {language.flag} {language.name}\n \n ))}\n
\n
\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
\n
\n \n \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","var _g;\n\nfunction _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\nfunction SvgMailSend(_ref, svgRef) {\n var 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, _g || (_g = /*#__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}\n\nvar 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
\n
\n
\n
\n
\n
\n {action === 'sent' && (\n <>\n
\n \n
\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
\n \n
\n \n {/* prettier-ignore */}\n Your password have been updated. Click\n here to log in.\n \n \n )}\n
\n
\n
\n
\n
\n
\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
\n \n FitTrackee - {t('user:Profile Edition')}\n \n {formData.isAuthenticated && (\n
\n {displayModal && (\n {\n onDeleteUser(user.username)\n this.displayModal(false)\n }}\n close={() => this.displayModal(false)}\n />\n )}\n

{t('user:Profile Edition')}

\n
\n
\n
\n
\n
{user.username}
\n
\n
\n
\n {\n event.preventDefault()\n onHandleProfileFormSubmit(formData)\n }}\n >\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n \n {\n event.preventDefault()\n this.displayModal(true)\n }}\n >\n {t('user:Delete my account')}\n \n history.push('/profile')}\n >\n {t('common:Cancel')}\n \n \n \n
\n
\n
\n
\n
\n
\n
\n
\n )}\n
\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 \n FitTrackee - {t('statistics:Statistics')}\n \n
\n
\n
{t('statistics:Statistics')}
\n \n
\n
\n

\n this.handleOnClickArrows(true)}\n />\n

\n
\n
\n {durations.map(d => (\n
\n \n
\n ))}\n
\n
\n

\n this.handleOnClickArrows(false)}\n />\n

\n
\n
\n \n
\n {translatedSports.map(sport => (\n \n ))}\n
\n
\n
\n {user.nb_workouts === 0 && }\n
\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
\n \n FitTrackee - {t(`user:${props.formType}`)}\n \n

{t(pageTitle)}

\n
\n
\n
\n
\n
\n {props.formType === 'register' && !props.isRegistrationAllowed ? (\n
\n
Registration is disabled.
\n
\n history.go(-1)}\n >\n Back\n \n
\n
\n ) : (\n <>\n \n props.handleUserFormSubmit(event, props.formType)\n }\n >\n {props.formType === 'register' && (\n
\n \n
\n )}\n {props.formType !== 'password reset' && (\n
\n \n
\n )}\n {props.formType !== 'reset your password' && (\n <>\n
\n \n
\n {props.formType !== 'login' && (\n
\n \n
\n )}\n \n )}\n \n \n

\n {props.formType === 'login' && (\n \n {t('user:Forgot password?')}\n \n )}\n

\n \n )}\n
\n
\n
\n
\n
\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
\n {isLoggedIn() || (formType === 'password reset' && !token) ? (\n \n ) : (\n
\n \n 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
\n )}\n
\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
\n {displayModal && (\n {\n onDeleteUser(user.username)\n this.displayModal(false)\n }}\n close={() => this.displayModal(false)}\n />\n )}\n {user && (\n this.displayModal(e)}\n t={t}\n user={user}\n />\n )}\n
\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
\n \n \n \n }\n />\n }\n />\n }\n />\n }\n />\n }\n />\n }\n />\n \n \n \n \n \n \n \n \n \n \n \n
\n
\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 \n {children}\n \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","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","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","/* 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 \n \n \n \n ,\n rootNode\n)\nregisterServiceWorker()\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["locales/index.js","locales/en/resources.js","locales/fr/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","actions/stats.js","utils/stats.js","components/Common/Stats/CustomTooltip.jsx","components/Common/Stats/CustomLabel.jsx","components/Common/Stats/StatsChart.jsx","components/Common/Stats/index.jsx","components/Dashboard/Statistics.jsx","components/Dashboard/UserStatistics.jsx","components/Dashboard/WorkoutCard.jsx","components/Dashboard/index.jsx","components/Footer/index.jsx","images/flags/en.svg","components/User/Logout.jsx","images/flags/fr.svg","images/password.svg","components/NavBar/LanguageDropdown.jsx","components/NavBar/index.jsx","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","utils/history.js","reducers/index.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","this","props","message","t","singleMessage","split","length","className","value","map","msg","id","React","PureComponent","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","setPaginatedData","pagination","setError","setLoading","loading","updateSportsData","updateUsersData","getOrUpdateData","action","canDispatch","dispatch","isNaN","ret","users","updateLanguage","language","i18next","changeLanguage","setLanguage","setAppConfig","getAppData","FitTrackeeGenericApi","getData","AdminApplication","context","state","formData","initForm","prevProps","appConfig","k","includes","setState","e","name","isInEdition","loadAppConfig","onHandleConfigFormSubmit","onSubmit","preventDefault","htmlFor","aria-hidden","title","min","max_users","onChange","handleFormChange","step","max_single_file_size","max_zip_file_size","gpx_limit_import","onClick","history","push","Component","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","newQuery","page","pages","aria-label","has_prev","getUrl","aria-disabled","from","_","has_next","AdminUsers","per_page","order_by","order","loadUsers","initState","location","authUser","updateUser","translatedFilters","translatedSortOrders","updatePage","picture","now","email","created_at","nb_workouts","admin","disabled","router","userName","isAdmin","NotFound","useTranslation","Helmet","config","exact","path","render","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","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","changeEvent","with_gpx","checked","handleRadioChange","WorkoutAddOrEdit","CustomModal","close","text","confirm","WorkoutCardHeader","dataType","displayModal","segmentId","previousUrl","previous_workout","nextUrl","segments","next_workout","WorkoutCharts","displayDistance","dataToHide","loadWorkoutData","loadSegmentData","find","splice","indexOf","xDataKey","xScale","updateCoordinates","xInterval","parseInt","displayData","handleLegendChange","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","loadMoreWorkouts","paginationEnd","setParams","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","dayWorkouts","act","handleDisplayMore","getStartAndEndMonth","weekStartOnMonday","monthStart","startOfMonth","monthEnd","endOfMonth","weekStartsOn","start","startOfWeek","end","endOfWeek","Calendar","calendarDate","currentMonth","startDate","endDate","loadMonthWorkouts","localeOptions","handlePrevMonth","handleNextMonth","days","addDays","day","isSameDay","reverse","rows","formattedDate","filterWorkouts","isSameMonth","isWeekEnd","isToday","addMonths","updateStateDate","subMonths","locale","enGB","renderHeader","renderDays","renderCells","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","x","xAxisFormat","dataNbWorkouts","dataDistance","dataDuration","total_distance","total_duration","startOfYear","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","_path","_path2","_path3","_path4","_path5","_path6","_path7","_path8","_g","_path9","_path10","_path11","_path12","Logout","UserLogout","_extends","arguments","source","prototype","hasOwnProperty","call","apply","_objectWithoutProperties","excluded","sourceKeys","_objectWithoutPropertiesLoose","getOwnPropertySymbols","sourceSymbolKeys","propertyIsEnumerable","SvgEn","_ref","svgRef","titleId","enableBackground","viewBox","xmlns","ref","ForwardRef","SvgFr","_g2","_g3","_g4","_g5","_g6","_g7","languages","selected","flag","Dropdown","isOpen","onUpdateLanguage","toggleDropdown","lang","NavBar","data-target","aria-controls","aria-expanded","LanguageDropdown","SvgPassword","xmlnsXlink","xmlSpace","SvgMailSend","PasswordReset","ProfileEdit","onDeleteUser","onHandleProfileFormSubmit","readOnly","postData","handleProfileFormSubmit","durations","updateDisplayedSports","subYears","endOfYear","concat","forward","newStart","newEnd","subWeeks","addWeeks","sports_list","handleOnClickArrows","handleOnChangeDuration","handleOnChangeSports","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","originalHistory","emptyData","handleDataAndError","initial","removeItem","routesWithoutAuthentication","updatePath","toPath","newPath","pathInterceptor","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.06d7be5e.chunk.js","sourcesContent":["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 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 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
\n {singleMessage !== '' && {singleMessage}}\n {messages &&\n messages.length > 0 &&\n (messages.length === 1 ? (\n {messages[0].value}\n ) : (\n \n
    \n {messages.map(msg => (\n
  • {t(`messages:${msg.value}`)}
  • \n ))}\n
\n
\n ))}\n
\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.7' // 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
\n {(message || messages) && (\n \n )}\n {Object.keys(formData).length > 0 && (\n
\n
\n
\n
\n \n {t('administration:Application configuration')}\n \n
\n
\n {\n e.preventDefault()\n onHandleConfigFormSubmit(formData)\n }}\n >\n
\n \n {t(\n // eslint-disable-next-line max-len\n 'administration:Max. number of active users'\n )}\n \n \n \n :\n \n this.handleFormChange(e)}\n />\n
\n
\n \n {t(\n 'administration:Max. size of uploaded files (in Mb)'\n )}\n :\n \n this.handleFormChange(e)}\n />\n
\n
\n \n {t('administration:Max. size of zip archive (in Mb)')}:\n \n this.handleFormChange(e)}\n />\n
\n
\n \n {t('administration:Max. files of zip archive')}\n \n this.handleFormChange(e)}\n />\n
\n {isInEdition ? (\n <>\n \n {\n e.preventDefault()\n loadAppConfig()\n history.push('/admin/application')\n }}\n value={t('common:Cancel')}\n />\n \n ) : (\n <>\n {\n e.preventDefault()\n history.push('/admin/application/edit')\n }}\n value={t('common:Edit')}\n />\n history.push('/admin')}\n value={t('common:Back')}\n />\n \n )}\n \n
\n
\n
\n
\n )}\n
\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
\n
\n
\n
\n
\n \n
\n
\n
\n {appStats.users ? appStats.users : 0}\n
\n
{`${\n appStats.users === 1\n ? t('administration:user')\n : t('administration:users')\n }`}
\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n {appStats.sports ? appStats.sports : 0}\n
\n
{`${\n appStats.sports === 1 ? t('common:sport') : t('common:sports')\n }`}
\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n {appStats.workouts ? appStats.workouts : 0}\n
\n
{`${\n appStats.workouts === 1\n ? t('common:workout')\n : t('common:workouts')\n }`}
\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
{uploadDirSize.size}
\n
\n {uploadDirSize.suffix} ({t('administration:uploads')})\n
\n
\n
\n
\n
\n
\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
\n
\n {t('administration:Administration')}\n
\n
\n \n
\n
\n
\n \n {t('administration:Application')}\n \n
\n
\n {t(\n 'administration:Update application configuration ' +\n '(maximum number of registered users, maximum files size).'\n )}\n
\n \n {t(\n `administration:Registration is currently ${\n appConfig.is_registration_enabled ? 'enabled' : 'disabled'\n }.`\n )}\n \n
\n
\n
\n \n {t('administration:Sports')}\n \n
\n
{t('administration:Enable/disable sports.')}
\n
\n
\n \n {t('administration:Users')}\n \n
\n
\n {t(\n 'administration:Add/remove admin rights, ' +\n 'delete user account.'\n )}\n
\n
\n
\n
\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
\n {message && }\n
\n
\n
\n
\n {t('administration:Sports')}\n
\n
\n {sports.length > 0 && (\n \n \n \n \n \n \n \n \n \n \n \n {sports.map(sport => (\n \n \n \n \n \n \n \n ))}\n \n
{t('administration:id')}{t('administration:Image')}{t('administration:Label')}{t('administration:Active')}{t('administration:Actions')}
\n \n {t('administration:id')}\n \n {sport.id}\n \n \n {t('administration:Image')}\n \n \n \n \n {t('administration:Label')}\n \n {t(`sports:${sport.label}`)}\n \n \n {t('administration:Active')}\n \n {sport.is_active ? (\n \n ) : (\n \n )}\n \n \n {t('administration:Actions')}\n \n \n updateSport(sport.id, !sport.is_active)\n }\n />\n {sport.has_workouts && (\n \n \n {t('administration:workouts exist')}\n \n )}\n
\n )}\n history.push('/admin/')}\n value={t('common:Back')}\n />\n
\n
\n
\n
\n
\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 \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
\n {message && }\n
\n
\n
\n
\n
\n {t('administration:Users')}\n
\n
\n
\n
\n \n
\n
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n {users.map(user => (\n \n \n \n \n \n \n \n \n \n ))}\n \n
#{t('user:Username')}{t('user:Email')}{t('user:Registration Date')}{t('workouts:Workouts')}{t('user:Admin')}{t('administration:Actions')}
\n #\n {user.picture === true ? (\n \n ) : (\n \n )}\n \n \n {t('user:Username')}\n \n \n {user.username}\n \n \n \n {t('user:Email')}\n \n {user.email}\n \n \n {t('user:Registration Date')}\n \n {format(\n new Date(user.created_at),\n 'dd/MM/yyyy HH:mm'\n )}\n \n \n {t('workouts:Workouts')}\n \n {user.nb_workouts}\n \n \n {t('user:Admin')}\n \n {user.admin ? (\n \n ) : (\n \n )}\n \n \n {t('administration:Actions')}\n \n \n updateUser(user.username, !user.admin)\n }\n />\n
\n \n history.push('/admin/')}\n value={t('common:Back')}\n />\n
\n
\n
\n
\n
\n
\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
\n \n fittrackee - 404\n \n

{t('Page not found')}

\n
\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 \n FitTrackee - {t('administration:Administration')}\n \n
\n {user.admin ? (\n \n }\n />\n (\n \n )}\n />\n (\n \n )}\n />\n }\n />\n }\n />\n \n \n ) : (\n \n )}\n
\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 event.preventDefault()}\n >\n
\n \n
\n {workout ? (\n
\n \n
\n ) : (\n
\n \n
\n )}\n
\n \n
\n {loading ? (\n
\n ) : (\n
\n \n workout ? onEditWorkout(event, workout) : onAddWorkout(event)\n }\n value={t('common:Submit')}\n />\n history.push('/')}\n value={t('common:Cancel')}\n />\n
\n )}\n \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
event.preventDefault()}>\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n onAddOrEdit(event, workout)}\n value={t('common:Submit')}\n />\n history.push('/')}\n value={t('common:Cancel')}\n />\n \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
\n \n \n FitTrackee -{' '}\n {workout\n ? t('workouts:Edit a workout')\n : t('workouts:Add a workout')}\n \n \n
\n
\n \n
\n
\n
\n
\n
\n

\n {workout\n ? t('workouts:Edit a workout')\n : t('workouts:Add a workout')}\n

\n
\n {workout ? (\n workout.with_gpx ? (\n \n ) : (\n \n )\n ) : (\n
\n
\n
\n
\n \n
\n
\n \n
\n
\n
\n {withGpx ? (\n \n ) : (\n \n )}\n
\n )}\n
\n
\n
\n
\n
\n
\n
\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
\n \n
\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
\n
\n
\n
\n
{props.title}
\n props.close()}\n >\n ×\n \n
\n
\n

{props.text}

\n
\n
\n props.confirm()}\n >\n {t('common:Yes')}\n \n props.close()}\n >\n {t('common:No')}\n \n
\n
\n
\n
\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
\n
\n
\n {previousUrl ? (\n \n \n \n ) : (\n \n )}\n
\n
\n \"sport\n
\n
\n {dataType === 'workout' ? (\n <>\n {title}{' '}\n \n \n \n displayModal(true)}\n title={t('workouts:Delete workout')}\n />\n \n ) : (\n <>\n {/* prettier-ignore */}\n \n {title}\n {' '}\n - {t('workouts:segment')} {segmentId}\n \n )}\n
\n {workoutDate && (\n \n {`${workoutDate.workout_date} - ${workoutDate.workout_time}`}\n \n )}\n
\n
\n {nextUrl ? (\n \n \n \n ) : (\n \n )}\n
\n
\n
\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
\n {chartData && chartData.length > 0 ? (\n
\n
\n \n \n
\n
\n
\n \n \n
\n
\n
\n \n updateCoordinates(e.activePayload)}\n onMouseLeave={() => updateCoordinates(null)}\n >\n \n displayDistance ? value : format(value, 'HH:mm:ss')\n }\n type=\"number\"\n />\n \n \n {this.displayData('elevation') && (\n \n )}\n {this.displayData('speed') && (\n \n )}\n \n displayDistance\n ? `${t('workouts:distance')}: ${value} km`\n : `${t('workouts:duration')}: ${format(\n value,\n 'HH:mm:ss'\n )}`\n }\n />\n \n \n
\n
\n {t('workouts:data from gpx, without any cleaning')}\n
\n
\n ) : (\n t('workouts:No data to display')\n )}\n
\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
\n {workout.weather_start && workout.weather_end && (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n {t('workouts:Start')}\n
\n \n
\n {t('workouts:End')}\n
\n \n
\n \n {Number(workout.weather_start.temperature).toFixed(1)}°C{Number(workout.weather_end.temperature).toFixed(1)}°C
\n \n \n {Number(workout.weather_start.humidity * 100).toFixed(1)}%\n {Number(workout.weather_end.humidity * 100).toFixed(1)}%
\n \n {Number(workout.weather_start.wind).toFixed(1)}m/s{Number(workout.weather_end.wind).toFixed(1)}m/s
\n )}\n
\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
\n

\n \n {t('workouts:Duration')}: {workout.moving}\n {workout.records &&\n workout.records.find(record => record.record_type === 'LD') && (\n \n \n \n )}\n {withPauses && (\n \n
({t('workouts:pauses')}: {workout.pauses},{' '}\n {t('workouts:total duration')}: {workout.duration})\n
\n )}\n

\n

\n \n {t('workouts:Distance')}: {workout.distance} km\n {workout.records &&\n workout.records.find(record => record.record_type === 'FD') && (\n \n \n \n )}\n

\n

\n \n {t('workouts:Average speed')}: {workout.ave_speed} km/h\n {workout.records &&\n workout.records.find(record => record.record_type === 'AS') && (\n \n \n \n )}\n
\n {t('workouts:Max. speed')}: {workout.max_speed} km/h\n {workout.records &&\n workout.records.find(record => record.record_type === 'MS') && (\n \n \n \n )}\n

\n {workout.min_alt && workout.max_alt && (\n

\n \n {t('workouts:Min. altitude')}: {workout.min_alt}m\n
\n {t('workouts:Max. altitude')}: {workout.max_alt}m\n

\n )}\n {workout.ascent && workout.descent && (\n

\n \n {t('workouts:Ascent')}: {workout.ascent}m\n
\n {t('workouts:Descent')}: {workout.descent}m\n

\n )}\n \n
\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 \n \n {coordinates.latitude && (\n \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
\n {jsonData && (\n \n \n \n )}\n
\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
{t('workouts:No Map')}
\n )\n}\n","import React from 'react'\n\nexport default function WorkoutNotes(props) {\n const { notes, t } = props\n return (\n
\n
\n
\n
\n Notes\n
\n {notes ? notes : t('workouts:No notes')}\n
\n
\n
\n
\n
\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
\n
\n
\n
\n {t('workouts:Segments')}\n
\n
    \n {segments.map((segment, index) => (\n \n \n {t('workouts:segment')} {index + 1}\n {' '}\n ({t('workouts:distance')}: {segment.distance} km,{' '}\n {t('workouts:duration')}: {segment.duration})\n \n ))}\n
\n
\n
\n
\n
\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 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
\n \n FitTrackee - {title}\n \n {message ? (\n \n ) : (\n
\n {displayModal && (\n {\n onDeleteWorkout(workout.id)\n this.displayModal(false)\n }}\n close={() => this.displayModal(false)}\n />\n )}\n {workout && sport && workouts.length === 1 && (\n
\n
\n
\n
\n
\n this.displayModal(true)}\n />\n
\n
\n
\n
\n {workout.with_gpx ? (\n \n ) : (\n \n )}\n
\n
\n \n
\n
\n
\n
\n
\n
\n {workout.with_gpx && (\n
\n
\n
\n
\n
\n
\n
\n {t('workouts:Chart')}\n
\n \n this.updateCoordinates(e)\n }\n />\n
\n
\n
\n
\n
\n
\n )}\n {dataType === 'workout' && (\n <>\n \n {workout.segments.length > 1 && (\n \n )}\n \n )}\n
\n )}\n
\n )}\n
\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
\n {sports.length > 0 && (\n \n )}\n
\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
\n {isLoggedIn() ? (\n \n \n \n \n \n \n \n ) : (\n \n )}\n
\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
\n
\n {t('common:No workouts.')}{' '}\n \n {t('dashboard:Upload one !')}\n \n
\n
\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
\n
\n
event.preventDefault()}>\n
\n \n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n loadWorkouts()}\n type=\"submit\"\n value={t('workouts:Filter')}\n />\n \n
\n
\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
\n \n
\n ©\n \n OpenStreetMap\n \n
\n
\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
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n {!loading &&\n sports &&\n workouts.map((workout, idx) => (\n // eslint-disable-next-line react/no-array-index-key\n \n \n \n \n \n \n \n \n \n ))}\n \n
\n {t('common:Workout')}{t('workouts:Date')}{t('workouts:Distance')}{t('workouts:Duration')}{t('workouts:Ave. speed')}{t('workouts:Max. speed')}
\n \n {t('common:Sport')}\n \n s.id === workout.sport_id)\n .map(s => s.img)}\n alt=\"workout sport logo\"\n />\n \n \n {t('common:Workout')}\n \n \n {workout.title}\n \n {workout.map && (\n \n )}\n \n \n {t('workouts:Date')}\n \n {format(\n getDateWithTZ(workout.workout_date, user.timezone),\n 'dd/MM/yyyy HH:mm'\n )}\n \n \n {t('workouts:Distance')}\n \n {Number(workout.distance).toFixed(2)} km\n \n \n {t('workouts:Duration')}\n \n {workout.moving}\n \n \n {t('workouts:Ave. speed')}\n \n {workout.ave_speed} km/h\n \n \n {t('workouts:Max. speed')}\n \n {workout.max_speed} km/h\n
\n {loading &&
}\n
\n
\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
\n \n FitTrackee - {t('common:Workouts')}\n \n {message ? (\n \n ) : (\n
\n
\n
\n loadWorkouts(params)}\n t={t}\n updateParams={e => this.setParams(e)}\n />\n
\n
\n \n {!paginationEnd && (\n {\n params.page += 1\n loadMoreWorkouts(params)\n this.setState(params)\n }}\n />\n )}\n {workouts.length === 0 && }\n
\n
\n
\n )}\n
\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
\n \n FitTrackee - {t('user:Profile')}\n \n \n
\n

{t('user:Profile')}

\n
\n
\n
\n
\n {user.username}\n
\n
\n
\n
\n

\n {/* eslint-disable-next-line max-len */}\n \n {t('user:Email')}\n : {user.email}\n

\n

\n \n {t('user:Registration Date')}\n \n : {createdAt}\n

\n

\n {t('user:First Name')}\n : {user.first_name}\n

\n

\n {/* eslint-disable-next-line max-len */}\n \n {t('user:Last Name')}\n : {user.last_name}\n

\n

\n {t('user:Birth Date')}\n : {birthDate}\n

\n

\n {/* eslint-disable-next-line max-len */}\n \n {t('user:Location')}\n : {user.location}\n

\n

\n {t('user:Bio')}:{' '}\n {user.bio}\n

\n

\n {/* eslint-disable-next-line max-len */}\n \n {t('user:Language')}\n : {user.language}\n

\n

\n {/* eslint-disable-next-line max-len */}\n \n {t('user:Timezone')}\n : {user.timezone}\n

\n

\n \n {t('user:First day of week')}\n \n : {user.weekm ? t('user:Monday') : t('user:Sunday')}\n

\n
\n
\n {user.picture === true && (\n
\n \n {editable && (\n <>\n
\n onDeletePicture()}\n >\n {t('user:Delete picture')}\n \n
\n
\n \n )}\n
\n )}\n {editable && (\n onUploadPicture(event)}\n >\n \n
\n \n {` (max. size: ${fileSizeLimit})`}\n \n )}{' '}\n
\n
\n {editable && (\n history.push('/profile/edit')}\n >\n {t('common:Edit')}\n \n )}\n {isDeletable && (\n displayModal(true)}\n >\n {t('user:Delete user account')}\n \n )}\n \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 \n
\n
\n
\n
\n
\n
\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
\n \n
\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 \n <>\n \n {workout.records.length > 0 && (\n \n \n ` ${\n recordsLabels.filter(\n r => r.record_type === rec.record_type\n )[0].label\n }`\n )}\n />\n \n )}\n \n \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
\n {dayWorkouts.map(act => (\n s.id === act.sport_id).map(s => s.img)}\n />\n ))}\n {dayWorkouts.length > 2 && (\n this.handleDisplayMore()}\n title=\"show more workouts\"\n />\n )}\n {!isHidden && (\n
\n {dayWorkouts.map(act => (\n s.id === act.sport_id)\n .map(s => s.img)}\n />\n ))}\n
\n )}\n
\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
\n
this.handlePrevMonth()}>\n \n
\n
\n \n {format(this.state.currentMonth, dateFormat, localeOptions)}\n \n
\n
this.handleNextMonth()}>\n \n
\n
\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
\n {format(addDays(startDate, i), dateFormat, localeOptions)}\n
\n )\n }\n return
{days}
\n }\n\n filterWorkouts(day) {\n const { workouts, user } = this.props\n if (workouts) {\n return workouts\n .filter(act =>\n isSameDay(getDateWithTZ(act.workout_date, user.timezone), day)\n )\n .reverse()\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 \n
\n {formattedDate}\n \n
\n
\n )\n day = addDays(day, 1)\n }\n rows.push(\n
\n {days}\n
\n )\n days = []\n }\n return
{rows}
\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
\n
\n {this.renderHeader(localeOptions)}\n {this.renderDays(localeOptions)}\n {this.renderCells()}\n
\n
\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
\n
{t('workouts:Personal records')}
\n
\n {Object.keys(recordsBySport).length === 0\n ? t('common:No records.')\n : Object.keys(recordsBySport)\n .sort()\n .map(sportLabel => (\n
\n \n \n {sportLabel}\n \n {/* eslint-disable-next-line max-len */}\n \n \n \n \n \n \n \n {recordsBySport[sportLabel].records.map(rec => (\n \n \n \n \n \n ))}\n \n
\n \n {sportLabel}\n
\n {t(`workouts:${rec.record_type}`)}\n {rec.value}\n \n {rec.workout_date}\n \n
\n
\n ))}\n
\n
\n )\n}\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 {\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
\n

{label}

\n {payload.map(p => (\n

\n {p.name}: {formatValue(displayedData, p.value)} {p.unit}\n

\n ))}\n {payload.length > 0 && (\n

Total: {formatValue(displayedData, total)}

\n )}\n
\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 \n \n {formattedValue}\n \n \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
\n
\n \n \n \n
\n \n \n \n formatValue(displayedData, value)} />\n }\n />\n {sports.map((s, i) => (\n \n ) : (\n ''\n )\n }\n name={t(`sports:${s.label}`)}\n />\n ))}\n \n \n
\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 {t('common:No workouts.')}\n }\n const stats = formatStats(\n statistics,\n sports,\n statsParams,\n displayedSports,\n user.weekm\n )\n return \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 { 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
\n
{t('dashboard:This month')}
\n
\n \n
\n
\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
\n
\n
\n
\n
\n \n
\n
\n
{user.nb_workouts}
\n
{`${\n user.nb_workouts === 1\n ? t('common:workout')\n : t('common:workouts')\n }`}
\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n {Number(user.total_distance).toFixed(2)}\n
\n
km
\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
{days}
\n
{duration}
\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
{user.nb_sports}
\n
{`${\n user.nb_sports === 1 ? t('common:sport') : t('common:sports')\n }`}
\n
\n
\n
\n
\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 function WorkoutCard(props) {\n const { sports, t, user, workout } = props\n\n return (\n
\n
\n \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 \n
\n
\n
\n {workout.map && (\n
\n \n
\n )}\n
\n

\n {' '}\n {t('workouts:Duration')}: {workout.moving}\n {workout.map ? (\n \n
\n
\n
\n ) : (\n ' - '\n )}\n {' '}\n {t('workouts:Distance')}: {workout.distance} km\n

\n
\n
\n
\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 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
\n \n FitTrackee - {t('common:Dashboard')}\n \n {message ? (\n \n ) : (\n workouts &&\n user.total_duration &&\n sports.length > 0 && (\n
\n \n
\n
\n \n \n
\n
\n \n {workouts.length > 0 ? (\n workouts.map(workout => (\n \n ))\n ) : (\n \n )}\n {!paginationEnd && (\n {\n loadMoreWorkouts(page + 1)\n this.setState({ page: page + 1 })\n }}\n />\n )}\n
\n
\n
\n )\n )}\n
\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
\n
\n FitTrackee v{version} -{' '}\n \n source code\n {' '}\n under{' '}\n \n GPLv3\n {' '}\n license -{' '}\n \n documentation\n \n
\n
\n )\n}\n","var _path, _path2, _path3, _path4, _path5, _path6, _path7, _path8, _g, _path9, _path10, _path11, _path12;\n\nfunction _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\nfunction SvgEn(_ref, svgRef) {\n var 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, _path || (_path = /*#__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 })), _path2 || (_path2 = /*#__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 })), _path3 || (_path3 = /*#__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 })), _path4 || (_path4 = /*#__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 })), _path5 || (_path5 = /*#__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 })), _path6 || (_path6 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"m53.273 27.803 145.302 120.879v-120.879z\",\n fill: \"#406bd4\"\n })), _path7 || (_path7 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"m313.425 150.571v-122.768h148.082z\",\n fill: \"#3257b0\"\n })), _path8 || (_path8 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"m394.732 198.575 117.268-97.556v97.556z\",\n fill: \"#3257b0\"\n })), _g || (_g = /*#__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 }))), _path9 || (_path9 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"m313.425 484.197v-124.139l149.221 124.139z\",\n fill: \"#3257b0\"\n })), _path10 || (_path10 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"m512 409.423-115.395-95.998h115.395z\",\n fill: \"#3257b0\"\n })), _path11 || (_path11 = /*#__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 })), _path12 || (_path12 = /*#__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}\n\nvar ForwardRef = /*#__PURE__*/React.forwardRef(SvgEn);\nexport default __webpack_public_path__ + \"static/media/en.9e6dbfb0.svg\";\nexport { ForwardRef as ReactComponent };","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
\n
\n
\n
\n
\n
\n \n You are now logged out. Click here to\n log back in.\n \n
\n
\n
\n
\n
\n
\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","var _path, _path2, _path3, _path4;\n\nfunction _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\nfunction SvgFr(_ref, svgRef) {\n var 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, _path || (_path = /*#__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 })), _path2 || (_path2 = /*#__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 })), _path3 || (_path3 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"m160.795 27.803h190.409v456.394h-190.409z\",\n fill: \"#f0f9ff\"\n })), _path4 || (_path4 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"m256 27.803h95.205v456.394h-95.205z\",\n fill: \"#cee5f5\"\n })));\n}\n\nvar ForwardRef = /*#__PURE__*/React.forwardRef(SvgFr);\nexport default __webpack_public_path__ + \"static/media/fr.d0f9280c.svg\";\nexport { ForwardRef as ReactComponent };","var _g, _g2, _g3, _g4, _g5, _g6, _g7;\n\nfunction _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\nfunction SvgPassword(_ref, svgRef) {\n var 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, _g || (_g = /*#__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 })))), _g2 || (_g2 = /*#__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 })))), _g3 || (_g3 = /*#__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 })))), _g4 || (_g4 = /*#__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 })))), _g5 || (_g5 = /*#__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 })))), _g6 || (_g6 = /*#__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 })))), _g7 || (_g7 = /*#__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}\n\nvar ForwardRef = /*#__PURE__*/React.forwardRef(SvgPassword);\nexport default __webpack_public_path__ + \"static/media/password.afe6a2a5.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: ,\n },\n {\n name: 'fr',\n selected: false,\n flag: ,\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
this.toggleDropdown()}>\n
    \n {languages\n .filter(language =>\n isOpen ? language : language.name === selected\n )\n .map(language => (\n onUpdateLanguage(language.name, selected)}\n >\n {language.flag} {language.name}\n \n ))}\n
\n
\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
\n
\n \n \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","var _g;\n\nfunction _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\nfunction SvgMailSend(_ref, svgRef) {\n var 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, _g || (_g = /*#__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}\n\nvar 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
\n
\n
\n
\n
\n
\n {action === 'sent' && (\n <>\n
\n \n
\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
\n \n
\n \n {/* prettier-ignore */}\n Your password have been updated. Click\n here to log in.\n \n \n )}\n
\n
\n
\n
\n
\n
\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
\n \n FitTrackee - {t('user:Profile Edition')}\n \n {formData.isAuthenticated && (\n
\n {displayModal && (\n {\n onDeleteUser(user.username)\n this.displayModal(false)\n }}\n close={() => this.displayModal(false)}\n />\n )}\n

{t('user:Profile Edition')}

\n
\n
\n
\n
\n
{user.username}
\n
\n
\n
\n {\n event.preventDefault()\n onHandleProfileFormSubmit(formData)\n }}\n >\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n \n {\n event.preventDefault()\n this.displayModal(true)\n }}\n >\n {t('user:Delete my account')}\n \n history.push('/profile')}\n >\n {t('common:Cancel')}\n \n \n \n
\n
\n
\n
\n
\n
\n
\n
\n )}\n
\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 \n FitTrackee - {t('statistics:Statistics')}\n \n
\n
\n
{t('statistics:Statistics')}
\n \n
\n
\n

\n this.handleOnClickArrows(true)}\n />\n

\n
\n
\n {durations.map(d => (\n
\n \n
\n ))}\n
\n
\n

\n this.handleOnClickArrows(false)}\n />\n

\n
\n
\n \n
\n {translatedSports.map(sport => (\n \n ))}\n
\n
\n
\n {user.nb_workouts === 0 && }\n
\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
\n \n FitTrackee - {t(`user:${props.formType}`)}\n \n

{t(pageTitle)}

\n
\n
\n
\n
\n
\n {props.formType === 'register' && !props.isRegistrationAllowed ? (\n
\n
Registration is disabled.
\n
\n history.go(-1)}\n >\n Back\n \n
\n
\n ) : (\n <>\n \n props.handleUserFormSubmit(event, props.formType)\n }\n >\n {props.formType === 'register' && (\n
\n \n
\n )}\n {props.formType !== 'password reset' && (\n
\n \n
\n )}\n {props.formType !== 'reset your password' && (\n <>\n
\n \n
\n {props.formType !== 'login' && (\n
\n \n
\n )}\n \n )}\n \n \n

\n {props.formType === 'login' && (\n \n {t('user:Forgot password?')}\n \n )}\n

\n \n )}\n
\n
\n
\n
\n
\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
\n {isLoggedIn() || (formType === 'password reset' && !token) ? (\n \n ) : (\n
\n \n 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
\n )}\n
\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
\n {displayModal && (\n {\n onDeleteUser(user.username)\n this.displayModal(false)\n }}\n close={() => this.displayModal(false)}\n />\n )}\n {user && (\n this.displayModal(e)}\n t={t}\n user={user}\n />\n )}\n
\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
\n \n \n \n }\n />\n }\n />\n }\n />\n }\n />\n }\n />\n }\n />\n \n \n \n \n \n \n \n \n \n \n \n
\n
\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 \n {children}\n \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","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","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","/* 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 \n \n \n \n ,\n rootNode\n)\nregisterServiceWorker()\n"],"sourceRoot":""} \ No newline at end of file diff --git a/fittrackee_client/package.json b/fittrackee_client/package.json index d2a71d07..c90e104d 100644 --- a/fittrackee_client/package.json +++ b/fittrackee_client/package.json @@ -1,6 +1,6 @@ { "name": "fittrackee_client", - "version": "0.4.6", + "version": "0.4.7", "private": true, "dependencies": { "@mapbox/togeojson": "^0.16.0", diff --git a/fittrackee_client/src/utils/index.js b/fittrackee_client/src/utils/index.js index 45ff0324..c498d33e 100644 --- a/fittrackee_client/src/utils/index.js +++ b/fittrackee_client/src/utils/index.js @@ -17,7 +17,7 @@ export const getFileSizeInMB = fileSize => { return (!fileSize && 0) || +value.toFixed(2) } -export const version = '0.4.6' // version stored in 'utils' for now +export const version = '0.4.7' // version stored in 'utils' for now export const apiUrl = process.env.NODE_ENV === 'production' ? '/api/' diff --git a/pyproject.toml b/pyproject.toml index 917a4095..7e36027d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "fittrackee" -version = "0.4.6" +version = "0.4.7" description = "Self-hosted outdoor workout/activity tracker" authors = ["SamR1"] license = "GPL-3.0"