From fcc8d179f438cb9fb2aa147d58e847821f7abd84 Mon Sep 17 00:00:00 2001 From: Diego Beraldin Date: Wed, 6 Mar 2024 22:08:58 +0100 Subject: [PATCH] enhancement: improve profile loading (#575) --- .../repository/DefaultIdentityRepository.kt | 8 ++++++-- .../identity/repository/IdentityRepository.kt | 6 +++--- .../identity/usecase/DefaultLoginUseCase.kt | 1 + .../usecase/DefaultSwitchAccountUseCase.kt | 1 + .../unit/myaccount/ProfileLoggedViewModel.kt | 16 +++++++++++++--- 5 files changed, 24 insertions(+), 8 deletions(-) diff --git a/domain/identity/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/domain/identity/repository/DefaultIdentityRepository.kt b/domain/identity/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/domain/identity/repository/DefaultIdentityRepository.kt index 55080fffe..24c73a4ed 100644 --- a/domain/identity/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/domain/identity/repository/DefaultIdentityRepository.kt +++ b/domain/identity/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/domain/identity/repository/DefaultIdentityRepository.kt @@ -2,6 +2,7 @@ package com.github.diegoberaldin.raccoonforlemmy.domain.identity.repository import com.github.diegoberaldin.raccoonforlemmy.core.persistence.repository.AccountRepository import com.github.diegoberaldin.raccoonforlemmy.core.utils.network.NetworkManager +import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.data.UserModel import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.repository.SiteRepository import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.IO @@ -16,6 +17,8 @@ internal class DefaultIdentityRepository( override val authToken = MutableStateFlow(null) override val isLogged = MutableStateFlow(null) + override var cachedUser: UserModel? = null + private set override suspend fun startup() = withContext(Dispatchers.IO) { val account = accountRepository.getActive() @@ -33,6 +36,7 @@ internal class DefaultIdentityRepository( override fun clearToken() { authToken.value = "" + cachedUser = null isLogged.value = false } @@ -42,8 +46,8 @@ internal class DefaultIdentityRepository( isLogged.value = false } else { val newIsLogged = if (networkManager.isNetworkAvailable()) { - val currentUser = siteRepository.getCurrentUser(auth) - currentUser != null + cachedUser = siteRepository.getCurrentUser(auth) + cachedUser != null } else { null } diff --git a/domain/identity/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/domain/identity/repository/IdentityRepository.kt b/domain/identity/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/domain/identity/repository/IdentityRepository.kt index d4a0095dc..da4cfa079 100644 --- a/domain/identity/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/domain/identity/repository/IdentityRepository.kt +++ b/domain/identity/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/domain/identity/repository/IdentityRepository.kt @@ -1,17 +1,17 @@ package com.github.diegoberaldin.raccoonforlemmy.domain.identity.repository +import com.github.diegoberaldin.raccoonforlemmy.domain.lemmy.data.UserModel import kotlinx.coroutines.flow.StateFlow interface IdentityRepository { val authToken: StateFlow val isLogged: StateFlow + val cachedUser: UserModel? suspend fun startup() - fun storeToken( - jwt: String, - ) + fun storeToken(jwt: String) fun clearToken() diff --git a/domain/identity/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/domain/identity/usecase/DefaultLoginUseCase.kt b/domain/identity/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/domain/identity/usecase/DefaultLoginUseCase.kt index 7a40811a9..b736eb10f 100644 --- a/domain/identity/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/domain/identity/usecase/DefaultLoginUseCase.kt +++ b/domain/identity/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/domain/identity/usecase/DefaultLoginUseCase.kt @@ -41,6 +41,7 @@ internal class DefaultLoginUseCase( } else { val accountSettings = siteRepository.getAccountSettings(auth) identityRepository.storeToken(auth) + identityRepository.refreshLoggedState() val account = AccountModel( username = username, diff --git a/domain/identity/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/domain/identity/usecase/DefaultSwitchAccountUseCase.kt b/domain/identity/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/domain/identity/usecase/DefaultSwitchAccountUseCase.kt index abfe1eb4a..6953994d3 100644 --- a/domain/identity/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/domain/identity/usecase/DefaultSwitchAccountUseCase.kt +++ b/domain/identity/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/domain/identity/usecase/DefaultSwitchAccountUseCase.kt @@ -28,6 +28,7 @@ internal class DefaultSwitchAccountUseCase( notificationCenter.send(NotificationCenterEvent.Logout) serviceProvider.changeInstance(instance) identityRepository.storeToken(jwt) + identityRepository.refreshLoggedState() val newSettings = settingsRepository.getSettings(accountId) settingsRepository.changeCurrentSettings(newSettings) diff --git a/unit/myaccount/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/myaccount/ProfileLoggedViewModel.kt b/unit/myaccount/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/myaccount/ProfileLoggedViewModel.kt index 99f44087f..6ec16297a 100644 --- a/unit/myaccount/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/myaccount/ProfileLoggedViewModel.kt +++ b/unit/myaccount/src/commonMain/kotlin/com/github/diegoberaldin/raccoonforlemmy/unit/myaccount/ProfileLoggedViewModel.kt @@ -98,9 +98,19 @@ class ProfileLoggedViewModel( }.launchIn(this) if (uiState.value.posts.isEmpty()) { - withContext(Dispatchers.IO) { - refreshUser() - refresh(initial = true) + val userFromCache = identityRepository.cachedUser + if (userFromCache != null) { + updateState { + it.copy( + user = userFromCache, + initial = false, + ) + } + } else { + withContext(Dispatchers.IO) { + refreshUser() + refresh(initial = true) + } } } }