diff --git a/app/src/main/java/com/atomicrobot/carbon/ui/lumen/scenes/ScenesScreen.kt b/app/src/main/java/com/atomicrobot/carbon/ui/lumen/scenes/ScenesScreen.kt index bbec013..34f1631 100644 --- a/app/src/main/java/com/atomicrobot/carbon/ui/lumen/scenes/ScenesScreen.kt +++ b/app/src/main/java/com/atomicrobot/carbon/ui/lumen/scenes/ScenesScreen.kt @@ -20,7 +20,6 @@ import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember -import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -33,7 +32,6 @@ import com.atomicrobot.carbon.data.lumen.SceneModel import com.atomicrobot.carbon.data.lumen.dto.LumenScene import com.atomicrobot.carbon.data.lumen.dto.SceneAndRoomName import com.atomicrobot.carbon.ui.lumen.LumenIndeterminateIndicator -import kotlinx.coroutines.launch import org.koin.androidx.compose.koinViewModel @Composable @@ -119,14 +117,13 @@ fun AddSceneTask( viewModel: ScenesViewModel = koinViewModel(), onDismissed: () -> Unit, ) { - val coroutine = rememberCoroutineScope() SceneDetailsList( sceneId = 0L, viewModel = viewModel, newScene = true, onDismissed = onDismissed, ) { - coroutine.launch { viewModel.saveOrUpdateScene(it) } + viewModel.saveOrUpdateScene(it) onDismissed() } } @@ -137,18 +134,17 @@ fun EditSceneTask( viewModel: ScenesViewModel = koinViewModel(), onDismissed: () -> Unit, ) { - val coroutine = rememberCoroutineScope() SceneDetailsList( sceneId = sceneId, viewModel = viewModel, newScene = false, onDismissed = onDismissed, onDeleteAction = { - coroutine.launch { viewModel.removeScene(sceneId) } + viewModel.removeScene(sceneId) onDismissed() }, ) { - coroutine.launch { viewModel.saveOrUpdateScene(it) } + viewModel.saveOrUpdateScene(it) onDismissed() } } diff --git a/app/src/main/java/com/atomicrobot/carbon/ui/lumen/scenes/ScenesViewModel.kt b/app/src/main/java/com/atomicrobot/carbon/ui/lumen/scenes/ScenesViewModel.kt index 378ce33..5600ecc 100644 --- a/app/src/main/java/com/atomicrobot/carbon/ui/lumen/scenes/ScenesViewModel.kt +++ b/app/src/main/java/com/atomicrobot/carbon/ui/lumen/scenes/ScenesViewModel.kt @@ -17,6 +17,7 @@ import com.atomicrobot.carbon.data.lumen.toLumenScene import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch class ScenesViewModel( @@ -77,22 +78,22 @@ class ScenesViewModel( val sceneDetailsLightUIState: StateFlow get() = _sceneDetailsLightUIState - suspend fun getScenes() { + fun getScenes() { // Update the UI state to indicate that we are loading. - _mainUiState.value = _mainUiState.value.copy(mainScreenState = Scenes.Loading) + _mainUiState.update { it.copy(mainScreenState = Scenes.Loading) } viewModelScope.launch { - sceneDao.getScenesWithRoom().collect { - _mainUiState.value = _mainUiState.value.copy(mainScreenState = Scenes.Result(it)) + sceneDao.getScenesWithRoom().collect { scenes -> + _mainUiState.update { it.copy(mainScreenState = Scenes.Result(scenes)) } } } } - suspend fun getScene(sceneId: Long) { + fun getScene(sceneId: Long) { if (sceneId == 0L) { viewModelScope.launch { - _sceneDetailsUIState.value = - _sceneDetailsUIState.value.copy( - SceneDetails.Result( + _sceneDetailsUIState.update { + it.copy( + sceneDetailsState = SceneDetails.Result( scene = SceneAndLightsWithRoom( scene = LumenScene(), @@ -102,60 +103,53 @@ class ScenesViewModel( rooms = roomDao.getRoomNamesAndIds(), ), ) + } } return } - _sceneDetailsUIState.value = - _sceneDetailsUIState.value.copy(sceneDetailsState = SceneDetails.LoadingDetails) + _sceneDetailsUIState.update { it.copy(sceneDetailsState = SceneDetails.LoadingDetails) } viewModelScope.launch { val scene = sceneDao.getSceneAndLightsWithRoom(sceneId) val rooms = roomDao.getRoomNamesAndIds() - _sceneDetailsUIState.value = - _sceneDetailsUIState.value.copy(sceneDetailsState = SceneDetails.Result(scene, rooms)) + _sceneDetailsUIState.update { it.copy(sceneDetailsState = SceneDetails.Result(scene, rooms)) } } } - suspend fun getLightsForRoom(roomId: Long) { + fun getLightsForRoom(roomId: Long) { if (roomId == 0L) { // Invalid room ID, use an empty light list for the state - _sceneDetailsLightUIState.value = - _sceneDetailsLightUIState.value.copy( - sceneDetailsLightState = SceneDetailsLights.Result(emptyList()), - ) + _sceneDetailsLightUIState.update { + it.copy(sceneDetailsLightState = SceneDetailsLights.Result(emptyList())) + } + return } - _sceneDetailsLightUIState.value = - _sceneDetailsLightUIState.value.copy( - sceneDetailsLightState = SceneDetailsLights.LoadingLights, - ) + _sceneDetailsLightUIState.update { + it.copy(sceneDetailsLightState = SceneDetailsLights.LoadingLights) + } viewModelScope.launch { - lightDao.getAllLightsForRoom(roomId).collect { - _sceneDetailsLightUIState.value = - _sceneDetailsLightUIState.value.copy( - sceneDetailsLightState = SceneDetailsLights.Result(it), - ) + lightDao.getAllLightsForRoom(roomId).collect { lights -> + _sceneDetailsLightUIState.update { + it.copy(sceneDetailsLightState = SceneDetailsLights.Result(lights)) + } } } } fun resetSceneDetailsState() { // Initialize the details state to loading... - _sceneDetailsUIState.value = - _sceneDetailsUIState.value - .copy(sceneDetailsState = SceneDetails.LoadingDetails) - _sceneDetailsLightUIState.value = - _sceneDetailsLightUIState.value - .copy(sceneDetailsLightState = SceneDetailsLights.LoadingLights) + _sceneDetailsUIState.update { it.copy(sceneDetailsState = SceneDetails.LoadingDetails) } + _sceneDetailsLightUIState.update { it.copy(sceneDetailsLightState = SceneDetailsLights.LoadingLights) } } - suspend fun removeScene(sceneId: Long) { + fun removeScene(sceneId: Long) { viewModelScope.launch(Dispatchers.IO) { sceneDao.delete(sceneId) } } - suspend fun saveOrUpdateScene(scene: SceneModel) { + fun saveOrUpdateScene(scene: SceneModel) { viewModelScope.launch(Dispatchers.IO) { val sceneId: Long = if (scene.sceneId < 1) {