From 5e2c8de521900ad1551074cc63e8f855a0d7ac5b Mon Sep 17 00:00:00 2001 From: tdpeuter Date: Sun, 16 Apr 2023 22:40:43 +0200 Subject: [PATCH] #18 Edit and delete profile implemented --- .../main/java/be/ugent/sel/studeez/StudeezApp.kt | 2 +- .../common/composable/TextFieldComposable.kt | 7 ++----- .../be/ugent/sel/studeez/domain/AccountDAO.kt | 1 + .../java/be/ugent/sel/studeez/domain/UserDAO.kt | 6 ++++++ .../domain/implementation/FirebaseUserDAO.kt | 16 ++++++++-------- .../studeez/screens/profile/ProfileEditScreen.kt | 6 ++++-- .../screens/profile/ProfileEditViewModel.kt | 9 ++++++--- .../studeez/screens/sign_up/SignUpViewModel.kt | 5 +---- app/src/main/res/values/strings.xml | 5 +++-- 9 files changed, 32 insertions(+), 25 deletions(-) diff --git a/app/src/main/java/be/ugent/sel/studeez/StudeezApp.kt b/app/src/main/java/be/ugent/sel/studeez/StudeezApp.kt index 29f0761..3f1e371 100644 --- a/app/src/main/java/be/ugent/sel/studeez/StudeezApp.kt +++ b/app/src/main/java/be/ugent/sel/studeez/StudeezApp.kt @@ -118,6 +118,6 @@ fun NavGraphBuilder.studeezGraph(appState: StudeezAppstate) { // Edit screens composable(StudeezDestinations.EDIT_PROFILE_SCREEN) { - EditProfileScreen(goBack) + EditProfileScreen(goBack, openAndPopUp) } } \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/common/composable/TextFieldComposable.kt b/app/src/main/java/be/ugent/sel/studeez/common/composable/TextFieldComposable.kt index 93c0463..2c0b450 100644 --- a/app/src/main/java/be/ugent/sel/studeez/common/composable/TextFieldComposable.kt +++ b/app/src/main/java/be/ugent/sel/studeez/common/composable/TextFieldComposable.kt @@ -1,7 +1,6 @@ package be.ugent.sel.studeez.common.composable import androidx.annotation.StringRes -import androidx.compose.foundation.text.KeyboardActions import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material.Icon import androidx.compose.material.IconButton @@ -12,17 +11,15 @@ import androidx.compose.material.icons.filled.Email import androidx.compose.material.icons.filled.Lock import androidx.compose.material.icons.filled.Person import androidx.compose.runtime.* -import be.ugent.sel.studeez.R.string as AppText -import be.ugent.sel.studeez.R.drawable as AppIcon import androidx.compose.ui.Modifier -import androidx.compose.ui.input.key.Key import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource -import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.text.input.PasswordVisualTransformation import androidx.compose.ui.text.input.VisualTransformation import be.ugent.sel.studeez.common.ext.fieldModifier +import be.ugent.sel.studeez.R.drawable as AppIcon +import be.ugent.sel.studeez.R.string as AppText @Composable fun BasicField( diff --git a/app/src/main/java/be/ugent/sel/studeez/domain/AccountDAO.kt b/app/src/main/java/be/ugent/sel/studeez/domain/AccountDAO.kt index 96ecb74..c813ec6 100644 --- a/app/src/main/java/be/ugent/sel/studeez/domain/AccountDAO.kt +++ b/app/src/main/java/be/ugent/sel/studeez/domain/AccountDAO.kt @@ -29,5 +29,6 @@ interface AccountDAO { suspend fun sendRecoveryEmail(email: String) suspend fun signUpWithEmailAndPassword(email: String, password: String) suspend fun deleteAccount() + suspend fun signOut() } diff --git a/app/src/main/java/be/ugent/sel/studeez/domain/UserDAO.kt b/app/src/main/java/be/ugent/sel/studeez/domain/UserDAO.kt index 8b6f357..b96cf17 100644 --- a/app/src/main/java/be/ugent/sel/studeez/domain/UserDAO.kt +++ b/app/src/main/java/be/ugent/sel/studeez/domain/UserDAO.kt @@ -4,4 +4,10 @@ interface UserDAO { suspend fun getUsername(): String? suspend fun save(newUsername: String) + + /** + * Delete all references to this user in the database. Similar to the deleteCascade in + * relational databases. + */ + suspend fun deleteUserReferences() } \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseUserDAO.kt b/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseUserDAO.kt index 8ac779b..3158b88 100644 --- a/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseUserDAO.kt +++ b/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseUserDAO.kt @@ -1,19 +1,13 @@ package be.ugent.sel.studeez.domain.implementation -import androidx.compose.runtime.rememberCoroutineScope +import be.ugent.sel.studeez.R +import be.ugent.sel.studeez.common.snackbar.SnackbarManager import be.ugent.sel.studeez.domain.AccountDAO import be.ugent.sel.studeez.domain.UserDAO import com.google.firebase.firestore.DocumentReference import com.google.firebase.firestore.FirebaseFirestore -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.channels.awaitClose -import kotlinx.coroutines.coroutineScope -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.callbackFlow -import kotlinx.coroutines.flow.flow import kotlinx.coroutines.tasks.await import javax.inject.Inject -import kotlin.coroutines.coroutineContext class FirebaseUserDAO @Inject constructor( private val firestore: FirebaseFirestore, @@ -34,4 +28,10 @@ class FirebaseUserDAO @Inject constructor( companion object { private const val USER_COLLECTION = "users" } + + override suspend fun deleteUserReferences() { + currentUserDocument().delete() + .addOnSuccessListener { SnackbarManager.showMessage(R.string.success) } + .addOnFailureListener { SnackbarManager.showMessage(R.string.generic_error) } + } } \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/profile/ProfileEditScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/profile/ProfileEditScreen.kt index 38fa4cf..eb12ac7 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/profile/ProfileEditScreen.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/profile/ProfileEditScreen.kt @@ -17,6 +17,7 @@ import be.ugent.sel.studeez.ui.theme.StudeezTheme @Composable fun EditProfileScreen( goBack: () -> Unit, + openAndPopUp: (String, String) -> Unit, viewModel: ProfileEditViewModel = hiltViewModel() ) { val uiState by viewModel.uiState @@ -36,7 +37,7 @@ fun EditProfileScreen( viewModel.onSaveClick() } BasicTextButton(text = R.string.delete_profile, Modifier.textButton()) { - viewModel.onDeleteClick() + viewModel.onDeleteClick(openAndPopUp) } } } @@ -47,7 +48,8 @@ fun EditProfileScreen( fun EditProfileScreenComposable() { StudeezTheme { EditProfileScreen ( - {} + {}, + {_, _ -> {}} ) } } \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/profile/ProfileEditViewModel.kt b/app/src/main/java/be/ugent/sel/studeez/screens/profile/ProfileEditViewModel.kt index 6a31516..cb270be 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/profile/ProfileEditViewModel.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/profile/ProfileEditViewModel.kt @@ -6,6 +6,7 @@ import be.ugent.sel.studeez.common.snackbar.SnackbarManager import be.ugent.sel.studeez.domain.AccountDAO import be.ugent.sel.studeez.domain.LogService import be.ugent.sel.studeez.domain.UserDAO +import be.ugent.sel.studeez.navigation.StudeezDestinations import be.ugent.sel.studeez.screens.StudeezViewModel import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject @@ -33,13 +34,15 @@ class ProfileEditViewModel @Inject constructor( fun onSaveClick() { launchCatching { userDAO.save(uiState.value.username) - SnackbarManager.showMessage(R.string.save_success) + SnackbarManager.showMessage(R.string.success) } } - fun onDeleteClick() { + fun onDeleteClick(openAndPopUp: (String, String) -> Unit) { launchCatching { - accountDAO.deleteAccount() + userDAO.deleteUserReferences() // Delete references + accountDAO.deleteAccount() // Delete authentication } + openAndPopUp(StudeezDestinations.SIGN_UP_SCREEN, StudeezDestinations.EDIT_PROFILE_SCREEN) } } \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/sign_up/SignUpViewModel.kt b/app/src/main/java/be/ugent/sel/studeez/screens/sign_up/SignUpViewModel.kt index dacb7db..91dde13 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/sign_up/SignUpViewModel.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/sign_up/SignUpViewModel.kt @@ -13,11 +13,8 @@ import be.ugent.sel.studeez.navigation.StudeezDestinations.LOGIN_SCREEN import be.ugent.sel.studeez.navigation.StudeezDestinations.SIGN_UP_SCREEN import be.ugent.sel.studeez.screens.StudeezViewModel import dagger.hilt.android.lifecycle.HiltViewModel -import kotlinx.coroutines.flow.FlowCollector -import kotlinx.coroutines.flow.first -import kotlinx.coroutines.flow.take -import be.ugent.sel.studeez.R.string as AppText import javax.inject.Inject +import be.ugent.sel.studeez.R.string as AppText @HiltViewModel class SignUpViewModel @Inject constructor( diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 41083e7..0f3f21b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -5,16 +5,17 @@ Email Password Repeat password - Go back Menu Confirm Save Cancel + Go back + Next - Saved successfully! + Success! Try again Something wrong happened. Please try again. Please insert a valid email.