{"version":3,"sources":["components/utils/Loader.tsx","styles/styles.tsx","components/models/ResultItem.tsx","components/utils/Table.tsx","components/utils/Formatters.tsx","components/utils/ValueTd.tsx","components/charts/Chart.tsx","components/utils/ValueTh.tsx","styles/TypeEmoji.tsx","components/utils/ActivityTr.tsx","components/home/HomePage.tsx","components/utils/DateRangePicker.tsx","components/utils/Urls.tsx","components/utils/ActivityFilter.tsx","components/activities/ActivitiesPage.tsx","components/activities/SimilarActivitiesPage.tsx","components/activityDetails/LapsChart.tsx","components/activityDetails/ActivityDetailsPage.tsx","components/intervals/IntervalsPage.tsx","components/races/races.tsx","components/utils/UserContext.tsx","assets/markus_ser_viktig_ut.jpg","components/landing/LandingPage.tsx","components/Layout.tsx","components/progress/ProgressPage.tsx","components/scatter/ScatterPage.tsx","App.tsx","index.tsx"],"names":["LoadingStatus","Container","styled","div","Box","StackContainer","SubHeader","h2","BigScreenTd","td","BigScreenTh","th","Grid","props","columns","TableContainer","EmptyThead","thead","NoWrapTd","Table","table","LapsTable","LapFactor","color","LapLabel","span","Dropdown","select","Input","input","WarningLabel","label","LoaderContainer","Message","ItemValueType","Loader","status","loadingMessage","errorMessage","None","Loading","version","id","xmlns","x","y","viewBox","enableBackground","fill","stroke","strokeWidth","strokeMiterlimit","strokeDasharray","cx","cy","r","attributeName","attributeType","type","dur","from","to","repeatCount","width","height","values","begin","Error","FixedWidthTable","SmallTable","round","value","decimals","toFixed","getPaceString","metersPerSecond","activityType","showSuffix","Number","isNaN","isRowing","lapDistance","suffix","averageSpeed","Math","averageSpeedMin","floor","averageSpeedSeconds","getKmString","distanceInMeters","getTimeString","seconds","totalSeconds","totalMinutes","totalHours","getDateString","dateTimeString","substr","getUrlDateString","date","month","getMonth","day","getDate","getFullYear","getFeelingEmoji","feeling","emoji","getFeelingTitle","title","AveragePace","items","durationFunc","paceFunc","totalDuration","total","forEach","item","duration","pace","AxisTypes","ValueTdLabel","ValueTdFactor","ValueTdFactorBackground","ValueContainer","ValueTd","DistanceInMeters","MetersPerSecond","TimeInSeconds","Heartrate","toString","Lactate","Feeling","factor","style","Th","ValueTh","valueFunc","length","filter","map","summedValue","reduce","sum","averageValue","elapsedTime","AverageNumber","getActivityEmoji","isBislettInterval","DescriptionText","BoldNavLink","NavLink","ActivityDate","TypeEmoji","FeelingEmoji","ActivityTr","activity","showLactate","showFeeling","isRace","background","undefined","textAlign","whiteSpace","name","description","laps","distance","heartrate","lactate","PageLink","ProgressSummary","useState","loadingStatus","setLoadingStatus","progress","setProgress","useEffect","fetch","then","response","json","data","catch","summary","activityCount","ActivitiesSummary","activities","setActivities","marginBottom","colSpan","HomePage","paddingTop","DatePickerWrapper","DateRangePicker","startDate","endDate","onChange","startDateFilter","setStartDateFilter","endDateFilter","setEndDateFilter","datepickerFocus","setDatepickerFocus","theme","reactDatepicker","fontFamily","inputLabelBorder","inputLabelBorderRadius","dateRangeStartDateInputPadding","dateRangeEndDateInputPadding","inputFontSize","inputActiveBoxShadow","inputCalendarIconWidth","dateRangeGridTemplateColumns","onDatesChange","START_DATE","END_DATE","onFocusChange","focusedInput","displayFormat","showClose","showResetDates","maxBookingDate","Date","numberOfMonths","addOrUpdateQueryString","url","separator","indexOf","parameter","hashMatch","exec","replace","RegExp","getUrlWithFilters","key","defaultDuration","defaultYear","defaultDataType","ActivityFilter","isLoading","disableDataTypeFilter","queryString","parse","window","location","search","year","dataType","minPace","maxPace","groupKey","typeFilter","setTypeFilter","durationFilter","setDurationFilter","parseInt","yearFilter","setYearFilter","dataTypeFilter","setDataTypeFilter","groupKeyFilter","setGroupKeyFilter","medianPace","parseFloat","paceFilter","setPaceFilter","Map","set","origin","pathname","history","replaceState","updateBrowserUrl","ok","position","zIndex","disabled","defaultValue","v","currentTarget","marginRight","Array","_","index","yearOption","start","end","step","placeholder","onClick","ActivitiesPage","filters","setFilters","get","group","numberOfColumns","Fragment","SimiliarActivitiesPage","useParams","getChartData","getX","getY","getLabel","Chart","children","xAxisType","stack","xDomain","yDomain","xType","yTickFormat","hideYAxis","hideXAxis","defaultMargins","left","right","top","bottom","margin","marginTop","disableHeight","size","min","stackBy","shapeRendering","tickFormat","hideTicks","hideLine","toUTCString","tickLabelAngle","tickPadding","Integer","val","IntervalPaceContainer","isPauseLap","isInterval","NormalizeChartData","minValue","maxValue","sortedData","sort","a","b","max","WorkoutType","LapsChart","averageIntervalPace","last60DaysIntervalPace","hint","setHint","sortedBySpeed","lap","lapIndex","l1","l2","slowSpeed","minChartHeight","chart","useMemo","barPadding","currentMovingTime","chartLaps","averageLapSpeed","x0","y0","yHeartrate","averageHeartrate","movingTime","chartLapsHeartrate","yOffset","heartrateLaps","totalMovingTime","labelData","labelTicks","chartLap","customComponent","textAnchor","fontSize","letterSpacing","labelTicksComponent","x1","y1","x2","y2","distancePerSecond","onValueMouseOver","owner","onValueMouseOut","onValueClick","hash","colorRange","labelAnchorX","labelAnchorY","textShadow","opacity","strokeLinecap","boxShadow","padding","borderRadius","lineHeight","ActionButton","ScrollableBox","ActionButtonNav","Link","Heading","Description","p","ActivityDetailsPage","setActivity","setAverageIntervalPace","setLast60DaysIntervalPace","hasIntervals","bislettIntervals","originalDistance","workoutType","maxSpeed","hasHeartrate","maxHeartrate","achievementCount","athleteCount","averageCadence","calories","commute","elevLow","elevHigh","totalElevationGain","gear","manual","deviceName","maxWatts","perceivedExertion","prCount","private","sufferScore","method","ignoreIntervals","toUpperCase","href","join","rel","IntervalsPage","setLactate","lactateAll","setLactateAll","totalDistances","setTotalDistances","intervalDistances","setIntervalDistances","shortPaces","setShortPaces","mediumPaces","setMediumPaces","longPaces","setLongPaces","intervals","measurements","getTime","allMeasurements","distances","nonIntervalDistance","intervalDistance","reverse","paces","averageShortPace","averageMediumPace","averageLongPace","ceil","barWidth","d","sizeHexagonsWithCount","sizeBaseValue","minWidth","fontWeight","interval_AveragePace","interval_Laps","distanceFactor","averageSpeedFactor","averageHeartrateFactor","RacesPage","UserContext","React","createContext","LandingContainer","BannerWrapper","ContentWrapper","BoxWrapper","BoxText","LandingPage","src","foto","alt","LayoutContainer","MenuWrapper","MenuContainer","LinkContainer","ul","CenterContainer","SyncPercentage","ProfileImage","img","checkProgress","setSyncProgress","setUser","setTimeout","Layout","user","syncProgress","Provider","display","exact","activeClassName","target","flex","profileImageUrl","fullName","ProgressPage","getAxisSettings","lockAxisFilter","format","ScatterPage","yAxis","xAxis","setItems","yAxisFilter","setYAxisFilter","xAxisFilter","setXAxisFilter","yAxisSettings","xAxisSettings","className","radius","text","xPercent","yPercent","transform","App","path","component","ActivitiesDetailsPage","baseUrl","document","getElementsByTagName","getAttribute","rootElement","getElementById","ReactDOM","basename"],"mappings":"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","file":"static/js/main.d71d4204.chunk.js","sourcesContent":["import React from 'react';\nimport styled from 'styled-components';\n\nconst LoaderContainer = styled.div`\n height: 200px;\n display: flex;\n flex-direction: column;\n justify-content: flex-end;\n align-items: center;\n\n svg {\n width: 100px;\n }\n\n animation: fadein 2s;\n\n @keyframes fadein {\n 0% {\n opacity: 0;\n }\n 50% {\n opacity: 0;\n }\n 100% {\n opacity: 1;\n }\n }\n`;\n\nconst Message = styled.div`\n text-align: center;\n margin-top: 20px;\n`;\n\nexport enum LoadingStatus {\n None,\n Loading,\n Error,\n}\n\nconst Loader: React.FC<{\n status: LoadingStatus;\n loadingMessage?: string;\n errorMessage?: string;\n}> = ({ status, loadingMessage, errorMessage }) => {\n if (status === LoadingStatus.None) {\n return null;\n }\n\n return (\n \n {status === LoadingStatus.Loading && (\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 {loadingMessage ?? 'Loading items ...'}\n \n )}\n {status === LoadingStatus.Error && (\n \n {errorMessage ?? 'Failed to fetch content. Unknown error'}\n \n )}\n \n );\n};\n\nexport default Loader;\n","import styled from 'styled-components';\n\nexport const Container = styled.div`\n border-radius: 5px;\n margin-bottom: 20px;\n`;\n\nexport const Box = styled(Container)`\n background: #fff;\n box-shadow: rgb(0 0 0 / 13%) 0px 1.6px 3.6px 0px,\n rgb(0 0 0 / 11%) 0px 0.3px 0.9px 0px;\n padding: 20px;\n\n @media (max-width: 768px) {\n margin-left: -10px;\n margin-right: -10px;\n border-radius: 0;\n }\n`;\n\nexport const StackContainer = styled(Container)`\n display: flex;\n flex-wrap: wrap;\n margin-bottom: 0;\n\n & > * {\n margin-right: 20px;\n margin-bottom: 20px;\n\n @media (max-width: 768px) {\n margin-bottom: 10px;\n margin-right: 10px;\n }\n\n &:last-child {\n margin-right: 0;\n }\n }\n`;\n\nexport const SubHeader = styled.h2`\n font-size: 17px;\n line-height: 1;\n margin: 0;\n margin-bottom: 5px;\n`;\n\nexport const BigScreenTd = styled.td`\n @media (max-width: 768px) {\n display: none;\n }\n`;\n\nexport const BigScreenTh = styled.th`\n @media (max-width: 768px) {\n display: none;\n }\n`;\n\nexport const Grid = styled.div<{ columns: number }>`\n @media (min-width: 1000px) {\n display: grid;\n column-gap: 20px;\n row-gap: 20px;\n margin-bottom: 20px;\n grid-template-columns: repeat(\n ${(props) => props.columns},\n minmax(0, 1fr)\n );\n grid-template-rows: auto;\n\n & > * {\n margin-bottom: 0 !important;\n }\n }\n\n @media (max-width: 768px) {\n margin: 0 -10px;\n margin-bottom: 10px;\n\n & > * {\n margin-bottom: 0 !important;\n }\n }\n`;\n\nexport const TableContainer = styled.div`\n @media (max-width: 768px) {\n margin: 0 -10px;\n overflow-x: auto;\n }\n`;\n\nexport const EmptyThead = styled.thead``;\n\nexport const NoWrapTd = styled.td``;\n\nexport const Table = styled.table`\n width: 100%;\n border-spacing: 0;\n border-collapse: separate;\n border-radius: 5px;\n margin-bottom: 20px;\n background: #fff;\n box-shadow: rgb(0 0 0 / 13%) 0px 1.6px 3.6px 0px,\n rgb(0 0 0 / 11%) 0px 0.3px 0.9px 0px;\n overflow: hidden;\n\n > thead > tr > th {\n text-align: right;\n padding: 13px 15px 10px;\n font-size: 15px;\n line-height: 1;\n background: lightblue;\n\n &:first-child {\n text-align: left;\n padding-left: 20px;\n }\n\n &:last-child {\n padding-right: 20px;\n }\n\n @media (max-width: 768px) {\n padding: 5px;\n font-size: 13px;\n line-height: 1;\n\n &:first-child {\n padding-left: 10px;\n }\n\n &:last-child {\n padding-right: 10px;\n }\n }\n }\n\n > ${EmptyThead} > tr > th {\n background: #ddd;\n padding-top: 10px;\n padding-bottom: 10px;\n font-weight: normal;\n\n @media (max-width: 768px) {\n padding-top: 5px;\n padding-bottom: 5px;\n }\n }\n\n > tbody > tr {\n > td {\n border-top: thin solid #efefef;\n }\n\n &:nth-child(odd) {\n background: #fafafa;\n }\n\n > td {\n white-space: pre-wrap;\n max-width: 300px;\n text-align: right;\n padding: 10px;\n\n &:first-child {\n text-align: left;\n padding-left: 20px;\n }\n\n &:last-child {\n padding-right: 20px;\n }\n\n @media (max-width: 768px) {\n padding: 5px;\n font-size: 13px;\n line-height: 1.3;\n\n &:first-child {\n padding-left: 10px;\n }\n\n &:last-child {\n padding-right: 10px;\n }\n }\n }\n\n > ${NoWrapTd} {\n white-space: nowrap;\n }\n }\n`;\n\nexport const LapsTable = styled.table`\n border-spacing: 0;\n border-collapse: separate;\n width: 100%;\n table-layout: fixed;\n\n th {\n white-space: nowrap;\n font-size: 11px;\n line-height: 1;\n text-align: right;\n font-weight: 600;\n padding-right: 12px;\n padding-bottom: 3px;\n\n &:last-child {\n padding-right: 2px;\n }\n }\n\n td {\n white-space: nowrap;\n font-size: 11px;\n line-height: 1;\n text-align: right;\n position: relative;\n border-right: 10px solid transparent;\n\n &:last-child {\n border-right: 0;\n }\n }\n`;\n\nexport const LapFactor = styled.div<{ color: string }>`\n position: absolute;\n right: 0;\n top: 0;\n bottom: 1px;\n opacity: 0.3;\n background: ${(props) => props.color};\n`;\n\nexport const LapLabel = styled.span`\n z-index: 1;\n position: relative;\n display: block;\n padding: 2px;\n`;\n\nexport const Dropdown = styled.select`\n border-radius: 3px;\n border: thin solid #ddd;\n padding: 10px 15px;\n font-family: 'Roboto', sans-serif;\n font-size: 15px;\n line-height: 1;\n background: #fff;\n color: #000;\n font-weight: 500;\n\n @media (max-width: 768px) {\n padding: 8px;\n font-size: 11px;\n line-height: 1;\n }\n`;\n\nexport const Input = styled.input`\n border-radius: 3px;\n border: thin solid #ddd;\n padding: 10px 15px;\n font-family: 'Roboto', sans-serif;\n font-size: 15px;\n line-height: 1;\n background: #fff;\n color: #000;\n font-weight: 500;\n\n @media (max-width: 768px) {\n padding: 8px;\n font-size: 11px;\n line-height: 1;\n }\n`;\n\nexport const DropdownLabel = styled.label`\n padding: 10px 0;\n padding-right: 10px;\n font-family: 'Roboto', sans-serif;\n font-size: 15px;\n line-height: 1;\n display: flex;\n flex-direction: column;\n justify-content: center;\n margin-right: 0;\n`;\n\nexport const WarningLabel = styled.span`\n padding: 10px 0;\n font-family: 'Roboto', sans-serif;\n font-size: 15px;\n line-height: 1;\n display: flex;\n flex-direction: column;\n justify-content: center;\n color: red;\n font-weight: bold;\n margin-right: 20px;\n`;\n","export enum ItemValueType {\n Number = 0,\n DistanceInMeters = 1,\n MetersPerSecond = 2,\n TimeInSeconds = 3,\n Heartrate = 4,\n Lactate = 5,\n AverageNumber = 6,\n Feeling = 7,\n}\n\nexport interface ItemValue {\n value: number;\n factor: number;\n type: ItemValueType;\n}\n\nexport interface ResultItem {\n activityCount: ItemValue;\n distance: ItemValue;\n elapsedTime: ItemValue;\n pace: ItemValue;\n heartrate: ItemValue;\n lactate: ItemValue;\n laps: ItemValue;\n feeling: ItemValue;\n}\n","import styled from 'styled-components';\n\nexport const EmptyThead = styled.thead``;\n\nexport const Table = styled.table`\n width: 100%;\n border-spacing: 0;\n border-collapse: separate;\n border-radius: 5px;\n margin-bottom: 20px;\n background: #fff;\n box-shadow: rgb(0 0 0 / 13%) 0px 1.6px 3.6px 0px,\n rgb(0 0 0 / 11%) 0px 0.3px 0.9px 0px;\n overflow: hidden;\n\n @media (max-width: 768px) {\n font-size: 11px;\n line-height: 1.1;\n border-radius: 0;\n }\n\n > thead > tr > th {\n text-align: right;\n padding: 13px 15px 10px;\n font-size: inherit;\n line-height: 1;\n background: lightblue;\n\n &:first-child {\n text-align: left;\n padding-left: 20px;\n }\n\n &:last-child {\n padding-right: 20px;\n }\n\n @media (max-width: 768px) {\n padding: 5px;\n\n &:first-child {\n padding-left: 10px;\n }\n\n &:last-child {\n padding-right: 10px;\n }\n }\n }\n\n > ${EmptyThead} > tr > th {\n background: #ddd;\n color: #555;\n padding-top: 5px;\n padding-bottom: 5px;\n font-weight: normal;\n font-size: 11px;\n\n @media (max-width: 768px) {\n padding: 4px 3px;\n\n &:first-child {\n padding-left: 10px;\n }\n\n &:last-child {\n padding-right: 10px;\n }\n }\n }\n\n > tbody > tr {\n > td {\n border-top: thin solid #efefef;\n }\n\n > td {\n max-width: 300px;\n text-align: right;\n padding: 5px 10px;\n white-space: nowrap;\n position: relative;\n\n &:first-child {\n text-align: left;\n padding-left: 20px;\n }\n\n &:last-child {\n padding-right: 20px;\n }\n\n @media (max-width: 768px) {\n padding: 4px 3px;\n\n &:first-child {\n padding-left: 10px;\n }\n\n &:last-child {\n padding-right: 10px;\n }\n }\n }\n }\n`;\n\nexport const FixedWidthTable = styled(Table)`\n @media (min-width: 1024px) {\n table-layout: fixed;\n }\n`;\n\nexport const SmallTable = styled(Table)`\n font-size: 11px;\n line-height: 1.3;\n table-layout: auto;\n\n @media (min-width: 769px) {\n > thead > tr > th {\n padding: 10px;\n }\n }\n`;\n","// frontend implementation of some Activities.Core.Extensions.MathExtensions functions.\n\nexport const round = (value: number, decimals: number) =>\n value.toFixed(decimals);\n\nexport const getPaceString = (\n metersPerSecond: number,\n activityType: string,\n showSuffix: boolean = false\n) => {\n if (Number.isNaN(metersPerSecond) || metersPerSecond === 0) {\n return '';\n }\n\n const isRowing = activityType === 'Rowing';\n const lapDistance = isRowing ? 500 : 1000;\n const suffix = isRowing ? ' /500m' : ' /km';\n\n const averageSpeed = Math.round(lapDistance / metersPerSecond);\n const averageSpeedMin = Math.floor(averageSpeed / 60);\n const averageSpeedSeconds = averageSpeed % 60;\n\n return `${averageSpeedMin}:${\n averageSpeedSeconds < 10 ? '0' : ''\n }${averageSpeedSeconds}${showSuffix ? suffix : ''}`;\n};\n\nexport const getMetersPerSecond = (minPerKm: number) => {\n const averageSpeedMin = Math.floor(minPerKm);\n const averageSpeedSeconds = (minPerKm % 1) / 0.6;\n return 1000 / (averageSpeedMin + averageSpeedSeconds) / 60;\n};\n\nexport const getKmString = (distanceInMeters: number, decimals: number = 1) =>\n `${round(distanceInMeters / 1000, decimals)} km`;\n\nexport const getTimeString = (seconds: number) => {\n const totalSeconds = Math.round(seconds % 60);\n const totalMinutes = Math.floor((seconds / 60) % 60) | 0;\n const totalHours = Math.floor(seconds / 60 / 60) | 0;\n\n if (totalHours > 0) {\n return `${totalHours}:${totalMinutes < 10 ? '0' : ''}${totalMinutes}:${\n totalSeconds < 10 ? '0' : ''\n }${totalSeconds}`;\n }\n\n return `${totalMinutes}:${totalSeconds < 10 ? '0' : ''}${totalSeconds}`;\n};\n\nexport const getDateString = (dateTimeString: string) =>\n `${dateTimeString.substr(8, 2)}.${dateTimeString.substr(\n 5,\n 2\n )}.${dateTimeString.substr(0, 4)}`;\n\nexport const getUrlDateString = (date: Date) => {\n const month = `${date.getMonth() + 1 < 10 ? '0' : ''}${\n date.getMonth() + 1\n }`;\n const day = `${date.getDate() < 10 ? '0' : ''}${date.getDate()}`;\n return `${date.getFullYear()}-${month}-${day}`;\n};\n\nexport const getFeelingEmoji = (feeling: number) => {\n let emoji = '-';\n if (feeling === 3) {\n emoji = '😎'; // '😁';\n } else if (feeling === 2) {\n emoji = '🙂'; // '🙂';\n } else if (feeling === 1) {\n emoji = '🥵'; // '🥵';\n }\n return emoji;\n};\n\nexport const getFeelingTitle = (feeling: number) => {\n let title = '-';\n if (feeling === 3) {\n title = 'Easy';\n } else if (feeling === 2) {\n title = 'Normal';\n } else if (feeling === 1) {\n title = 'Heavy';\n }\n return title;\n};\n\nexport function AveragePace(\n items: T[],\n durationFunc: (item: T) => number | null,\n paceFunc: (item: T) => number | null\n) {\n let totalDuration = 0.0;\n let total = 0.0;\n\n items.forEach((item) => {\n const duration = durationFunc(item);\n const pace = paceFunc(item);\n\n if (duration && pace) {\n totalDuration += duration;\n total += pace * duration;\n }\n });\n\n if (totalDuration === 0.0) {\n return null;\n }\n\n return total / totalDuration;\n}\n","import React from 'react';\nimport styled from 'styled-components';\nimport { ItemValue, ItemValueType } from '../models/ResultItem';\nimport {\n getFeelingEmoji,\n getKmString,\n getPaceString,\n getTimeString,\n round,\n} from './Formatters';\n\nconst ValueTdLabel = styled.span`\n z-index: 1;\n position: relative;\n display: block;\n min-width: 60px;\n padding: 2px 3px 1px 0px;\n\n @media (max-width: 768px) {\n min-width: 40px;\n }\n`;\n\nconst ValueTdFactor = styled.div<{ color: string }>`\n position: absolute;\n right: 0;\n top: -4px;\n bottom: -4px;\n opacity: 0.4;\n max-width: 100%;\n background: ${(props) => props.color};\n border-radius: 3px;\n`;\n\nconst ValueTdFactorBackground = styled(ValueTdFactor)`\n opacity: 1;\n width: 100%;\n`;\n\nconst ValueContainer = styled.div`\n position: relative;\n`;\n\nconst ValueTd: React.FC<{\n item: ItemValue;\n activityType?: string | undefined;\n title?: string | undefined;\n}> = (props) => {\n const { item, activityType, title } = props;\n\n if (item == null) {\n return (\n \n -\n \n );\n }\n\n let value = round(item.value, 0);\n let color = '#aaa';\n\n switch (item.type) {\n case ItemValueType.DistanceInMeters:\n value = getKmString(item.value);\n color = '#005dff';\n break;\n case ItemValueType.MetersPerSecond:\n value = getPaceString(item.value, activityType ?? '');\n color = '#00a000';\n break;\n case ItemValueType.TimeInSeconds:\n value = getTimeString(item.value);\n color = '#005dff';\n break;\n case ItemValueType.Heartrate:\n value = Math.round(item.value).toString();\n color = '#ff1700';\n break;\n case ItemValueType.Lactate:\n value = round(item.value, 1);\n color = '#a0a20a';\n break;\n case ItemValueType.Feeling:\n value = getFeelingEmoji(item.value);\n break;\n default:\n }\n\n return (\n \n \n {value}\n {item.factor > 0 && (\n <>\n \n \n \n )}\n \n \n );\n};\n\nexport default ValueTd;\n","import React from 'react';\nimport { AutoSizer } from 'react-virtualized';\nimport {\n XYPlot,\n XAxis,\n YAxis,\n HorizontalGridLines,\n RVTickFormat,\n Margin,\n} from 'react-vis';\nimport '../../../node_modules/react-vis/dist/style.css';\n\nexport enum AxisTypes {\n Number,\n Integer,\n Date,\n None,\n}\n\ninterface ChartProps {\n children: React.ReactNode;\n height?: number;\n xAxisType?: AxisTypes;\n xType?: string;\n xDomain?: unknown;\n yDomain?: unknown;\n stack?: boolean;\n yTickFormat?: RVTickFormat | undefined;\n margin?: Margin;\n hideYAxis?: boolean | undefined;\n}\n\nconst Chart: React.FC = (props) => {\n const {\n children,\n height,\n xAxisType,\n stack,\n xDomain,\n yDomain,\n xType,\n yTickFormat,\n hideYAxis,\n } = props;\n const hideXAxis = xAxisType === undefined || xAxisType === AxisTypes.None;\n const defaultMargins = {\n left: hideYAxis ? 5 : 40,\n right: 5,\n top: 10,\n bottom: hideXAxis ? 10 : 40,\n };\n\n return (\n
\n \n {(size) => (\n \n \n \n {xAxisType === AxisTypes.Date && (\n \n new Date(v).toUTCString().substr(8, 8)\n }\n tickLabelAngle={30}\n tickPadding={30}\n />\n )}\n {xAxisType === AxisTypes.Number && (\n \n )}\n {xAxisType === AxisTypes.Integer && (\n \n Math.round(val) === val\n ? val.toString()\n : ''\n }\n />\n )}\n {hideXAxis && }\n {children}\n \n )}\n \n
\n );\n};\n\nexport interface DynamicChartData {\n x: number | string | Date;\n y: number | string | Date;\n label?: string;\n}\n\nexport interface ChartData {\n x: number | string;\n y: number;\n label?: string;\n}\n\nexport interface NumericChartData {\n x: number;\n y: number;\n label?: string;\n}\n\nexport function getChartData(\n data: T[],\n getX: (item: T) => number | string,\n getY: (item: T) => number,\n getLabel?: (item: T) => string\n): ChartData[] {\n return data.map((item) => ({\n x: getX(item),\n y: getY(item),\n label: getLabel?.(item),\n }));\n}\n\nexport default Chart;\n","import React from 'react';\nimport styled from 'styled-components';\nimport { ItemValue, ItemValueType, ResultItem } from '../models/ResultItem';\nimport {\n AveragePace,\n getKmString,\n getPaceString,\n getTimeString,\n round,\n} from './Formatters';\n\nconst Th = styled.th`\n white-space: nowrap;\n`;\n\nconst ValueTh: React.FC<{\n items: ResultItem[];\n valueFunc: (item: ResultItem) => ItemValue;\n activityType?: string | undefined;\n title?: string | undefined;\n}> = (props) => {\n const { items, valueFunc, activityType, title } = props;\n\n if (items == null || items.length === 0) {\n return  ;\n }\n\n const values = items\n .filter((item) => valueFunc(item))\n .map((item) => valueFunc(item).value);\n\n if (values.length === 0) {\n return  ;\n }\n\n const { type } = valueFunc(items.filter((item) => valueFunc(item))[0]);\n const summedValue = values.reduce((sum, value) => sum + value);\n const averageValue = summedValue / values.length;\n let value = round(summedValue, 0);\n\n switch (type) {\n case ItemValueType.DistanceInMeters:\n value = getKmString(summedValue);\n break;\n case ItemValueType.MetersPerSecond:\n value = getPaceString(\n AveragePace(\n items,\n (item) => item.elapsedTime?.value,\n (item) => item.pace?.value\n ) || 0,\n activityType ?? '',\n true\n );\n break;\n case ItemValueType.TimeInSeconds:\n value = getTimeString(summedValue);\n break;\n case ItemValueType.Heartrate:\n value = Math.round(averageValue).toString();\n break;\n case ItemValueType.Lactate:\n case ItemValueType.AverageNumber:\n value = round(averageValue, 1);\n break;\n default:\n }\n\n return {value};\n};\n\nexport default ValueTh;\n","export const getActivityEmoji = (\n type: string,\n isBislettInterval?: boolean | undefined\n) => {\n switch (type) {\n case 'Run':\n if (isBislettInterval) {\n return '🅱️';\n }\n\n return '🏃‍♂️';\n case 'Ride':\n case 'VirtualRide':\n return '🚴‍♂️';\n case 'NordicSki':\n return '⛷';\n case 'Swim':\n return '🏊‍♂️';\n case 'Rowing':\n return '🚣‍♂️';\n default:\n return '';\n }\n};\n","import React from 'react';\nimport { NavLink } from 'react-router-dom';\nimport styled from 'styled-components';\nimport ValueTd from './ValueTd';\nimport { ItemValue, ResultItem } from '../models/ResultItem';\nimport { getActivityEmoji } from '../../styles/TypeEmoji';\nimport { getFeelingEmoji, getFeelingTitle } from './Formatters';\n\nexport interface Activity extends ResultItem {\n id: number;\n date: string;\n name: string;\n type: string;\n isBislettInterval?: boolean;\n isRace?: boolean;\n description: string;\n distance: ItemValue;\n elapsedTime: ItemValue;\n pace: ItemValue;\n heartrate: ItemValue;\n lactate: ItemValue;\n laps: ItemValue;\n feeling: ItemValue;\n}\n\nconst DescriptionText = styled.div`\n font-size: 9px;\n white-space: normal;\n line-height: 1.1;\n\n @media (max-width: 768px) {\n display: none;\n }\n`;\n\nconst BoldNavLink = styled(NavLink)`\n font-weight: 500;\n text-decoration: none;\n`;\n\nconst ActivityDate = styled.span`\n @media (max-width: 768px) {\n white-space: pre-line;\n margin-left: 15px;\n display: block;\n font-size: 9px;\n line-height: 1;\n }\n`;\n\nexport const TypeEmoji = styled.span`\n display: inline-block;\n font-size: 17px;\n width: 30px;\n\n @media (max-width: 768px) {\n font-size: 13px;\n width: 17px;\n position: absolute;\n left: 4px;\n top: calc(50% - 8px);\n }\n`;\n\nexport const FeelingEmoji = styled.span`\n display: inline-block;\n font-size: 17px;\n width: 30px;\n\n @media (max-width: 768px) {\n font-size: 13px;\n width: 17px;\n position: absolute;\n left: 4px;\n top: calc(50% - 8px);\n }\n`;\n\nconst ActivityTr: React.FC<{\n activity: Activity;\n showLactate: boolean;\n showFeeling: boolean;\n}> = (props) => {\n const { activity, showLactate, showFeeling } = props;\n\n return (\n \n \n
\n \n {getActivityEmoji(\n activity.type,\n activity.isBislettInterval\n )}\n \n {activity.date}\n
\n \n \n \n {activity.name}\n \n {activity.description}\n \n {activity.laps && }\n \n \n \n \n {showLactate && }\n {showFeeling && activity.feeling && (\n \n
\n \n {getFeelingEmoji(activity.feeling.value)}\n \n
\n \n )}\n {showFeeling && activity.feeling == null && (\n \n
 
\n \n )}\n \n );\n};\n\nexport default ActivityTr;\n","import React, { useEffect, useState } from 'react';\nimport { NavLink } from 'react-router-dom';\nimport styled from 'styled-components';\nimport { Grid, SubHeader, TableContainer } from '../../styles/styles';\nimport Loader, { LoadingStatus } from '../utils/Loader';\nimport { SmallTable, Table } from '../utils/Table';\nimport ValueTd from '../utils/ValueTd';\nimport ValueTh from '../utils/ValueTh';\nimport { getActivityEmoji } from '../../styles/TypeEmoji';\nimport ActivityTr, { Activity } from '../utils/ActivityTr';\n\n// const NavButton = styled(NavLink)`\n// padding: 7px 12px;\n// background-color: #005dff;\n// margin-right: 10px;\n// text-decoration: none;\n// font-weight: 500;\n// cursor: pointer;\n// color: white;\n// display: inline-block;\n// `;\n\nconst PageLink = styled(NavLink)`\n display: inline-block;\n margin-bottom: 20px;\n`;\n\nconst progressTable = (name: string, items: Activity[]) => (\n \n \n \n {getActivityEmoji(name)}\n item.activityCount}\n />\n item.distance} />\n item.elapsedTime} />\n item.pace} />\n item.heartrate} />\n \n \n \n {items.map((item) => (\n \n {item.name}\n {item.activityCount?.value}\n \n \n \n \n \n ))}\n \n \n);\n\ninterface ActivitySummary {\n name: string;\n summary: Activity[];\n}\n\nconst ProgressSummary: React.FC = () => {\n const [loadingStatus, setLoadingStatus] = useState(LoadingStatus.None);\n const [progress, setProgress] = useState();\n\n useEffect(() => {\n if (progress != null) {\n return;\n }\n\n setLoadingStatus(LoadingStatus.Loading);\n\n fetch('/api/progress/summary')\n .then((response) => response.json() as Promise)\n .then((data) => {\n setProgress(data);\n setLoadingStatus(LoadingStatus.None);\n })\n .catch(() => {\n setProgress([]);\n setLoadingStatus(LoadingStatus.Error);\n });\n }, [progress]);\n\n return (\n <>\n \n {loadingStatus === LoadingStatus.None && progress && (\n <>\n Progress overview\n \n {progress.map((item) =>\n progressTable(item.name, item.summary)\n )}\n \n View all progress\n \n )}\n \n );\n};\n\nconst ActivitiesSummary: React.FC = () => {\n const [loadingStatus, setLoadingStatus] = useState(LoadingStatus.None);\n const [activities, setActivities] = useState();\n\n useEffect(() => {\n if (activities != null) {\n return;\n }\n\n setLoadingStatus(LoadingStatus.Loading);\n\n fetch('/api/activities/summary')\n .then((response) => response.json() as Promise)\n .then((data) => {\n setActivities(data);\n setLoadingStatus(LoadingStatus.None);\n })\n .catch(() => {\n setActivities([]);\n setLoadingStatus(LoadingStatus.Error);\n });\n }, [activities]);\n\n const showLactate =\n (activities &&\n activities.filter((activity) => activity.lactate).length > 0) ===\n true;\n\n const showFeeling =\n (activities &&\n activities.filter((activity) => activity.feeling != null).length >\n 0) === true;\n\n return (\n <>\n \n {loadingStatus === LoadingStatus.None && activities && (\n <>\n Latest activities\n
\n \n \n \n \n \n item.distance}\n title=\"Distance\"\n />\n \n item.elapsedTime\n }\n title=\"Time\"\n />\n item.pace}\n title=\"Pace\"\n />\n item.heartrate}\n title=\"Heartrate\"\n />\n {showLactate && (\n \n item.lactate\n }\n title=\"Lactate\"\n />\n )}\n {showFeeling && (\n \n )}\n \n \n \n {activities.map((activity) => (\n \n ))}\n \n
 \n    \n
