Skip to content

Commit

Permalink
Merge pull request #71 from Tiqr/feature/edured-79_remove_linked_acco…
Browse files Browse the repository at this point in the history
…unt_connection

Feature/edured 79 remove linked account connection
  • Loading branch information
patvdm authored Apr 11, 2023
2 parents 30c8fb3 + 034c78d commit 7b6556c
Show file tree
Hide file tree
Showing 27 changed files with 317 additions and 233 deletions.
3 changes: 3 additions & 0 deletions app/src/main/kotlin/nl/eduid/ErrorData.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
package nl.eduid

data class ErrorData(val title: String, val message: String)
3 changes: 3 additions & 0 deletions app/src/main/kotlin/nl/eduid/di/api/EduIdApi.kt
Original file line number Diff line number Diff line change
Expand Up @@ -35,4 +35,7 @@ interface EduIdApi {

@PUT("/mobile/api/sp/email")
suspend fun requestEmailChange(@Body email: EmailChangeRequest): Response<UserDetails>

@PUT("/mobile/api/sp/institution")
suspend fun removeConnection(@Body account: LinkedAccount): Response<UserDetails>
}
1 change: 1 addition & 0 deletions app/src/main/kotlin/nl/eduid/di/model/EduIdModels.kt
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,7 @@ data class LinkedAccount(
val institutionIdentifier: String,
val schacHomeOrganization: String,
val eduPersonPrincipalName: String,
val subjectId: String?,
val givenName: String,
val familyName: String,
val eduPersonAffiliations: List<String>,
Expand Down
8 changes: 2 additions & 6 deletions app/src/main/kotlin/nl/eduid/graphs/MainGraph.kt
Original file line number Diff line number Diff line change
Expand Up @@ -369,19 +369,15 @@ fun MainGraph(
val viewModel = hiltViewModel<PersonalInfoViewModel>(it)
PersonalInfoScreen(
viewModel = viewModel,
onNameClicked = { },
onEmailClicked = { navController.navigate(Graph.EDIT_EMAIL) },
onRoleClicked = { },
onInstitutionClicked = { },
onEmailClicked = { navController.goToWithPopCurrent(Graph.EDIT_EMAIL) },
onManageAccountClicked = { dateString ->
navController.navigate(
ManageAccountRoute.routeWithArgs(
dateString
)
)
},
goBack = { navController.popBackStack() },
)
) { navController.popBackStack() }
}
//endregion
composable(Graph.DATA_AND_ACTIVITY) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.LinearProgressIndicator
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
Expand All @@ -20,6 +21,9 @@ import androidx.compose.ui.unit.dp
import nl.eduid.R
import nl.eduid.screens.personalinfo.PersonalInfo
import nl.eduid.screens.personalinfo.PersonalInfoViewModel
import nl.eduid.screens.personalinfo.UiState
import nl.eduid.ErrorData
import nl.eduid.ui.AlertDialogWithSingleButton
import nl.eduid.ui.EduIdTopAppBar
import nl.eduid.ui.InfoTab
import nl.eduid.ui.PrimaryButton
Expand All @@ -31,23 +35,39 @@ fun AccountLinkedScreen(
viewModel: PersonalInfoViewModel,
continueToHome: () -> Unit,
) {
val personalInfo by viewModel.personalInfo.observeAsState(PersonalInfo())
val uiState by viewModel.uiState.observeAsState(UiState())
AccountLinkedContent(
personalInfo = personalInfo,
personalInfo = uiState.personalInfo,
isLoading = uiState.isLoading,
errorData = uiState.errorData,
dismissError = viewModel::clearErrorData,
continueToHome = continueToHome,
removeConnection = { index -> viewModel.removeConnection(index) },
)
}

