diff --git a/app/src/main/java/org/greenstand/android/TreeTracker/database/TreeTrackerDAO.kt b/app/src/main/java/org/greenstand/android/TreeTracker/database/TreeTrackerDAO.kt index b69865f2..ef15f51d 100644 --- a/app/src/main/java/org/greenstand/android/TreeTracker/database/TreeTrackerDAO.kt +++ b/app/src/main/java/org/greenstand/android/TreeTracker/database/TreeTrackerDAO.kt @@ -74,6 +74,10 @@ interface TreeTrackerDAO { @Query("SELECT * FROM user WHERE power_user = 1") suspend fun getPowerUser(): UserEntity? + @Query("UPDATE user SET power_user = :isPowerUser WHERE _id = :userId") + suspend fun updatePowerUserStatus(userId: Long, isPowerUser: Boolean) + + @Update suspend fun updatePlanterInfo(planterInfoEntity: PlanterInfoEntity) diff --git a/app/src/main/java/org/greenstand/android/TreeTracker/models/user/UserRepo.kt b/app/src/main/java/org/greenstand/android/TreeTracker/models/user/UserRepo.kt index b17717ef..b27bfe08 100644 --- a/app/src/main/java/org/greenstand/android/TreeTracker/models/user/UserRepo.kt +++ b/app/src/main/java/org/greenstand/android/TreeTracker/models/user/UserRepo.kt @@ -63,6 +63,11 @@ class UserRepo( val userEntity = dao.getPowerUser() ?: return null return createUser(userEntity) } + suspend fun setPowerUserStatus(userId: Long, isPowerUser: Boolean) { + if (!isPowerUser || getPowerUser() == null) { + dao.updatePowerUserStatus(userId, isPowerUser) + } + } suspend fun createUser( firstName: String, diff --git a/app/src/main/java/org/greenstand/android/TreeTracker/settings/SettingsScreen.kt b/app/src/main/java/org/greenstand/android/TreeTracker/settings/SettingsScreen.kt index ec9d84df..fc52f5b0 100644 --- a/app/src/main/java/org/greenstand/android/TreeTracker/settings/SettingsScreen.kt +++ b/app/src/main/java/org/greenstand/android/TreeTracker/settings/SettingsScreen.kt @@ -29,6 +29,7 @@ import androidx.lifecycle.viewmodel.compose.viewModel import kotlinx.coroutines.launch import org.greenstand.android.TreeTracker.R import org.greenstand.android.TreeTracker.models.NavRoute +import org.greenstand.android.TreeTracker.models.setupflow.CaptureSetupScopeManager import org.greenstand.android.TreeTracker.root.LocalNavHostController import org.greenstand.android.TreeTracker.root.LocalViewModelFactory import org.greenstand.android.TreeTracker.signup.Credential @@ -37,11 +38,16 @@ import org.greenstand.android.TreeTracker.userselect.UserSelectState import org.greenstand.android.TreeTracker.userselect.UserSelectViewModel import org.greenstand.android.TreeTracker.userselect.UserSelectViewModelFactory import org.greenstand.android.TreeTracker.view.ActionBar +import org.greenstand.android.TreeTracker.view.AppButtonColors import org.greenstand.android.TreeTracker.view.AppColors +import org.greenstand.android.TreeTracker.view.AppColors.Green +import org.greenstand.android.TreeTracker.view.AppColors.Red import org.greenstand.android.TreeTracker.view.ArrowButton import org.greenstand.android.TreeTracker.view.LanguageButton import org.greenstand.android.TreeTracker.view.dialogs.PrivacyPolicyDialog import org.greenstand.android.TreeTracker.view.TopBarTitle +import org.greenstand.android.TreeTracker.view.UserButton +import org.greenstand.android.TreeTracker.view.dialogs.CustomDialog @Composable fun SettingsScreen() { @@ -113,7 +119,9 @@ fun SettingsScreen() { iconResId = R.drawable.logout, // Replace with your logout icon titleResId = R.string.logout_title, descriptionResId = R.string.logout_description, - onClick = { /* Handle logout click */ } + onClick = { + viewModel.updateLogoutDialogVisibility(true) + } ) Divider(color = Color.White) @@ -127,6 +135,33 @@ fun SettingsScreen() { if (state.showPrivacyPolicyDialog == true) { PrivacyPolicyDialog(settingsViewModel = viewModel) } + if(state.showLogoutDialog == true){ + CustomDialog( + title = stringResource(R.string.logout_dialog_title), + textContent = stringResource(R.string.logout_dialog_message), + onPositiveClick = { + viewModel.logout() + navController.navigate(NavRoute.SignupFlow.route) + }, + onNegativeClick = { + viewModel.updateLogoutDialogVisibility(false) + }, + content = { + state.powerUser?.let { user -> + UserButton( + user = user, + isSelected = false, + buttonColors = AppButtonColors.Default, + selectedColor = Red, + onClick = { + } + ) + } + + } + + ) + } } } } diff --git a/app/src/main/java/org/greenstand/android/TreeTracker/settings/SettingsViewmodel.kt b/app/src/main/java/org/greenstand/android/TreeTracker/settings/SettingsViewmodel.kt index 1ae223e9..bde62480 100644 --- a/app/src/main/java/org/greenstand/android/TreeTracker/settings/SettingsViewmodel.kt +++ b/app/src/main/java/org/greenstand/android/TreeTracker/settings/SettingsViewmodel.kt @@ -7,9 +7,13 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.launch import org.greenstand.android.TreeTracker.models.UserRepo +import org.greenstand.android.TreeTracker.models.user.User data class SettingsState( val showPrivacyPolicyDialog: Boolean? = null, + val showLogoutDialog: Boolean? = null, + val showDeleteAccountDialog: Boolean? = null, + val powerUser: User? = null ) class SettingsViewModel( @@ -20,7 +24,11 @@ class SettingsViewModel( val state: Flow = _state init { - + viewModelScope.launch { + _state.value = _state.value.copy( + powerUser = userRepo.getPowerUser() + ) + } } fun setPrivacyDialogVisibility(show: Boolean) { @@ -30,4 +38,19 @@ class SettingsViewModel( ) } } + fun logout(){ + viewModelScope.launch { + _state.value.powerUser?.let { + userRepo.setPowerUserStatus(it.id, false) + } + updateLogoutDialogVisibility(false) + } + } + fun updateLogoutDialogVisibility(show: Boolean) { + viewModelScope.launch { + _state.value = _state.value.copy( + showLogoutDialog = show + ) + } + } } diff --git a/app/src/main/java/org/greenstand/android/TreeTracker/signup/CredentialEntryView.kt b/app/src/main/java/org/greenstand/android/TreeTracker/signup/CredentialEntryView.kt index 51428833..6dc5cc8d 100644 --- a/app/src/main/java/org/greenstand/android/TreeTracker/signup/CredentialEntryView.kt +++ b/app/src/main/java/org/greenstand/android/TreeTracker/signup/CredentialEntryView.kt @@ -69,6 +69,7 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch import org.greenstand.android.TreeTracker.R import org.greenstand.android.TreeTracker.models.NavRoute +import org.greenstand.android.TreeTracker.models.setupflow.CaptureSetupScopeManager import org.greenstand.android.TreeTracker.root.LocalNavHostController import org.greenstand.android.TreeTracker.settings.SettingsViewModel import org.greenstand.android.TreeTracker.theme.CustomTheme @@ -331,9 +332,16 @@ fun ExistingUserDialog( buttonColors = AppButtonColors.Default, selectedColor = Green, onClick = { - navController.navigate(NavRoute.WalletSelect.create()) { - popUpTo(NavRoute.SignupFlow.route) { inclusive = true } - launchSingleTop = true + + if(state.isTherePowerUser == false){ + viewModel.setExistingUserAsPowerUser(user.id) + navController.navigate(NavRoute.Dashboard.route) { + popUpTo(NavRoute.Language.route) { inclusive = true } + launchSingleTop = true + } + } else { + CaptureSetupScopeManager.getData().user = user + CaptureSetupScopeManager.nav.navFromNewUserCreation(navController) } } ) diff --git a/app/src/main/java/org/greenstand/android/TreeTracker/signup/SignupViewModel.kt b/app/src/main/java/org/greenstand/android/TreeTracker/signup/SignupViewModel.kt index d12d3937..09d4785f 100644 --- a/app/src/main/java/org/greenstand/android/TreeTracker/signup/SignupViewModel.kt +++ b/app/src/main/java/org/greenstand/android/TreeTracker/signup/SignupViewModel.kt @@ -40,6 +40,7 @@ data class SignUpState( val credential: Credential = Credential.Phone(), val autofocusTextEnabled: Boolean = false, val isInternetAvailable: Boolean = false, + val isTherePowerUser: Boolean? = null, val showSelfieTutorial: Boolean? = null, val showPrivacyDialog: Boolean? = true, ) @@ -84,7 +85,7 @@ class SignupViewModel( init { viewModelScope.launch(Dispatchers.Main) { val result = checkForInternetUseCase.execute(Unit) - _state.value = _state.value?.copy(isInternetAvailable = result, showSelfieTutorial = isInitialSetupRequired()) + _state.value = _state.value?.copy(isInternetAvailable = result, showSelfieTutorial = isInitialSetupRequired(), isTherePowerUser = !isInitialSetupRequired()) } } @@ -96,6 +97,12 @@ class SignupViewModel( _state.value = _state.value?.copy(lastName = lastName) } + fun setExistingUserAsPowerUser(id: Long){ + viewModelScope.launch { + userRepo.setPowerUserStatus(id, true) + } + } + fun updateEmail(email: String) { _state.value = _state.value?.copy( email = email.lowercase(), diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 283bdfd8..4a829ed9 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -181,6 +181,8 @@ Privacy Policy Log out from your account. Delete Account Initiate the process to delete your account completely. + Are you sure you want to logout? + If you logout you will have to re-enter email or phone number again to access all trees captured and your account Are you sure you want your account deleted? \n This is irreversible and you would loose all your data. Are you sure you want to log out from your account?