diff --git a/app/client/components/PerformanceDashboard.js b/app/client/components/PerformanceDashboard.js
index e638cb1..b5b4dbe 100644
--- a/app/client/components/PerformanceDashboard.js
+++ b/app/client/components/PerformanceDashboard.js
@@ -28,7 +28,7 @@ export class PerformanceDashboard extends AppElement {
render () {
const metrics = this.calculateFormattedMetrics(this.appState.metrics)
return html`
-
+
diff --git a/app/client/index.js b/app/client/index.js
index 6a13fcf..54c58ae 100644
--- a/app/client/index.js
+++ b/app/client/index.js
@@ -36,7 +36,6 @@ export class App extends LitElement {
})
// notify the app about the triggered action
- // todo: lets see if this solution sticks...
this.addEventListener('triggerAction', (event) => {
this.app.handleAction(event.detail)
})
@@ -51,7 +50,7 @@ export class App extends LitElement {
// return a deep copy of the state to other components to minimize risk of side effects
getState = () => {
- // todo: could use structuredClone once the browser support is wider
+ // could use structuredClone once the browser support is wider
// https://developer.mozilla.org/en-US/docs/Web/API/structuredClone
return JSON.parse(JSON.stringify(this.appState))
}
diff --git a/app/client/lib/app.js b/app/client/lib/app.js
index 6f190f7..68ea480 100644
--- a/app/client/lib/app.js
+++ b/app/client/lib/app.js
@@ -6,6 +6,7 @@
*/
import NoSleep from 'nosleep.js'
+import { filterObjectByKeys } from './helper'
const rowingMetricsFields = ['strokesTotal', 'distanceTotal', 'caloriesTotal', 'power', 'heartrate',
'heartrateBatteryLevel', 'splitFormatted', 'strokesPerMinute', 'durationTotalFormatted']
@@ -42,7 +43,7 @@ export function createApp (app) {
}, 1000)
})
- // todo: we have to use different types of messages to make processing easier
+ // todo: we should use different types of messages to make processing easier
socket.addEventListener('message', (event) => {
try {
const data = JSON.parse(event.data)
@@ -50,15 +51,10 @@ export function createApp (app) {
let activeFields = rowingMetricsFields
// if we are in reset state only update heart rate
if (data.strokesTotal === 0) {
- activeFields = ['heartrate']
+ activeFields = ['heartrate', 'heartrateBatteryLevel']
}
- const filteredData = Object.keys(data)
- .filter(key => activeFields.includes(key))
- .reduce((obj, key) => {
- obj[key] = data[key]
- return obj
- }, {})
+ const filteredData = filterObjectByKeys(data, activeFields)
let updatedState = { ...app.getState(), metrics: filteredData }
if (data.peripheralMode) {
@@ -89,12 +85,7 @@ export function createApp (app) {
function resetFields () {
const appState = app.getState()
// drop all metrics except heartrate
- appState.metrics = Object.keys(appState.metrics)
- .filter(key => key === 'heartrate' || key === 'heartrateBatteryLevel')
- .reduce((obj, key) => {
- obj[key] = appState.metrics[key]
- return obj
- }, {})
+ appState.metrics = filterObjectByKeys(appState.metrics, ['heartrate', 'heartrateBatteryLevel'])
app.updateState(appState)
}
diff --git a/app/client/lib/helper.js b/app/client/lib/helper.js
new file mode 100644
index 0000000..16bae13
--- /dev/null
+++ b/app/client/lib/helper.js
@@ -0,0 +1,16 @@
+'use strict'
+/*
+ Open Rowing Monitor, https://github.com/laberning/openrowingmonitor
+
+ Helper functions
+*/
+
+// Filters an object so that it only contains the attributes that are defined in a list
+export function filterObjectByKeys (object, keys) {
+ return Object.keys(object)
+ .filter(key => keys.includes(key))
+ .reduce((obj, key) => {
+ obj[key] = object[key]
+ return obj
+ }, {})
+}
diff --git a/app/client/lib/network.js b/app/client/lib/network.js
deleted file mode 100644
index bcca50f..0000000
--- a/app/client/lib/network.js
+++ /dev/null
@@ -1,5 +0,0 @@
-'use strict'
-/*
- Open Rowing Monitor, https://github.com/laberning/openrowingmonitor
-
-*/