@Composable
private fun AccountLinkedContent(
personalInfo: PersonalInfo,
isLoading: Boolean = false,
errorData: ErrorData? = null,
dismissError: () -> Unit = {},
continueToHome: () -> Unit = {},
removeConnection: (Int) -> Unit = {},
) = EduIdTopAppBar(
withBackIcon = false
) {
Column(
modifier = Modifier.verticalScroll(rememberScrollState())
) {
if (errorData != null) {
AlertDialogWithSingleButton(
title = errorData.title,
explanation = errorData.message,
buttonLabel = stringResource(R.string.button_ok),
onDismiss = dismissError
)
}
Spacer(Modifier.height(36.dp))
Text(
style = MaterialTheme.typography.titleLarge.copy(
Expand All @@ -68,23 +88,40 @@ private fun AccountLinkedContent(
text = stringResource(R.string.account_linked_description),
modifier = Modifier.fillMaxWidth()
)
Spacer(Modifier.height(12.dp))

if (isLoading) {
Spacer(modifier = Modifier.height(16.dp))
LinearProgressIndicator(
modifier = Modifier.fillMaxWidth()
)
Spacer(modifier = Modifier.height(16.dp))
} else {
Spacer(Modifier.height(12.dp))
}
InfoTab(
header = "Name",
header = stringResource(R.string.infotab_fullname),
title = personalInfo.name,
subtitle = "Provided by ${personalInfo.nameProvider}",
subtitle = if (personalInfo.nameProvider == null) {
stringResource(
R.string.infotab_providedby_you
)
} else {
stringResource(
R.string.infotab_providedby, personalInfo.nameProvider
)
},
onClick = { },
endIcon = R.drawable.shield_tick_blue
)

personalInfo.institutionAccounts.forEach {
personalInfo.institutionAccounts.forEachIndexed { index, account ->
InfoTab(
header = "Role & institution",
title = it.role,
subtitle = it.institution,
onClick = { },
endIcon = R.drawable.shield_tick_blue,
header = if (index < 1) stringResource(R.string.infotab_role_institution) else "",
title = account.role,
subtitle = stringResource(R.string.infotab_at, account.roleProvider),
institutionInfo = account,
onClick = {},
onDeleteButtonClicked = { removeConnection(index) },
endIcon = R.drawable.chevron_down,
)
}
PrimaryButton(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
import nl.eduid.R
import nl.eduid.screens.scan.ErrorData
import nl.eduid.ErrorData
import nl.eduid.ui.AlertDialogWithSingleButton
import nl.eduid.ui.EduIdTopAppBar
import nl.eduid.ui.theme.findActivity
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.launch
import nl.eduid.di.api.EduIdApi
import nl.eduid.screens.scan.ErrorData
import nl.eduid.ErrorData
import timber.log.Timber
import javax.inject.Inject

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package nl.eduid.screens.firsttimedialog

import android.content.Intent
import nl.eduid.screens.scan.ErrorData
import nl.eduid.ErrorData

data class UiState(
val linkUrl: Intent? = null,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import nl.eduid.BaseViewModel
import nl.eduid.R
import nl.eduid.di.api.EduIdApi
import nl.eduid.di.repository.StorageRepository
import nl.eduid.screens.scan.ErrorData
import nl.eduid.ErrorData
import nl.eduid.screens.splash.SplashWaitTime
import org.tiqr.data.model.*
import org.tiqr.data.repository.AuthenticationRepository
Expand Down
2 changes: 1 addition & 1 deletion app/src/main/kotlin/nl/eduid/screens/homepage/UiState.kt
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package nl.eduid.screens.homepage

import nl.eduid.screens.scan.ErrorData
import nl.eduid.ErrorData
import org.tiqr.data.model.Challenge

data class UiState(
Expand Down
2 changes: 1 addition & 1 deletion app/src/main/kotlin/nl/eduid/screens/oauth/OAuthStep.kt
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package nl.eduid.screens.oauth

import android.content.Intent
import nl.eduid.screens.scan.ErrorData
import nl.eduid.ErrorData

/**
* Loading
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ import net.openid.appauth.ClientAuthentication.UnsupportedAuthenticationMethod
import nl.eduid.R
import nl.eduid.di.assist.AuthenticationAssistant
import nl.eduid.di.repository.StorageRepository
import nl.eduid.screens.scan.ErrorData
import nl.eduid.ErrorData
import org.tiqr.data.service.DatabaseService
import timber.log.Timber
import java.io.IOException
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,9 @@ package nl.eduid.screens.personalinfo

data class PersonalInfo(
val name: String = "",
val nameProvider: String = "",
val nameProvider: String? = null,
val nameStatus: InfoStatus = InfoStatus.Final,
val email: String = "",
val emailProvider: String = "",
val emailStatus: InfoStatus = InfoStatus.Final,
val institutionAccounts: List<InstitutionAccount> = emptyList(),
val dateCreated: Long = 0,
Expand All @@ -20,21 +19,20 @@ data class PersonalInfo(
val createdStamp: Long,
val expiryStamp: Long,
)

fun demoData(): PersonalInfo {
return PersonalInfo(
name = "R. van Hamersdonksveer",
nameProvider = "Universiteit van Amsterdam",
nameStatus = InfoStatus.Final,
email = "[email protected]",
emailProvider = "You",
emailStatus = InfoStatus.Editable,
institutionAccounts = emptyList(),
)
}
}

sealed class InfoStatus {
object Empty : InfoStatus()
object Editable : InfoStatus()
object Final : InfoStatus()
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package nl.eduid.screens.personalinfo

import nl.eduid.di.api.EduIdApi
import nl.eduid.di.model.LinkedAccount
import nl.eduid.di.model.UserDetails
import timber.log.Timber

Expand All @@ -23,6 +24,23 @@ class PersonalInfoRepository(private val eduIdApi: EduIdApi) {
null
}

suspend fun removeConnection(linkedAccount: LinkedAccount): UserDetails? = try {
val response = eduIdApi.removeConnection(linkedAccount)
if (response.isSuccessful) {
response.body()
} else {
Timber.w(
"Failed to remove connection for [${response.code()}/${response.message()}]${
response.errorBody()?.string()
}"
)
null
}
} catch (e: Exception) {
Timber.e(e, "Failed to remove connection for ${linkedAccount.institutionIdentifier}")
null
}

suspend fun getInstitutionName(schac_home: String): String? = try {
val response = eduIdApi.getInstitutionName(schac_home)
if (response.isSuccessful) {
Expand Down
Loading

0 comments on commit 7b6556c

Please sign in to comment.