diff options
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.kt | 65 |
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 |