From e38960ff845bddbd463c43801ad01834f77474f2 Mon Sep 17 00:00:00 2001 From: Iván Ávalos Date: Mon, 17 Jan 2022 02:06:41 -0600 Subject: Implemented timer that fetches units every 10 seconds, and updated map to work with timer --- .../TrackerMap/controllers/UnitsController.kt | 45 +++++++++++++++------- 1 file changed, 31 insertions(+), 14 deletions(-) (limited to 'shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/controllers/UnitsController.kt') diff --git a/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/controllers/UnitsController.kt b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/controllers/UnitsController.kt index 584f656..21692e7 100644 --- a/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/controllers/UnitsController.kt +++ b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/controllers/UnitsController.kt @@ -1,17 +1,23 @@ package mx.trackermap.TrackerMap.controllers +import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.DelicateCoroutinesApi import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.combine +import kotlinx.coroutines.flow.* import kotlinx.coroutines.launch import mx.trackermap.TrackerMap.client.apis.DevicesApi import mx.trackermap.TrackerMap.client.apis.PositionsApi import mx.trackermap.TrackerMap.client.models.Position import mx.trackermap.TrackerMap.client.models.UnitInformation +import mx.trackermap.TrackerMap.utils.Coroutines +import kotlin.time.Duration.Companion.seconds +import kotlin.time.ExperimentalTime @DelicateCoroutinesApi +@ExperimentalTime class UnitsController( private val devicesApi: DevicesApi, private val positionsApi: PositionsApi @@ -23,28 +29,39 @@ class UnitsController( init { GlobalScope.launch { - fetchUnits() + fetchUnits(this) } GlobalScope.launch { setupFlows() } } - private suspend fun fetchUnits() { - val devices = devicesApi.devicesGet() - val positions = positionsApi.positionsGet() - val positionsMap: MutableMap = mutableMapOf() - - positions.forEach { position -> - position.deviceId?.let { - positionsMap[it] = position + private suspend fun fetchUnits(scope: CoroutineScope) { + Coroutines.tickerFlow(10.seconds) + .map { + print("Fetching new positions...\n") + positionsApi.positionsGet() } - } + .distinctUntilChanged { old, new -> + old.contentEquals(new) + } + .onEach { positions -> + print("Position(s) changed! Reloading data...\n") + val devices = devicesApi.devicesGet() + val positionsMap: MutableMap = mutableMapOf() - val units = devices.map { - UnitInformation(it, positionsMap[it.id]) - } - unitsFlow.value = units + positions.forEach { position -> + position.deviceId?.let { + positionsMap[it] = position + } + } + + val units = devices.map { + UnitInformation(it, positionsMap[it.id]) + } + unitsFlow.value = units + } + .launchIn(scope) } fun search(query: String) { -- cgit v1.2.3