Skip to content
This repository has been archived by the owner on Oct 23, 2023. It is now read-only.

Commit

Permalink
chore(app): create UserViewModel and use in UserDetails
Browse files Browse the repository at this point in the history
  • Loading branch information
AndreaBrighi committed Jun 20, 2023
1 parent f228921 commit d8a167b
Show file tree
Hide file tree
Showing 2 changed files with 128 additions and 27 deletions.
60 changes: 33 additions & 27 deletions app/src/main/kotlin/com/intelligentbackpack/app/view/UserDetails.kt
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.livedata.observeAsState
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
Expand All @@ -33,13 +34,13 @@ import androidx.navigation.compose.rememberNavController
import com.intelligentbackpack.accessdomain.entities.Role
import com.intelligentbackpack.app.ui.navigation.MainNavigation
import com.intelligentbackpack.app.viewdata.UserView
import com.intelligentbackpack.app.viewmodel.LoginViewModel
import com.intelligentbackpack.app.viewmodel.UserViewModel

@Composable
fun UserDetails(
navController: NavHostController,
loginViewModel: LoginViewModel = viewModel(
factory = LoginViewModel.Factory,
userViewModel: UserViewModel = viewModel(
factory = UserViewModel.Factory,
),
) {
val openDialog = remember { mutableStateOf(false) }
Expand All @@ -50,7 +51,7 @@ fun UserDetails(
openDialog.value = false
},
title = {
Text(text = "OOperation error")
Text(text = "Operation error")
},
text = {
Text(error.value)
Expand All @@ -68,30 +69,35 @@ fun UserDetails(
},
)
}
val user = loginViewModel.user.observeAsState()
if (user.value == null) {
navController.navigate(MainNavigation.login)
LaunchedEffect(key1 = null) {
userViewModel.getUser({}, {
openDialog.value = true
error.value = it
})
}
val user = userViewModel.user.observeAsState()
user.value?.let {
UserDetailsPage(
navController = navController,
user = user.value!!,
logout = {
userViewModel.logout({
navController.navigate(MainNavigation.login)
}, {
openDialog.value = true
error.value = it
})
},
delete = {
userViewModel.deleteUser({
navController.navigate(MainNavigation.login)
}, {
openDialog.value = true
error.value = it
})
},
)
}
UserDetailsPage(
navController = navController,
user = user.value!!,
logout = {
loginViewModel.logout({
navController.navigate(MainNavigation.login)
}, {
openDialog.value = true
error.value = it
})
},
delete = {
loginViewModel.deleteUser({
navController.navigate(MainNavigation.login)
}, {
openDialog.value = true
error.value = it
})
},
)
}

@Composable
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
package com.intelligentbackpack.app.viewmodel

import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.viewModelScope
import androidx.lifecycle.viewmodel.initializer
import androidx.lifecycle.viewmodel.viewModelFactory
import com.intelligentbackpack.accessdomain.usecase.AccessUseCase
import com.intelligentbackpack.app.App
import com.intelligentbackpack.app.viewdata.UserView
import com.intelligentbackpack.app.viewdata.adapter.UserAdapter.fromDomainToView
import kotlinx.coroutines.launch

class UserViewModel(
private val accessUseCase: AccessUseCase,
) : ViewModel() {

/**
* Live data with the user.
*/
val user: LiveData<UserView?>
get() = userImpl

private val userImpl = MutableLiveData<UserView?>()

/**
* Gets the user.
*
* @param success the success callback.
*/
fun getUser(success: (UserView) -> Unit, error: (String) -> Unit) {
viewModelScope.launch {
accessUseCase.getLoggedUser()
.onSuccess { user ->
userImpl.postValue(user.fromDomainToView())
success(user.fromDomainToView())
}
.onFailure {
error(it.message ?: "Unknown error")
}
}
}

/**
* Logout the user.
*
* @param success the success callback.
*/
fun logout(success: () -> Unit, error: (String) -> Unit) {
viewModelScope.launch {
accessUseCase.logoutUser()
.onSuccess {
userImpl.postValue(null)
success()
}
.onFailure {
error(it.message ?: "Unknown error")
}
}
}

/**
* Delete the user.
*
* @param success the success callback.
*/
fun deleteUser(success: () -> Unit, error: (String) -> Unit) {
viewModelScope.launch {
accessUseCase.deleteUser()
.onSuccess {
userImpl.postValue(null)
success()
}.onFailure {
error(it.message ?: "Unknown error")
}
}
}

companion object {

/**
* Factory for the view model.
*/
val Factory: ViewModelProvider.Factory = viewModelFactory {
initializer {
val application = checkNotNull(this[ViewModelProvider.AndroidViewModelFactory.APPLICATION_KEY])
UserViewModel(
(application as App).accessUseCase,
)
}
}
}
}

0 comments on commit d8a167b

Please sign in to comment.