Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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()
}
}
Expand All @@ -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()
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down Expand Up @@ -77,22 +78,22 @@ class ScenesViewModel(
val sceneDetailsLightUIState: StateFlow<SceneDetailsLightsUIState>
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(),
Expand All @@ -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) {
Expand Down