aboutsummaryrefslogtreecommitdiff
path: root/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/controllers/UnitsController.kt
diff options
context:
space:
mode:
Diffstat (limited to 'shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/controllers/UnitsController.kt')
-rw-r--r--shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/controllers/UnitsController.kt65
1 files changed, 65 insertions, 0 deletions
diff --git a/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/controllers/UnitsController.kt b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/controllers/UnitsController.kt
new file mode 100644
index 0000000..9c11b79
--- /dev/null
+++ b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/controllers/UnitsController.kt
@@ -0,0 +1,65 @@
+package mx.trackermap.TrackerMap.controllers
+
+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.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
+
+@DelicateCoroutinesApi
+class UnitsController(
+ private val devicesApi: DevicesApi,
+ private val positionsApi: PositionsApi
+) {
+
+ val displayedUnitsFlow = MutableStateFlow<List<UnitInformation>>(emptyList())
+ private val unitsFlow = MutableStateFlow<List<UnitInformation>>(emptyList())
+ private val queryFlow = MutableStateFlow("")
+
+ init {
+ GlobalScope.launch {
+ fetchUnits()
+ }
+ GlobalScope.launch {
+ setupFlows()
+ }
+ }
+
+ suspend fun fetchUnits() {
+ val devices = devicesApi.devicesGet()
+ val positions = positionsApi.positionsGet()
+ val positionsMap: MutableMap<Int, Position> = mutableMapOf()
+
+ positions.forEach { position ->
+ position.deviceId?.let {
+ positionsMap[it] = position
+ }
+ }
+
+ val units = devices.map {
+ UnitInformation(it, positionsMap[it.id])
+ }
+ unitsFlow.value = units
+ }
+
+ fun search(query: String) {
+ queryFlow.value = query
+ }
+
+ suspend fun setupFlows() {
+ unitsFlow.combine(queryFlow) { units, query ->
+ units.filter { unit ->
+ unit.device.name.contains(query) ||
+ unit.device.contact?.contains(query) == true ||
+ unit.position?.address?.contains(query) == true
+ }
+ }.collect { units ->
+ this.displayedUnitsFlow.value = units
+ }
+ }
+} \ No newline at end of file