\n
\n
\n View all activities\n \n )}\n \n );\n};\n\nconst HomePage: React.FC = () => (\n
\n \n \n
\n);\n\nexport default HomePage;\n","import React, { useEffect, useState } from 'react';\nimport { DateRangeInput, START_DATE, END_DATE } from '@datepicker-react/styled';\nimport styled, { ThemeProvider } from 'styled-components';\n\nconst DatePickerWrapper = styled.div`\n label {\n width: 110px;\n }\n`;\n\ninterface DateRangePickerProps {\n startDate: Date | null;\n endDate: Date | null;\n isLoading: boolean | undefined;\n onChange: (startDate: Date, endDate: Date) => void;\n}\n\nconst DateRangePicker: React.FC = (props) => {\n const { startDate, endDate, onChange } = props;\n const [startDateFilter, setStartDateFilter] = useState(\n startDate\n );\n const [endDateFilter, setEndDateFilter] = useState(endDate);\n const [datepickerFocus, setDatepickerFocus] = useState<\n typeof START_DATE | typeof END_DATE | null\n >(null);\n\n useEffect(() => {\n if (!startDateFilter || !endDateFilter) {\n return;\n }\n\n onChange(startDateFilter, endDateFilter);\n }, [startDateFilter, endDateFilter, onChange]);\n\n return (\n \n \n {\n setStartDateFilter(data.endDate);\n setEndDateFilter(data.startDate);\n setDatepickerFocus(\n datepickerFocus === START_DATE\n ? END_DATE\n : START_DATE\n );\n }}\n onFocusChange={(data) => {\n setDatepickerFocus(data);\n }}\n startDate={endDateFilter}\n endDate={startDateFilter}\n focusedInput={datepickerFocus}\n displayFormat=\"dd.MM.yyyy\"\n showClose={false}\n showResetDates={false}\n maxBookingDate={new Date()}\n numberOfMonths={1}\n />\n \n \n );\n};\n\nexport default DateRangePicker;\n","export const addOrUpdateQueryString = (\n url: string,\n name: string,\n value: string\n) => {\n const separator = url.indexOf('?') === -1 ? '?' : '&';\n const parameter = `${name}=${value}`;\n\n if (url.indexOf(`${name}=`) === -1) {\n const hashMatchPattern = /^(.+?)#(.+?)$/i;\n const hashMatch = hashMatchPattern.exec(url);\n\n if (hashMatch != null) {\n // url contains a hash like: /url/to/content#some-hash\n return `${hashMatch[1] + separator + parameter}#${hashMatch[2]}`;\n }\n return url + separator + parameter;\n }\n url = url.replace(new RegExp(`${name}=[^&]+`), parameter);\n\n return url;\n};\n\nexport const removeQueryString = (url: string, name: string) =>\n url.replace(new RegExp(`[\\\\?|\\\\&]+${name}=[^&]+`), '');\n","import React, { useEffect, useState } from 'react';\nimport queryString from 'query-string';\nimport DateRangePicker from './DateRangePicker';\nimport {\n StackContainer,\n Dropdown,\n Input,\n WarningLabel,\n} from '../../styles/styles';\nimport { addOrUpdateQueryString } from './Urls';\nimport { getUrlDateString } from './Formatters';\n\nexport const getUrlWithFilters = (url: string, items: Filters) => {\n if (items === undefined) {\n return url;\n }\n\n items.forEach((value, key) => {\n url = addOrUpdateQueryString(url, key, value.toString());\n });\n\n return url;\n};\n\nconst defaultType = 'All';\nconst defaultDuration = 'LastMonths';\nconst defaultYear = new Date().getFullYear();\nconst defaultDataType = 'Activity';\nconst defaultGroupKey = 'Month';\n\nconst updateBrowserUrl = (items: Filters) => {\n let url = `${window.location.origin}${window.location.pathname}`;\n\n items.forEach((value, key) => {\n if (\n (key === 'type' && value === defaultType) ||\n (key === 'duration' && value === defaultDuration) ||\n (key === 'year' && value === defaultYear) ||\n (key === 'dataType' && value === defaultDataType)\n ) {\n return;\n }\n\n url = addOrUpdateQueryString(url, key, value.toString());\n });\n\n window.history.replaceState({}, '', url);\n};\n\nexport type Filters = Map;\n\ninterface ActivityFilterProps {\n isLoading?: boolean | undefined;\n onChange: (items: Filters) => void;\n disableDataTypeFilter?: boolean | undefined;\n}\n\ninterface Pace {\n medianPace: number | undefined;\n minPace: number | undefined;\n maxPace: number | undefined;\n}\n\ninterface Estimates {\n medianPace: string;\n minPace: string;\n maxPace: string;\n}\n\nconst ActivityFilter: React.FC = (props) => {\n const { isLoading, onChange, disableDataTypeFilter } = props;\n\n const {\n type,\n duration,\n year,\n dataType,\n minPace,\n maxPace,\n startDate,\n endDate,\n groupKey,\n } = queryString.parse(window.location.search);\n const [typeFilter, setTypeFilter] = useState(\n typeof type === 'string' ? type : defaultType\n );\n const [durationFilter, setDurationFilter] = useState(\n typeof duration === 'string' ? duration : defaultDuration\n );\n const [yearFilter, setYearFilter] = useState(\n typeof year === 'string' ? parseInt(year, 10) : defaultYear\n );\n const [dataTypeFilter, setDataTypeFilter] = useState(\n typeof dataType === 'string' ? dataType : defaultDataType\n );\n const [startDateFilter, setStartDateFilter] = useState(\n typeof startDate === 'string' ? new Date(startDate) : null\n );\n const [endDateFilter, setEndDateFilter] = useState(\n typeof endDate === 'string' ? new Date(endDate) : null\n );\n const [groupKeyFilter, setGroupKeyFilter] = useState(\n typeof groupKey === 'string' ? groupKey : defaultGroupKey\n );\n const [paceFilter, setPaceFilter] = useState({\n medianPace: undefined,\n minPace: typeof minPace === 'string' ? parseFloat(minPace) : undefined,\n maxPace: typeof maxPace === 'string' ? parseFloat(maxPace) : undefined,\n });\n\n const fetchThresholdValues = (filters: Filters) => {\n fetch(getUrlWithFilters('/api/threshold/estimate/', filters))\n .then((response) => {\n if (!response.ok) {\n throw new Error();\n }\n return response.json() as Promise;\n })\n .then((data) => {\n setPaceFilter({\n medianPace: parseFloat(data.medianPace.replace(':', '.')),\n minPace: parseFloat(data.minPace.replace(':', '.')),\n maxPace: parseFloat(data.maxPace.replace(':', '.')),\n });\n })\n .catch(() => {});\n };\n\n useEffect(() => {\n const items = new Map();\n\n items.set('type', typeFilter);\n items.set('duration', durationFilter);\n\n if (durationFilter === 'Year') {\n items.set('year', yearFilter);\n }\n\n if (\n durationFilter === 'LastYear' ||\n durationFilter === 'Last3Years' ||\n durationFilter === 'Year'\n ) {\n items.set('groupKey', groupKeyFilter);\n }\n\n if (durationFilter === 'Custom') {\n if (!startDateFilter || !endDateFilter) {\n return;\n }\n\n items.set('startDate', getUrlDateString(startDateFilter));\n items.set('endDate', getUrlDateString(endDateFilter));\n items.set('groupKey', groupKeyFilter);\n }\n\n if (disableDataTypeFilter !== true) {\n items.set('dataType', dataTypeFilter);\n\n if (dataTypeFilter === 'Threshold') {\n if (paceFilter.minPace !== undefined) {\n items.set('minPace', paceFilter.minPace);\n }\n if (paceFilter.maxPace !== undefined) {\n items.set('maxPace', paceFilter.maxPace);\n }\n\n if (\n paceFilter.minPace === undefined &&\n paceFilter.maxPace === undefined\n ) {\n fetchThresholdValues(items);\n return;\n }\n }\n }\n\n onChange(items);\n updateBrowserUrl(items);\n }, [\n typeFilter,\n durationFilter,\n yearFilter,\n dataTypeFilter,\n paceFilter,\n startDateFilter,\n endDateFilter,\n groupKeyFilter,\n onChange,\n disableDataTypeFilter,\n ]);\n\n return (\n \n {\n setTypeFilter(v.currentTarget.value);\n }}\n >\n \n \n \n \n \n \n \n \n {\n setDurationFilter(v.currentTarget.value);\n }}\n style={durationFilter === 'Year' ? { marginRight: '5px' } : {}}\n >\n \n \n \n \n \n \n {durationFilter === 'Year' && (\n {\n setYearFilter(parseInt(v.currentTarget.value, 10));\n }}\n >\n {new Array(10).fill(0).map((_, index) => {\n const yearOption = new Date().getFullYear() - index;\n return (\n \n );\n })}\n \n )}\n {durationFilter === 'Custom' && (\n {\n setStartDateFilter(start);\n setEndDateFilter(end);\n }}\n isLoading={isLoading}\n />\n )}\n {(durationFilter === 'Year' ||\n durationFilter === 'Custom' ||\n durationFilter === 'LastYear' ||\n durationFilter === 'Last3Years') && (\n {\n setGroupKeyFilter(v.currentTarget.value);\n }}\n >\n \n \n \n \n )}\n {disableDataTypeFilter !== true && (\n <>\n {\n setDataTypeFilter(v.currentTarget.value);\n }}\n style={\n dataTypeFilter === 'Threshold'\n ? { marginRight: '5px' }\n : {}\n }\n >\n \n \n \n \n {dataTypeFilter === 'Threshold' && (\n <>\n {\n const pace =\n v.currentTarget.value.length > 0\n ? parseFloat(\n v.currentTarget.value\n .replace(',', '.')\n .replace(':', '.')\n )\n : undefined;\n setPaceFilter({\n medianPace: paceFilter.medianPace,\n maxPace: paceFilter.maxPace,\n minPace: pace,\n });\n }}\n />\n {\n const pace =\n v.currentTarget.value.length > 0\n ? parseFloat(\n v.currentTarget.value\n .replace(',', '.')\n .replace(':', '.')\n )\n : undefined;\n setPaceFilter({\n medianPace: paceFilter.medianPace,\n maxPace: pace,\n minPace: paceFilter.minPace,\n });\n }}\n />\n {paceFilter.minPace &&\n paceFilter.maxPace &&\n paceFilter.minPace <= paceFilter.maxPace && (\n \n Min/max pace is in wrong order.\n \n )}\n {paceFilter.medianPace && (\n \n Estimated threshold pace:{' '}\n {paceFilter.medianPace}\n \n )}\n {\n setPaceFilter({\n medianPace: undefined,\n maxPace: undefined,\n minPace: undefined,\n });\n }}\n >\n re-calculate\n \n \n )}\n \n )}\n \n );\n};\n\nexport default ActivityFilter;\n","import React, { useState, useEffect } from 'react';\nimport '../../../node_modules/react-vis/dist/style.css';\nimport { TableContainer } from '../../styles/styles';\nimport Loader, { LoadingStatus } from '../utils/Loader';\nimport ActivityFilter, {\n getUrlWithFilters,\n Filters,\n} from '../utils/ActivityFilter';\nimport { EmptyThead, Table } from '../utils/Table';\nimport ActivityTr, { Activity } from '../utils/ActivityTr';\nimport ValueTh from '../utils/ValueTh';\n\ninterface ActivityResponse {\n activities: ActivityGroup[];\n}\n\ninterface ActivityGroup {\n name: string;\n items: Activity[];\n}\n\nconst ActivitiesPage: React.FC = () => {\n const [loadingStatus, setLoadingStatus] = useState(LoadingStatus.None);\n const [filters, setFilters] = useState();\n const [activities, setActivities] = useState();\n\n useEffect(() => {\n if (filters === undefined) {\n return;\n }\n\n setLoadingStatus(LoadingStatus.Loading);\n\n fetch(getUrlWithFilters('/api/activities/', filters))\n .then((response) => {\n if (!response.ok) {\n throw new Error();\n }\n return response.json() as Promise;\n })\n .then((data) => {\n setActivities(data.activities);\n setLoadingStatus(LoadingStatus.None);\n })\n .catch(() => {\n setActivities([]);\n setLoadingStatus(LoadingStatus.Error);\n });\n }, [filters]);\n\n // Average pace will show min/500m if showing only rowing activities, and min/km\n // otherwise (including if filter is set to “all”, no matter what kinds of\n // activities are actually visible).\n const activityType =\n filters === undefined ? '' : ((filters.get('type') ?? 'All') as string);\n\n const showLactate =\n (activities &&\n activities.filter(\n (group) =>\n group.items?.filter((activity) => activity.lactate).length >\n 0 || false\n ).length > 0) === true;\n\n const showFeeling =\n (activities &&\n activities.filter(\n (group) =>\n group.items?.filter((activity) => activity.feeling).length >\n 0 || false\n ).length > 0) === true;\n\n const numberOfColumns = 6 + (showFeeling ? 1 : 0) + (showLactate ? 1 : 0);\n\n return (\n
\n \n \n {loadingStatus === LoadingStatus.None && activities && (\n
\n \n \n {activities?.map((group) => (\n \n {group.items.length > 0 && (\n \n \n \n \n item.distance\n }\n title=\"Distance\"\n />\n \n item.elapsedTime\n }\n title=\"Time\"\n />\n \n item.pace\n }\n activityType={activityType}\n title=\"Pace\"\n />\n \n item.heartrate\n }\n title=\"Heartrate\"\n />\n {showLactate && (\n \n item.lactate\n }\n title=\"Lactate\"\n />\n )}\n {showFeeling && (\n \n )}\n \n \n )}\n {group.items.length === 0 && (\n \n \n \n {group.name}\n \n \n \n )}\n \n {group.items.map((activity) => (\n \n ))}\n \n \n ))}\n
\n {group.name}\n \n    \n
\n
\n
\n )}\n
\n );\n};\n\nexport default ActivitiesPage;\n","import React, { useState, useEffect } from 'react';\nimport '../../../node_modules/react-vis/dist/style.css';\nimport { useParams } from 'react-router';\nimport { TableContainer } from '../../styles/styles';\nimport Loader, { LoadingStatus } from '../utils/Loader';\nimport { EmptyThead, Table } from '../utils/Table';\nimport ActivityTr, { Activity } from '../utils/ActivityTr';\nimport ValueTh from '../utils/ValueTh';\n\ninterface SimilarResponse {\n activities: ActivityGroup[];\n}\n\ninterface ActivityGroup {\n name: string;\n items: Activity[];\n}\n\nconst SimiliarActivitiesPage: React.FC = () => {\n const [loadingStatus, setLoadingStatus] = useState(LoadingStatus.None);\n const [activities, setActivities] = useState();\n\n const { id } = useParams<{ id: string | undefined }>();\n\n useEffect(() => {\n if (activities !== undefined) {\n return;\n }\n\n setLoadingStatus(LoadingStatus.Loading);\n\n fetch(`/api/activities/${id}/similar`)\n .then((response) => {\n if (!response.ok) {\n throw new Error();\n }\n return response.json() as Promise;\n })\n .then((data) => {\n setActivities(data.activities);\n setLoadingStatus(LoadingStatus.None);\n })\n .catch(() => {\n setActivities([]);\n setLoadingStatus(LoadingStatus.Error);\n });\n }, [activities, id]);\n\n const showLactate =\n (activities &&\n activities.filter(\n (group) =>\n group.items?.filter((activity) => activity.lactate).length >\n 0 || false\n ).length > 0) === true;\n\n const showFeeling =\n (activities &&\n activities.filter((group) =>\n group.items?.filter((activity) => activity.feeling != null)\n ).length > 0) === true;\n\n const numberOfColumns = 7 + (showFeeling ? 1 : 0) + (showLactate ? 1 : 0);\n\n return (\n
\n \n {loadingStatus === LoadingStatus.None && activities && (\n
\n \n \n {activities?.map((group) => (\n \n {group.items.length > 0 && (\n \n \n \n \n item.laps\n }\n title=\"Laps\"\n />\n \n item.distance\n }\n title=\"Distance\"\n />\n \n item.elapsedTime\n }\n title=\"Time\"\n />\n \n item.pace\n }\n title=\"Pace\"\n />\n \n item.heartrate\n }\n title=\"Heartrate\"\n />\n {showLactate && (\n \n item.lactate\n }\n title=\"Lactate\"\n />\n )}\n {showFeeling && (\n \n )}\n \n \n )}\n {group.items.length === 0 && (\n \n \n \n {group.name}\n \n \n \n )}\n \n {group.items.map((activity) => (\n \n ))}\n \n \n ))}\n
\n {group.name}\n \n    \n
\n
\n
\n )}\n
\n );\n};\n\nexport default SimiliarActivitiesPage;\n","import React, { useState, useMemo } from 'react';\nimport {\n CustomSVGSeries,\n Hint,\n LabelSeries,\n LineSeries,\n VerticalRectSeries,\n} from 'react-vis';\nimport styled from 'styled-components';\nimport { getKmString, getPaceString, getTimeString } from '../utils/Formatters';\nimport Chart, { AxisTypes, DynamicChartData } from '../charts/Chart';\n\nconst IntervalPaceContainer = styled.div`\n margin-top: 20px;\n font-size: 10px;\n margin-bottom: -10px;\n`;\n\nexport interface Lap {\n averageCadence: number;\n averageHeartrate: number;\n averageSpeed: number;\n distance: number;\n elapsedTime: number;\n endIndex: number;\n id: number;\n isInterval: boolean;\n lactate: number;\n lapIndex: number;\n maxHeartrate: number;\n maxSpeed: number;\n movingTime: number;\n name: string;\n originalDistance?: number;\n paceZone: number;\n resourceState: number;\n split: number;\n startDate: Date;\n startDateLocal: Date;\n startIndex: number;\n totalElevationGain: number;\n}\n\nconst isPauseLap = (index: number, laps: Lap[]) => {\n // If we run less than 500m before or after an interval lap we define it as a pause lap.\n if (\n ((index > 0 && laps[index - 1].isInterval) ||\n (index < laps.length - 1 && laps[index + 1].isInterval)) &&\n laps[index].distance < 500\n ) {\n return true;\n }\n\n return false;\n};\n\nfunction NormalizeChartData(\n data: T[],\n minValue?: number | undefined,\n maxValue?: number | undefined\n) {\n if (data.length === 0) {\n return [];\n }\n\n const sortedData = [...data].sort((a, b) => a.y - b.y);\n const min = minValue\n ? Math.min(minValue, sortedData[0].y)\n : sortedData[0].y;\n const max = maxValue\n ? Math.max(maxValue, sortedData[sortedData.length - 1].y)\n : sortedData[sortedData.length - 1].y;\n\n return data.map((item) => ({\n ...item,\n y: (item.y - min) / (max - min),\n }));\n}\n\ninterface BasicChart {\n x: number;\n y: number;\n}\n\ninterface ChartLap extends BasicChart {\n lap: Lap;\n x0: number;\n y0: number;\n yHeartrate: number;\n label: string;\n hint: string;\n color: number;\n}\n\ninterface HeartRateChartLap extends BasicChart {\n yOffset: number;\n label: string;\n}\n\nconst LapsChart: React.FC<{\n laps: Lap[];\n activityType: string;\n averageIntervalPace: number | undefined;\n last60DaysIntervalPace: number | undefined;\n}> = ({ laps, activityType, averageIntervalPace, last60DaysIntervalPace }) => {\n const [hint, setHint] = useState<{\n value: DynamicChartData;\n owner: string;\n } | null>();\n const speedPadding = 0.1;\n\n const sortedBySpeed = [...laps]\n .filter((lap, lapIndex) => isPauseLap(lapIndex, laps) === false)\n .sort((l1, l2) => l1.averageSpeed - l2.averageSpeed);\n const slowSpeed = sortedBySpeed[0].averageSpeed - speedPadding;\n const fastSpeed =\n sortedBySpeed[sortedBySpeed.length - 1].averageSpeed + speedPadding;\n const minChartHeight = (fastSpeed - slowSpeed) * 0.05;\n\n const chart: {\n laps: ChartLap[];\n heartrateLaps: HeartRateChartLap[];\n totalMovingTime: number;\n barPadding: number;\n } = useMemo(() => {\n const totalMovingTime = laps\n .map((lap) => lap.elapsedTime)\n .reduce((l1, l2) => l1 + l2);\n const barPadding = totalMovingTime * 0.005;\n let currentMovingTime = 0.0;\n\n const chartLaps: ChartLap[] = laps.map((lap, lapIndex) => {\n const averageLapSpeed = isPauseLap(lapIndex, laps)\n ? slowSpeed + minChartHeight\n : lap.averageSpeed;\n const x0 = currentMovingTime;\n const x = x0 + lap.elapsedTime;\n currentMovingTime = x + barPadding;\n\n return {\n lap,\n x0,\n y0: -1,\n x,\n y: averageLapSpeed,\n yHeartrate: lap.averageHeartrate,\n label: isPauseLap(lapIndex, laps)\n ? ''\n : getPaceString(averageLapSpeed, activityType),\n hint: `Pace: ${getPaceString(\n lap.averageSpeed,\n activityType,\n true\n )}\n Heartrate: ${lap.averageHeartrate}\n Distance: ${getKmString(lap.distance)}\n Duration: ${getTimeString(lap.elapsedTime)} (Moving time: ${getTimeString(\n lap.movingTime\n )})\n ${lap.lactate ? `Lactate: ${lap.lactate.toFixed(1)}` : ''}`,\n color: lap.isInterval ? 1 : 0,\n };\n });\n\n const chartLapsHeartrate: HeartRateChartLap[] = chartLaps\n .filter((lap) => lap.lap.isInterval && lap.yHeartrate > 0)\n .map((lap) => ({\n x: lap.x0 + (lap.x - lap.x0) / 2,\n y: lap.yHeartrate,\n yOffset: 8,\n label: `${Math.round(lap.yHeartrate)}`,\n }));\n\n return {\n laps: NormalizeChartData(chartLaps),\n heartrateLaps: NormalizeChartData(chartLapsHeartrate, 150, 190),\n totalMovingTime: currentMovingTime - barPadding,\n barPadding,\n };\n }, [activityType, laps, minChartHeight, slowSpeed]);\n\n const labelData: HeartRateChartLap[] = useMemo(\n () =>\n chart.laps.map((lap) => ({\n x: lap.x0 + (lap.x - lap.x0) / 2,\n y: lap.y,\n yOffset: -4,\n label: lap.label,\n })),\n [chart.laps]\n );\n\n const labelTicksComponent = (lap: ChartLap) => (\n \n {getKmString(lap.lap.distance)}\n \n );\n\n const labelTicks = useMemo(\n () =>\n chart.laps\n .filter(\n (_, index) =>\n !isPauseLap(\n index,\n chart.laps.map((chartLap) => chartLap.lap)\n )\n )\n .map((lap) => ({\n x: lap.x0 + (lap.x - lap.x0) / 2,\n y: 0,\n customComponent: () => labelTicksComponent(lap),\n })),\n [chart.laps]\n );\n\n const averageIntervalPaceData = useMemo(\n () => [\n {\n x: 0,\n y: averageIntervalPace ?? 0,\n customComponent: () => (\n \n ),\n },\n {\n x: 0,\n y: last60DaysIntervalPace ?? 0,\n customComponent: () => (\n \n ),\n },\n ],\n [averageIntervalPace, last60DaysIntervalPace]\n );\n\n return (\n
\n {chart.laps?.length > 1 && (\n \n getPaceString(distancePerSecond, activityType)\n }\n margin={{ bottom: 15 }}\n hideYAxis\n >\n \n setHint({ value, owner: 'pace' })\n }\n onValueMouseOut={() => setHint(null)}\n onValueClick={(value) => {\n window.location.hash = value.x.toString();\n }}\n stroke=\"0\"\n colorRange={['#d6d6d6', '#92b7f8']}\n />\n \n \n \n {false && averageIntervalPace && (\n \n )}\n \n {hint?.value.label != null && hint?.owner === 'pace' && (\n \n \n {hint.value.label}\n
\n \n )}\n \n )}\n {averageIntervalPace && (\n \n \n Average interval pace:{' '}\n \n {getPaceString(\n averageIntervalPace || 0,\n activityType\n )}\n \n \n \n {' '}\n - Last 60 days:{' '}\n \n {getPaceString(\n last60DaysIntervalPace || 0,\n activityType\n )}\n \n \n \n )}\n \n );\n};\n\nexport default LapsChart;\n","import React, { useState, useEffect } from 'react';\nimport { useParams } from 'react-router';\nimport styled from 'styled-components';\nimport { Link } from 'react-router-dom';\nimport { Box, Container } from '../../styles/styles';\nimport Loader, { LoadingStatus } from '../utils/Loader';\nimport {\n getDateString,\n getFeelingTitle,\n getKmString,\n getPaceString,\n getTimeString,\n} from '../utils/Formatters';\nimport LapsChart, { Lap } from './LapsChart';\n\nconst ActionButton = styled.a`\n padding: 13px 15px;\n background-color: #005dff;\n margin-right: 10px;\n text-decoration: none;\n font-weight: 500;\n cursor: pointer;\n color: white;\n display: inline-block;\n margin-bottom: 10px;\n line-height: 1;\n`;\n\nconst ScrollableBox = styled(Box)`\n @media (max-width: 768px) {\n overflow-x: auto;\n padding: 0;\n\n > * {\n min-width: 700px;\n padding: 20px;\n }\n }\n`;\n\nconst ActionButtonNav = styled(Link)`\n padding: 13px 15px;\n background-color: #005dff;\n margin-right: 10px;\n text-decoration: none;\n font-weight: 500;\n cursor: pointer;\n color: white;\n display: inline-block;\n margin-bottom: 10px;\n line-height: 1;\n`;\n\nconst Heading = styled.h2`\n font-size: 40px;\n font-weight: normal;\n line-height: 1.2;\n margin: 0;\n margin-top: 40px;\n\n @media (max-width: 768px) {\n margin-top: 20px;\n font-size: 30px;\n }\n`;\n\nconst Description = styled.p`\n white-space: pre-line;\n`;\n\ninterface Split {\n averageGradeAdjustedSpeed: number;\n averageHeartrate: number;\n averageSpeed: number;\n distance: number;\n elapsedTime: number;\n elevationDifference: number;\n movingTime: number;\n paceZone: number;\n split: number;\n}\n\nenum WorkoutType {\n Default = 0,\n Race = 1,\n Long = 2,\n Workout = 3,\n BikeRace = 11,\n}\n\ninterface ActivityResponse {\n activity: DetailedActivity;\n averageIntervalPace: number;\n last60DaysIntervalPace: number;\n}\n\ninterface DetailedActivity {\n achievementCount: number;\n athleteCount: number;\n averageCadence: number;\n averageHeartrate: number;\n averageSpeed: number;\n calories: number;\n commentCount: number;\n commute: boolean;\n description: string;\n deviceName: string;\n distance: number;\n elapsedTime: number;\n elevHigh: number;\n elevLow: number;\n endLatlng: number[];\n feeling?: number;\n flagged: boolean;\n gear: {\n id: string;\n primary: boolean;\n name: string;\n resourceState: number;\n distance: number;\n };\n gearId: string;\n hasHeartrate: boolean;\n id: number;\n isBislettInterval: boolean;\n lactate?: number;\n laps: Lap[];\n manual: boolean;\n map: {\n id: string;\n polyline: string;\n resourceState: number;\n summaryPolyline: string;\n };\n maxHeartrate: number;\n maxSpeed: number;\n maxWatts: number;\n movingTime: number;\n name: string;\n perceivedExertion?: unknown;\n photoCount: number;\n photos: { primary: unknown; count: number };\n prCount: number;\n preferPerceivedExertion: boolean;\n private: boolean;\n resourceState: number;\n segmentEfforts: unknown[];\n similarActivities: unknown;\n splitsMetric: Split[];\n splitsStandard: Split[];\n startDate: string;\n startDateLocal: string;\n startLatlng: number[];\n sufferScore: number;\n ignoreIntervals: boolean;\n timezone: string;\n totalElevationGain: number;\n totalPhotoCount: number;\n trainer: boolean;\n type: string; // eg Run\n uploadId: number;\n uploadIdStr: string;\n utcOffset: number;\n visibility: string;\n workoutType?: WorkoutType;\n}\n\nconst ActivityDetailsPage: React.FC = () => {\n const [loadingStatus, setLoadingStatus] = useState(LoadingStatus.None);\n const [activity, setActivity] = useState();\n const [averageIntervalPace, setAverageIntervalPace] = useState();\n const [\n last60DaysIntervalPace,\n setLast60DaysIntervalPace,\n ] = useState();\n const { id } = useParams<{ id: string | undefined }>();\n const hasIntervals =\n activity?.laps != null &&\n activity.laps.filter((lap) => lap.isInterval).length > 0;\n const bislettIntervals =\n (activity?.laps === null || !activity?.isBislettInterval) ?\n [] : activity.laps.filter((lap) => lap.isInterval).map((lap) => (lap.originalDistance ?? lap.distance));\n\n useEffect(() => {\n if (activity !== undefined) {\n return;\n }\n\n setLoadingStatus(LoadingStatus.Loading);\n\n fetch(`/api/activities/${id}`)\n .then((response) => response.json() as Promise)\n .then((data) => {\n setActivity(data.activity);\n setAverageIntervalPace(data.averageIntervalPace);\n setLast60DaysIntervalPace(data.last60DaysIntervalPace);\n setLoadingStatus(LoadingStatus.None);\n })\n .catch(() => {\n setActivity(undefined);\n setLoadingStatus(LoadingStatus.Error);\n });\n }, [activity, id]);\n\n const reimport = () => {\n fetch(`/api/activities/${id}/reimport`, { method: 'POST' })\n .then(() => {\n setActivity(undefined);\n setLoadingStatus(LoadingStatus.None);\n })\n .catch(() => {\n setActivity(undefined);\n setLoadingStatus(LoadingStatus.Error);\n });\n };\n\n const toggleIgnoreIntervals = () => {\n fetch(`/api/activities/${id}/toggleIgnoreIntervals`, { method: 'POST' })\n .then(() => {\n setActivity(undefined);\n setLoadingStatus(LoadingStatus.None);\n })\n .catch(() => {\n setActivity(undefined);\n setLoadingStatus(LoadingStatus.Error);\n });\n };\n\n return (\n <>\n \n {loadingStatus === LoadingStatus.None && activity && (\n \n {activity.name}\n {activity.description}\n
    \n
  • \n Type: {activity.type}{' '}\n {activity.workoutType &&\n `(${WorkoutType[activity.workoutType]})`}\n
  • \n
  • \n Date:{' '}\n {getDateString(activity.startDate)}\n
  • \n {activity.distance > 0 && (\n
  • \n Distance:{' '}\n {getKmString(activity.distance)}\n
  • \n )}\n
  • \n Time:{' '}\n {getTimeString(activity.elapsedTime)} (elapsed),{' '}\n {getTimeString(activity.movingTime)} (moving)\n
  • \n {activity.averageSpeed > 0 && (\n
  • \n Pace:{' '}\n {getPaceString(\n activity.averageSpeed,\n activity.type\n )}{' '}\n (avg),\n {getPaceString(\n activity.maxSpeed,\n activity.type\n )}{' '}\n (max)\n
  • \n )}\n {activity.hasHeartrate && (\n
  • \n Heartrate:{' '}\n {activity.averageHeartrate} (avg),{' '}\n {activity.maxHeartrate} (max)\n
  • \n )}\n {activity.feeling && (\n
  • \n Feeling:{' '}\n {getFeelingTitle(activity.feeling)}\n
  • \n )}\n
\n\n {activity.laps && activity.laps.length > 1 && (\n \n \n \n )}\n\n

Random info

\n
    \n
  • \n Achievement count:{' '}\n {activity.achievementCount}\n
  • \n
  • \n Sweated with:{' '}\n {activity.athleteCount - 1} others\n
  • \n
  • \n Average cadence:{' '}\n {activity.averageCadence * 2}\n
  • \n
  • \n Calories: {activity.calories}\n
  • \n
  • \n Commute:{' '}\n {activity.commute.toString()}\n
  • \n
  • \n Elevation: {activity.elevLow}{' '}\n (low), {activity.elevHigh} (high),{' '}\n {activity.totalElevationGain} (gained)\n
  • \n {activity.gear && (\n
  • \n Gear: {activity.gear.name} (\n {getKmString(activity.gear.distance)})\n
  • \n )}\n
  • \n Manual activity:{' '}\n {activity.manual.toString()}\n
  • \n
  • \n Device: {activity.deviceName}\n
  • \n {activity.maxWatts > 0 && (\n
  • \n Max watts: {activity.maxWatts}\n
  • \n )}\n {activity.perceivedExertion && (\n
  • \n Perceived exertion:{' '}\n {activity.perceivedExertion}\n
  • \n )}\n
  • \n Prs: {activity.prCount}\n
  • \n
  • \n Private:{' '}\n {activity.private.toString()}\n
  • \n
  • \n Suffer score:{' '}\n {activity.sufferScore}\n
  • \n
\n\n

Actions

\n {hasIntervals && (\n <>\n \n View similar intervals\n \n \n Ignore in interval summaries:{' '}\n {activity.ignoreIntervals\n .toString()\n .toUpperCase()}\n \n \n )}\n {bislettIntervals.length > 0 && (\n \n Calibrate footpod\n \n )}\n \n View on Strava\n \n Reimport\n
\n )}\n \n );\n};\n\nexport default ActivityDetailsPage;\n","import React, { useState, useEffect } from 'react';\nimport {\n MarkSeries,\n HexbinSeries,\n LineSeries,\n Hint,\n VerticalBarSeries,\n} from 'react-vis';\nimport '../../../node_modules/react-vis/dist/style.css';\nimport { NavLink } from 'react-router-dom';\nimport Chart, {\n AxisTypes,\n ChartData,\n DynamicChartData,\n NumericChartData,\n getChartData,\n} from '../charts/Chart';\nimport {\n Box,\n SubHeader,\n Table,\n LapsTable,\n Grid,\n LapFactor,\n LapLabel,\n EmptyThead,\n TableContainer,\n NoWrapTd,\n BigScreenTh,\n BigScreenTd,\n} from '../../styles/styles';\nimport Loader, { LoadingStatus } from '../utils/Loader';\nimport {\n AveragePace,\n getKmString,\n getPaceString,\n getTimeString,\n} from '../utils/Formatters';\nimport ActivityFilter, {\n getUrlWithFilters,\n Filters,\n} from '../utils/ActivityFilter';\n\ninterface IntervalsResponse {\n intervals: ActivityMonth[];\n measurements: Measurement[];\n allMeasurements: Measurement[];\n distances: Distance[];\n paces: Pace[];\n}\n\ninterface ActivityMonth {\n date: string;\n activities: Activity[];\n}\n\ninterface Activity {\n id: number;\n date: string;\n name: string;\n type: string;\n description: string;\n interval_AveragePace: string;\n interval_AverageHeartrate: number;\n interval_Laps: IntervalLaps[];\n}\n\ninterface IntervalLaps {\n id: number;\n distance: number;\n elapsedTime: number;\n averageSpeed: number;\n averageHeartrate: number;\n lactate: number;\n distanceFactor: number;\n averageSpeedFactor: number;\n averageHeartrateFactor: number;\n}\n\ninterface Measurement {\n date: string;\n lactate: number;\n}\n\ninterface Distance {\n date: string;\n nonIntervalDistance: number;\n intervalDistance: number;\n}\n\ninterface Pace {\n date: string;\n label: string;\n averageShortPace: number;\n averageMediumPace: number;\n averageLongPace: number;\n}\n\nconst IntervalsPage: React.FC = () => {\n const [loadingStatus, setLoadingStatus] = useState(LoadingStatus.None);\n const [filters, setFilters] = useState();\n const [activities, setActivities] = useState();\n const [lactate, setLactate] = useState();\n const [lactateAll, setLactateAll] = useState();\n const [hint, setHint] = useState<{\n value: DynamicChartData;\n owner: string;\n } | null>();\n const [totalDistances, setTotalDistances] = useState();\n const [intervalDistances, setIntervalDistances] = useState();\n const [shortPaces, setShortPaces] = useState();\n const [mediumPaces, setMediumPaces] = useState();\n const [longPaces, setLongPaces] = useState();\n\n useEffect(() => {\n if (filters === undefined) {\n return;\n }\n\n setLoadingStatus(LoadingStatus.Loading);\n\n fetch(getUrlWithFilters('/api/intervals/', filters))\n .then((response) => response.json() as Promise)\n .then((data) => {\n setActivities(data.intervals);\n\n setLactate(\n getChartData(\n data.measurements,\n (item) => new Date(item.date).getTime(),\n (item) => item.lactate,\n (item) =>\n `${new Date(item.date)\n .toUTCString()\n .substr(8, 8)}: ${item.lactate.toFixed(1)}`\n )\n );\n\n setLactateAll(\n getChartData(\n data.allMeasurements,\n (item) => new Date(item.date).getTime(),\n (item) => item.lactate\n )\n );\n\n setTotalDistances(\n getChartData(\n data.distances,\n (item) => item.date,\n (item) => item.nonIntervalDistance,\n (item) =>\n `${item.date}\\r\\n- Total: ${Math.round(\n item.nonIntervalDistance + item.intervalDistance\n )} km`\n ).reverse()\n );\n\n setIntervalDistances(\n getChartData(\n data.distances,\n (item) => item.date,\n (item) => item.intervalDistance,\n (item) =>\n `${item.date}\\r\\n- Intervals: ${\n item.intervalDistance\n } km (${Math.round(\n (100 /\n (item.nonIntervalDistance +\n item.intervalDistance)) *\n item.intervalDistance\n )} %)`\n ).reverse()\n );\n\n setShortPaces(\n getChartData(\n data.paces,\n (item) => item.date,\n (item) => item.averageShortPace,\n (item) => item.label\n ).reverse()\n );\n\n setMediumPaces(\n getChartData(\n data.paces,\n (item) => item.date,\n (item) => item.averageMediumPace,\n (item) => item.label\n ).reverse()\n );\n\n setLongPaces(\n getChartData(\n data.paces,\n (item) => item.date,\n (item) => item.averageLongPace,\n (item) => item.label\n ).reverse()\n );\n\n setLoadingStatus(LoadingStatus.None);\n })\n .catch(() => {\n setActivities([]);\n setLoadingStatus(LoadingStatus.Error);\n });\n }, [filters]);\n\n return (\n
\n \n \n {loadingStatus === LoadingStatus.None && activities && (\n
\n 0 ? 3 : 2) /\n ((lactate?.length ?? 0) > 12 ? 2 : 1)\n )}\n >\n \n Distance\n {totalDistances && totalDistances.length > 0 && (\n \n \n setHint({\n value,\n owner: 'distance',\n })\n }\n onValueMouseOut={() => setHint(null)}\n onValueClick={(value) => {\n window.location.hash = value.x.toString();\n }}\n />\n \n setHint({\n value,\n owner: 'distance',\n })\n }\n onValueMouseOut={() => setHint(null)}\n onValueClick={(value) => {\n window.location.hash = value.x.toString();\n }}\n />\n {hint?.value.label != null &&\n hint?.owner === 'distance' && (\n \n \n {hint.value.label}\n
\n \n )}\n \n )}\n \n \n Pace\n {shortPaces && filters && shortPaces.length > 0 && (\n // y-axis will show min/500m if showing only rowing activities, and min/km\n // otherwise (including if filter is set to “all”, no matter what kinds of\n // activities are actually visible).\n \n getPaceString(\n distancePerSecond,\n (filters.get('type') ??\n 'All') as string\n )\n }\n >\n (d.y < 3 ? 3 : d.y)}\n barWidth={0.6}\n data={shortPaces}\n fill=\"#d4ce73\"\n stroke=\"0\"\n onValueMouseOver={(value) =>\n setHint({ value, owner: 'pace' })\n }\n onValueMouseOut={() => setHint(null)}\n onValueClick={(value) => {\n window.location.hash = value.x.toString();\n }}\n />\n (d.y < 3 ? 3 : d.y)}\n barWidth={0.9}\n data={mediumPaces}\n fill=\"#448944\"\n stroke=\"0\"\n onValueMouseOver={(value) =>\n setHint({ value, owner: 'pace' })\n }\n onValueMouseOut={() => setHint(null)}\n onValueClick={(value) => {\n window.location.hash = value.x.toString();\n }}\n />\n (d.y < 3 ? 3 : d.y)}\n barWidth={0.55}\n data={longPaces}\n fill=\"#afcbfb\"\n stroke=\"0\"\n onValueMouseOver={(value) =>\n setHint({ value, owner: 'pace' })\n }\n onValueMouseOut={() => setHint(null)}\n onValueClick={(value) => {\n window.location.hash = value.x.toString();\n }}\n />\n {hint?.value.label != null &&\n hint?.owner === 'pace' && (\n \n \n {hint.value.label}\n
\n \n )}\n \n )}\n \n {lactate && lactate.length > 0 && (\n \n Lactate\n \n \n \n \n setHint({ value, owner: 'lactate' })\n }\n onValueMouseOut={() => setHint(null)}\n />\n {hint?.value.label != null &&\n hint?.owner === 'lactate' && (\n \n \n {hint.value.label}\n \n \n )}\n \n \n )}\n \n \n \n {activities?.map((month) => (\n \n {month.activities.length > 0 && (\n \n \n \n Pace\n \n \n \n )}\n {month.activities.length === 0 && (\n \n \n \n \n \n )}\n \n {month.activities.map((activity) => (\n \n \n \n {activity.date}\n \n \n \n {activity.name}\n \n \n \n {activity.description}\n \n \n \n {\n activity.interval_AveragePace\n }\n \n \n \n \n \n \n \n \n \n {getTimeString(\n activity.interval_Laps\n .map(\n (\n lap\n ) =>\n lap.elapsedTime\n )\n .reduce(\n (\n sum,\n value\n ) =>\n sum +\n value\n )\n )}\n \n \n \n \n {activity.interval_Laps.map(\n (lap) => (\n \n \n \n {getKmString(\n lap.distance\n )}\n \n \n \n \n \n {getPaceString(\n lap.averageSpeed,\n activity.type\n )}\n \n \n \n \n \n {\n lap.averageHeartrate\n }{' '}\n bpm\n \n \n \n \n \n {lap.lactate &&\n `(${lap.lactate.toFixed(1)})`}{' '}\n {getTimeString(\n lap.elapsedTime\n )}\n \n \n \n )\n )}\n \n \n \n \n ))}\n \n \n ))}\n
\n {month.date}\n Laps
\n {month.date} (0 activities)\n
\n {getKmString(\n activity.interval_Laps\n .map(\n (\n lap\n ) =>\n lap.distance\n )\n .reduce(\n (\n sum,\n value\n ) =>\n sum +\n value\n )\n )}\n \n {getPaceString(\n AveragePace(\n activity.interval_Laps,\n (\n item\n ) =>\n item.elapsedTime,\n (\n item\n ) =>\n item.averageSpeed\n ) || 0,\n activity.type\n )}\n \n {Math.round(\n activity.interval_Laps\n .map(\n (\n lap\n ) =>\n lap.averageHeartrate\n )\n .reduce(\n (\n sum,\n value\n ) =>\n sum +\n value\n ) /\n activity\n .interval_Laps\n .length\n )}{' '}\n bpm\n
\n
\n \n )}\n \n );\n};\n\nexport default IntervalsPage;\n","import React, { useState, useEffect } from 'react';\nimport { NavLink } from 'react-router-dom';\nimport { NoWrapTd, Table, TableContainer } from '../../styles/styles';\nimport {\n getDateString,\n getKmString,\n getPaceString,\n getTimeString,\n} from '../utils/Formatters';\nimport Loader, { LoadingStatus } from '../utils/Loader';\n\ninterface Activity {\n id: number;\n name: string;\n type: string;\n movingTime: number;\n startDate: string;\n distance: number;\n averageSpeed: number;\n}\n\nconst RacesPage: React.FC = () => {\n const [loadingStatus, setLoadingStatus] = useState(LoadingStatus.None);\n const [activities, setActivities] = useState();\n\n useEffect(() => {\n if (activities != null) {\n return;\n }\n\n setLoadingStatus(LoadingStatus.Loading);\n\n fetch('/api/races/')\n .then((response) => response.json() as Promise)\n .then((data) => {\n setActivities(data);\n setLoadingStatus(LoadingStatus.None);\n })\n .catch(() => {\n setActivities([]);\n setLoadingStatus(LoadingStatus.Error);\n });\n }, [activities]);\n\n return (\n <>\n \n {loadingStatus === LoadingStatus.None && activities && (\n \n \n \n \n \n \n \n \n \n \n \n \n {activities?.map((activity) => (\n \n \n \n {getKmString(activity.distance)}\n \n \n {getPaceString(\n activity.averageSpeed,\n activity.type\n )}\n \n \n {getTimeString(activity.movingTime)}\n \n \n {getDateString(activity.startDate)}\n \n \n ))}\n \n
NameDistanceSpeedTimeDate
\n
\n \n {activity.name}\n \n
\n
\n
\n )}\n \n );\n};\n\nexport default RacesPage;\n","import React from 'react';\n\nexport interface User {\n athleteId: number;\n fullName: string;\n profileImageUrl: string;\n}\n\nexport const UserContext = React.createContext(\n undefined\n);\n","export default __webpack_public_path__ + \"static/media/markus_ser_viktig_ut.235c1af3.jpg\";","import React from 'react';\nimport styled from 'styled-components';\nimport { Droplet, Pulse, Run } from 'styled-icons/boxicons-regular';\nimport foto from '../../assets/markus_ser_viktig_ut.jpg';\n\nconst LandingContainer = styled.div`\n max-width: 1400px;\n margin: 0 auto;\n`;\n\nconst BannerWrapper = styled.div`\n width: 100%;\n margin: 100px 0;\n background: #fff;\n border-radius: 10px;\n position: relative;\n display: flex;\n justify-content: space-between;\n align-items: center;\n overflow: hidden;\n\n span {\n font-size: 50px;\n color: #c90000;\n padding-left: 50px;\n }\n\n img {\n display: block;\n height: 200px;\n object-fit: contain;\n }\n\n @media (max-width: 768px) {\n display: block;\n margin: 0;\n border-radius: 0;\n margin-bottom: 50px;\n\n span {\n display: block;\n font-size: 30px;\n line-height: 1.5;\n padding-left: 0;\n padding: 20px;\n text-align: center;\n }\n\n img {\n width: 100%;\n }\n }\n`;\n\nconst ContentWrapper = styled.div`\n width: 100%;\n display: flex;\n flex-wrap: wrap;\n justify-content: space-evenly;\n\n svg {\n width: 100px;\n margin: 0 auto;\n display: block;\n }\n`;\n\nconst BoxWrapper = styled.div`\n padding: 10px;\n max-width: 400px;\n font-size: 20px;\n line-height: 1.5;\n`;\n\nconst BoxText = styled.p`\n text-align: center;\n margin-bottom: 20px;\n margin-top: 5px;\n`;\n\nconst LandingPage: React.FC<{ children?: React.ReactNode }> = () => (\n \n \n “All you need is red cells”\n \"Markus\n \n \n \n \n \n Prinsippet bak vår trening er å bygge aerob kapasitet, som\n er den viktigste faktoren i langdistanseløping\n \n \n \n \n \n Treningen intensitetsstyres med å måle laktat, et direkte\n mål på anaerob energiforbruk\n \n \n \n \n \n Terskelintervaller gir mulighet for et stort volum på\n relativt høy intensitet, og stimulerer effektivt den aerobe\n kapasiteten\n \n \n \n \n);\n\nexport default LandingPage;\n","import React, { useState, useEffect } from 'react';\nimport { NavLink } from 'react-router-dom';\nimport styled from 'styled-components';\nimport { round } from './utils/Formatters';\nimport { UserContext, User } from './utils/UserContext';\nimport LandingPage from './landing/LandingPage';\n\nconst LayoutContainer = styled.div`\n margin: 0 auto;\n max-width: 1400px;\n padding-top: 20px;\n\n @media (max-width: 1440px) {\n padding: 20px 20px 0 20px;\n }\n\n @media (max-width: 768px) {\n padding: 10px 10px 0 10px;\n }\n`;\n\nconst MenuWrapper = styled.div`\n background: #c90000;\n overflow: auto;\n white-space: nowrap;\n`;\n\nconst MenuContainer = styled.div`\n margin: 0 auto;\n max-width: 1400px;\n`;\n\nconst LinkContainer = styled.ul`\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex: 1 1 auto;\n height: 64px;\n line-height: 64px;\n\n @media (max-width: 768px) {\n height: 50px;\n line-height: 50px;\n }\n\n li {\n a {\n transition: background-color 0.3s;\n font-size: inherit;\n color: #fff;\n display: block;\n padding: 0 20px;\n text-decoration: none;\n\n @media (max-width: 768px) {\n padding: 0 10px;\n }\n }\n a:hover,\n .navLink-active {\n background-color: rgba(0, 0, 0, 0.1);\n }\n }\n`;\n\nconst CenterContainer = styled.div`\n height: 80vh;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n`;\n\nconst SyncPercentage = styled.span`\n font-weight: bold;\n`;\n\nconst ProfileImage = styled.img`\n height: 48px;\n vertical-align: middle;\n border-radius: 99px;\n\n @media (max-width: 768px) {\n display: none;\n }\n`;\n\nconst checkProgress = (\n setSyncProgress: (value: number) => void,\n setUser: (value: User | null | undefined) => void\n) => {\n fetch('/api/Sync/')\n .then((response) => {\n if (response.status === 401) {\n setUser(null);\n return null;\n }\n\n return response.json() as Promise<{ progress: number }>;\n })\n .then((data) => {\n if (data) {\n setSyncProgress(data.progress);\n\n if (data.progress < 1) {\n setTimeout(\n () => checkProgress(setSyncProgress, setUser),\n 10000\n );\n }\n }\n })\n .catch(() =>\n setTimeout(() => checkProgress(setSyncProgress, setUser), 10000)\n );\n};\n\nconst Layout: React.FC<{ children: React.ReactNode }> = ({ children }) => {\n const [user, setUser] = useState(undefined);\n const [syncProgress, setSyncProgress] = useState(0);\n\n useEffect(() => {\n if (user) {\n return;\n }\n\n fetch('/api/Authentication/user/')\n .then((response) => response.json() as Promise)\n .then((data) => {\n setUser(data);\n checkProgress(setSyncProgress, setUser);\n })\n .catch(() => setUser(null));\n });\n\n return (\n \n \n \n \n
  • \n \n Home\n \n
  • \n {user && (\n <>\n
  • \n \n Activities\n \n
  • \n
  • \n \n Progress\n \n
  • \n
  • \n \n Intervals (Beta)\n \n
  • \n
  • \n \n Wiki/FAQ\n \n
  • \n \n )}\n
    \n \n {user && (\n <>\n
  • \n \n
  • \n
  • \n Sign out\n
  • \n \n )}\n {!user && (\n
  • \n Sign in\n
  • \n )}\n
    \n
    \n
    \n {user ? (\n \n {user && syncProgress >= 1.0 &&
    {children}
    }\n {user && syncProgress < 1.0 && (\n \n

    Loading your activities

    \n {syncProgress > 0.0 && (\n
    \n \n {round(syncProgress * 100, 0)} %\n \n
    \n )}\n {syncProgress === 0.0 && (\n
    \n Progress:{' '}\n \n {round(syncProgress * 100, 0)} %\n {' '}\n (Waiting for available slot)\n
    \n )}\n
    \n )}\n
    \n ) : (\n \n )}\n
    \n );\n};\n\nexport default Layout;\n","import React, { useState, useEffect } from 'react';\nimport '../../../node_modules/react-vis/dist/style.css';\nimport { TableContainer } from '../../styles/styles';\nimport Loader, { LoadingStatus } from '../utils/Loader';\nimport { FixedWidthTable } from '../utils/Table';\nimport ActivityFilter, {\n getUrlWithFilters,\n Filters,\n} from '../utils/ActivityFilter';\nimport ValueTd from '../utils/ValueTd';\nimport ValueTh from '../utils/ValueTh';\nimport { ItemValue, ResultItem } from '../models/ResultItem';\n\nexport interface ProgressResultItem extends ResultItem {\n name: string;\n activityCount: ItemValue;\n distance: ItemValue;\n elapsedTime: ItemValue;\n pace: ItemValue;\n heartrate: ItemValue;\n lactate: ItemValue;\n}\n\nconst ProgressPage: React.FC = () => {\n const [loadingStatus, setLoadingStatus] = useState(LoadingStatus.None);\n const [filters, setFilters] = useState();\n const [progress, setProgress] = useState();\n\n useEffect(() => {\n if (filters === undefined) {\n return;\n }\n\n setLoadingStatus(LoadingStatus.Loading);\n\n fetch(getUrlWithFilters('/api/progress/', filters))\n .then((response) => {\n if (!response.ok) {\n throw new Error();\n }\n return response.json() as Promise;\n })\n .then((data) => {\n setProgress(data);\n setLoadingStatus(LoadingStatus.None);\n })\n .catch(() => {\n setProgress([]);\n setLoadingStatus(LoadingStatus.Error);\n });\n }, [filters]);\n\n const showLactate =\n progress &&\n (progress.filter((item) => item.lactate).length > 0 || false) === true;\n\n return (\n
    \n \n \n {loadingStatus === LoadingStatus.None &&\n progress &&\n progress.length > 0 && (\n \n \n \n \n  \n item.activityCount}\n />\n item.distance}\n />\n item.elapsedTime}\n />\n item.pace}\n />\n item.heartrate}\n />\n {showLactate && (\n item.lactate}\n />\n )}\n \n \n \n {progress.map((item) => (\n \n {item.name}\n \n \n \n \n \n {showLactate && (\n \n )}\n \n ))}\n \n \n \n )}\n
    \n );\n};\n\nexport default ProgressPage;\n","import React, { useState, useEffect } from 'react';\nimport queryString from 'query-string';\nimport '../../../node_modules/react-vis/dist/style.css';\nimport { AutoSizer } from 'react-virtualized';\nimport {\n ChartLabel,\n HexbinSeries,\n HorizontalGridLines,\n VerticalGridLines,\n XAxis,\n XYPlot,\n YAxis,\n} from 'react-vis';\nimport Loader, { LoadingStatus } from '../utils/Loader';\nimport ActivityFilter, {\n getUrlWithFilters,\n Filters,\n} from '../utils/ActivityFilter';\nimport { Box, Dropdown, StackContainer } from '../../styles/styles';\nimport { getPaceString } from '../utils/Formatters';\n\ninterface Item {\n distance: number;\n elapsedTime: number;\n movingTime: number;\n pace: number;\n averageHeartrate: number;\n maxHeartrate: number;\n}\n\ninterface Axis {\n format: ((value: number) => string) | undefined;\n min: number | undefined;\n max: number | undefined;\n}\n\nconst getAxisSettings = (key: string, lockAxisFilter: boolean): Axis => {\n if (key === 'pace') {\n // TODO: If this page is ever made public, apply the same logic with\n // propagating the activity type from the filter as in the other pages.\n return {\n format: (value: number) => getPaceString(value, ''),\n min: lockAxisFilter ? 3.7 : undefined,\n max: lockAxisFilter ? 5.5 : undefined,\n };\n }\n if (key === 'averageHeartrate' || key === 'maxHeartrate') {\n return {\n format: undefined,\n min: 100,\n max: 190,\n };\n }\n\n return {\n format: undefined,\n min: undefined,\n max: undefined,\n };\n};\n\nconst defaultYAxis: keyof Item = 'averageHeartrate';\nconst defaultXAxis: keyof Item = 'pace';\n\nconst ScatterPage: React.FC = () => {\n const { yAxis, xAxis } = queryString.parse(window.location.search) as {\n yAxis: keyof Item;\n xAxis: keyof Item;\n };\n const [loadingStatus, setLoadingStatus] = useState(LoadingStatus.None);\n const [filters, setFilters] = useState();\n const [items, setItems] = useState();\n const [yAxisFilter, setYAxisFilter] = useState(\n typeof yAxis === 'string' ? yAxis : defaultYAxis\n );\n const [xAxisFilter, setXAxisFilter] = useState(\n typeof xAxis === 'string' ? xAxis : defaultXAxis\n );\n const [lockAxisFilter] = useState(false);\n\n useEffect(() => {\n if (filters === undefined) {\n return;\n }\n\n setLoadingStatus(LoadingStatus.Loading);\n\n fetch(getUrlWithFilters('/api/scatter/', filters))\n .then((response) => {\n if (!response.ok) {\n throw new Error();\n }\n return response.json() as Promise;\n })\n .then((data) => {\n setItems(data);\n setLoadingStatus(LoadingStatus.None);\n })\n .catch(() => {\n setItems([]);\n setLoadingStatus(LoadingStatus.Error);\n });\n }, [filters]);\n\n const data = items?.map((item) => ({\n x: Number(item[xAxisFilter]),\n y: Number(item[yAxisFilter]),\n }));\n\n const yAxisSettings = getAxisSettings(yAxisFilter, lockAxisFilter);\n const xAxisSettings = getAxisSettings(xAxisFilter, lockAxisFilter);\n\n return (\n
    \n \n \n {loadingStatus === LoadingStatus.None && items && (\n
    \n \n {\n setYAxisFilter(\n v.currentTarget.value as keyof Item\n );\n }}\n >\n \n \n \n \n \n \n \n {\n setXAxisFilter(\n v.currentTarget.value as keyof Item\n );\n }}\n >\n \n \n \n \n \n \n \n \n \n \n {(size) => (\n \n \n \n \n \n \n \n\n \n \n )}\n \n \n
    \n )}\n
    \n );\n};\n\nexport default ScatterPage;\n","import { Route } from 'react-router';\nimport HomePage from './components/home/HomePage';\nimport ActivitiesPage from './components/activities/ActivitiesPage';\nimport SimiliarActivitiesPage from './components/activities/SimilarActivitiesPage';\nimport ActivitiesDetailsPage from './components/activityDetails/ActivityDetailsPage';\nimport IntervalsPage from './components/intervals/IntervalsPage';\nimport RacesPage from './components/races/races';\nimport Layout from './components/Layout';\nimport ProgressPage from './components/progress/ProgressPage';\nimport ScatterPage from './components/scatter/ScatterPage';\n\nconst App = () => (\n \n \n \n \n \n \n \n \n \n \n);\n\nexport default App;\n","import * as ReactDOM from 'react-dom';\nimport { BrowserRouter } from 'react-router-dom';\nimport App from './App';\n\nconst baseUrl = document\n .getElementsByTagName('base')[0]\n .getAttribute('href') as string;\nconst rootElement = document.getElementById('root');\n\nReactDOM.render(\n \n \n ,\n rootElement\n);\n"],"sourceRoot":""}