Skip to content

Commit ae49e8c

Browse files
authored
Merge pull request #1143 from Greenstand/1130-logout
feat: complete logout and re-login feature
2 parents 788b235 + 5e728f8 commit ae49e8c

File tree

7 files changed

+90
-6
lines changed

7 files changed

+90
-6
lines changed

app/src/main/java/org/greenstand/android/TreeTracker/database/TreeTrackerDAO.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,10 @@ interface TreeTrackerDAO {
7474
@Query("SELECT * FROM user WHERE power_user = 1")
7575
suspend fun getPowerUser(): UserEntity?
7676

77+
@Query("UPDATE user SET power_user = :isPowerUser WHERE _id = :userId")
78+
suspend fun updatePowerUserStatus(userId: Long, isPowerUser: Boolean)
79+
80+
7781
@Update
7882
suspend fun updatePlanterInfo(planterInfoEntity: PlanterInfoEntity)
7983

app/src/main/java/org/greenstand/android/TreeTracker/models/user/UserRepo.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,11 @@ class UserRepo(
6363
val userEntity = dao.getPowerUser() ?: return null
6464
return createUser(userEntity)
6565
}
66+
suspend fun setPowerUserStatus(userId: Long, isPowerUser: Boolean) {
67+
if (!isPowerUser || getPowerUser() == null) {
68+
dao.updatePowerUserStatus(userId, isPowerUser)
69+
}
70+
}
6671

6772
suspend fun createUser(
6873
firstName: String,

app/src/main/java/org/greenstand/android/TreeTracker/settings/SettingsScreen.kt

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import androidx.lifecycle.viewmodel.compose.viewModel
2929
import kotlinx.coroutines.launch
3030
import org.greenstand.android.TreeTracker.R
3131
import org.greenstand.android.TreeTracker.models.NavRoute
32+
import org.greenstand.android.TreeTracker.models.setupflow.CaptureSetupScopeManager
3233
import org.greenstand.android.TreeTracker.root.LocalNavHostController
3334
import org.greenstand.android.TreeTracker.root.LocalViewModelFactory
3435
import org.greenstand.android.TreeTracker.signup.Credential
@@ -37,11 +38,16 @@ import org.greenstand.android.TreeTracker.userselect.UserSelectState
3738
import org.greenstand.android.TreeTracker.userselect.UserSelectViewModel
3839
import org.greenstand.android.TreeTracker.userselect.UserSelectViewModelFactory
3940
import org.greenstand.android.TreeTracker.view.ActionBar
41+
import org.greenstand.android.TreeTracker.view.AppButtonColors
4042
import org.greenstand.android.TreeTracker.view.AppColors
43+
import org.greenstand.android.TreeTracker.view.AppColors.Green
44+
import org.greenstand.android.TreeTracker.view.AppColors.Red
4145
import org.greenstand.android.TreeTracker.view.ArrowButton
4246
import org.greenstand.android.TreeTracker.view.LanguageButton
4347
import org.greenstand.android.TreeTracker.view.dialogs.PrivacyPolicyDialog
4448
import org.greenstand.android.TreeTracker.view.TopBarTitle
49+
import org.greenstand.android.TreeTracker.view.UserButton
50+
import org.greenstand.android.TreeTracker.view.dialogs.CustomDialog
4551

4652
@Composable
4753
fun SettingsScreen() {
@@ -113,7 +119,9 @@ fun SettingsScreen() {
113119
iconResId = R.drawable.logout, // Replace with your logout icon
114120
titleResId = R.string.logout_title,
115121
descriptionResId = R.string.logout_description,
116-
onClick = { /* Handle logout click */ }
122+
onClick = {
123+
viewModel.updateLogoutDialogVisibility(true)
124+
}
117125
)
118126
Divider(color = Color.White)
119127

@@ -127,6 +135,33 @@ fun SettingsScreen() {
127135
if (state.showPrivacyPolicyDialog == true) {
128136
PrivacyPolicyDialog(settingsViewModel = viewModel)
129137
}
138+
if(state.showLogoutDialog == true){
139+
CustomDialog(
140+
title = stringResource(R.string.logout_dialog_title),
141+
textContent = stringResource(R.string.logout_dialog_message),
142+
onPositiveClick = {
143+
viewModel.logout()
144+
navController.navigate(NavRoute.SignupFlow.route)
145+
},
146+
onNegativeClick = {
147+
viewModel.updateLogoutDialogVisibility(false)
148+
},
149+
content = {
150+
state.powerUser?.let { user ->
151+
UserButton(
152+
user = user,
153+
isSelected = false,
154+
buttonColors = AppButtonColors.Default,
155+
selectedColor = Red,
156+
onClick = {
157+
}
158+
)
159+
}
160+
161+
}
162+
163+
)
164+
}
130165
}
131166
}
132167
}

app/src/main/java/org/greenstand/android/TreeTracker/settings/SettingsViewmodel.kt

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,13 @@ import kotlinx.coroutines.flow.Flow
77
import kotlinx.coroutines.flow.MutableStateFlow
88
import kotlinx.coroutines.launch
99
import org.greenstand.android.TreeTracker.models.UserRepo
10+
import org.greenstand.android.TreeTracker.models.user.User
1011

1112
data class SettingsState(
1213
val showPrivacyPolicyDialog: Boolean? = null,
14+
val showLogoutDialog: Boolean? = null,
15+
val showDeleteAccountDialog: Boolean? = null,
16+
val powerUser: User? = null
1317
)
1418

1519
class SettingsViewModel(
@@ -20,7 +24,11 @@ class SettingsViewModel(
2024
val state: Flow<SettingsState> = _state
2125

2226
init {
23-
27+
viewModelScope.launch {
28+
_state.value = _state.value.copy(
29+
powerUser = userRepo.getPowerUser()
30+
)
31+
}
2432
}
2533

2634
fun setPrivacyDialogVisibility(show: Boolean) {
@@ -30,4 +38,19 @@ class SettingsViewModel(
3038
)
3139
}
3240
}
41+
fun logout(){
42+
viewModelScope.launch {
43+
_state.value.powerUser?.let {
44+
userRepo.setPowerUserStatus(it.id, false)
45+
}
46+
updateLogoutDialogVisibility(false)
47+
}
48+
}
49+
fun updateLogoutDialogVisibility(show: Boolean) {
50+
viewModelScope.launch {
51+
_state.value = _state.value.copy(
52+
showLogoutDialog = show
53+
)
54+
}
55+
}
3356
}

app/src/main/java/org/greenstand/android/TreeTracker/signup/CredentialEntryView.kt

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ import kotlinx.coroutines.CoroutineScope
6969
import kotlinx.coroutines.launch
7070
import org.greenstand.android.TreeTracker.R
7171
import org.greenstand.android.TreeTracker.models.NavRoute
72+
import org.greenstand.android.TreeTracker.models.setupflow.CaptureSetupScopeManager
7273
import org.greenstand.android.TreeTracker.root.LocalNavHostController
7374
import org.greenstand.android.TreeTracker.settings.SettingsViewModel
7475
import org.greenstand.android.TreeTracker.theme.CustomTheme
@@ -331,9 +332,16 @@ fun ExistingUserDialog(
331332
buttonColors = AppButtonColors.Default,
332333
selectedColor = Green,
333334
onClick = {
334-
navController.navigate(NavRoute.WalletSelect.create()) {
335-
popUpTo(NavRoute.SignupFlow.route) { inclusive = true }
336-
launchSingleTop = true
335+
336+
if(state.isTherePowerUser == false){
337+
viewModel.setExistingUserAsPowerUser(user.id)
338+
navController.navigate(NavRoute.Dashboard.route) {
339+
popUpTo(NavRoute.Language.route) { inclusive = true }
340+
launchSingleTop = true
341+
}
342+
} else {
343+
CaptureSetupScopeManager.getData().user = user
344+
CaptureSetupScopeManager.nav.navFromNewUserCreation(navController)
337345
}
338346
}
339347
)

app/src/main/java/org/greenstand/android/TreeTracker/signup/SignupViewModel.kt

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ data class SignUpState(
4040
val credential: Credential = Credential.Phone(),
4141
val autofocusTextEnabled: Boolean = false,
4242
val isInternetAvailable: Boolean = false,
43+
val isTherePowerUser: Boolean? = null,
4344
val showSelfieTutorial: Boolean? = null,
4445
val showPrivacyDialog: Boolean? = true,
4546
)
@@ -84,7 +85,7 @@ class SignupViewModel(
8485
init {
8586
viewModelScope.launch(Dispatchers.Main) {
8687
val result = checkForInternetUseCase.execute(Unit)
87-
_state.value = _state.value?.copy(isInternetAvailable = result, showSelfieTutorial = isInitialSetupRequired())
88+
_state.value = _state.value?.copy(isInternetAvailable = result, showSelfieTutorial = isInitialSetupRequired(), isTherePowerUser = !isInitialSetupRequired())
8889
}
8990
}
9091

@@ -96,6 +97,12 @@ class SignupViewModel(
9697
_state.value = _state.value?.copy(lastName = lastName)
9798
}
9899

100+
fun setExistingUserAsPowerUser(id: Long){
101+
viewModelScope.launch {
102+
userRepo.setPowerUserStatus(id, true)
103+
}
104+
}
105+
99106
fun updateEmail(email: String) {
100107
_state.value = _state.value?.copy(
101108
email = email.lowercase(),

app/src/main/res/values/strings.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,8 @@ Privacy Policy
181181
<string name="logout_description">Log out from your account.</string>
182182
<string name="delete_account_title">Delete Account</string>
183183
<string name="delete_account_description">Initiate the process to delete your account completely.</string>
184+
<string name="logout_dialog_title">Are you sure you want to logout?</string>
185+
<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>
184186
<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>
185187
<string name="logout_dialog_message"> Are you sure you want to log out from your account?</string>
186188

0 commit comments

Comments
 (0)