Skip to content
Merged
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 @@ -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)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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() {
Expand Down Expand Up @@ -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)

Expand All @@ -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 = {
}
)
}

}

)
}
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand All @@ -20,7 +24,11 @@ class SettingsViewModel(
val state: Flow<SettingsState> = _state

init {

viewModelScope.launch {
_state.value = _state.value.copy(
powerUser = userRepo.getPowerUser()
)
}
}

fun setPrivacyDialogVisibility(show: Boolean) {
Expand All @@ -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
)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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)
}
}
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
)
Expand Down Expand Up @@ -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())
}
}

Expand All @@ -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(),
Expand Down
2 changes: 2 additions & 0 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,8 @@ Privacy Policy
<string name="logout_description">Log out from your account.</string>
<string name="delete_account_title">Delete Account</string>
<string name="delete_account_description">Initiate the process to delete your account completely.</string>
<string name="logout_dialog_title">Are you sure you want to logout?</string>
<string name="delete_dialog_description">If you logout you will have to re-enter email or phone number again to access all trees captured and your account</string>
<string name="delete_account_dialog_message">Are you sure you want your account deleted? \n This is irreversible and you would loose all your data.</string>
<string name="logout_dialog_message"> Are you sure you want to log out from your account?</string>

Expand Down