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 - -*/