feat: implement logout functionality and settings provider

This commit is contained in:
2026-05-13 22:17:50 +02:00
parent d3b66d4fc5
commit 7ec9a0f41f
6 changed files with 70 additions and 9 deletions

View File

@@ -16,6 +16,7 @@ interface UserSessionRepository {
val isLoggedIn: Flow<Boolean> val isLoggedIn: Flow<Boolean>
suspend fun setLoggedIn(isLoggedIn: Boolean) suspend fun setLoggedIn(isLoggedIn: Boolean)
suspend fun logout()
val isOfflineMode: Flow<Boolean> val isOfflineMode: Flow<Boolean>
} }

View File

@@ -288,7 +288,7 @@ class AppViewModel @Inject constructor(
fun logout() { fun logout() {
viewModelScope.launch { viewModelScope.launch {
userSessionRepository.setLoggedIn(false) userSessionRepository.logout()
} }
} }
} }

View File

@@ -0,0 +1,35 @@
package hu.bbara.purefin.core.feature.settings
import hu.bbara.purefin.core.data.UserSessionRepository
import hu.bbara.purefin.core.settings.SettingGroup
import hu.bbara.purefin.core.settings.SettingsGroupProvider
import hu.bbara.purefin.core.settings.VoidSetting
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flowOf
import javax.inject.Inject
import javax.inject.Singleton
@Singleton
class LogoutSettingsProvider @Inject constructor(
private val userSessionRepository: UserSessionRepository
) : SettingsGroupProvider {
override val settingGroups: Flow<List<SettingGroup>> = flowOf(
listOf(
SettingGroup(
title = "Account",
options = listOf(
VoidSetting(
key = LOGOUT_KEY,
title = "Log out",
onClick = { userSessionRepository.logout() }
)
)
)
)
)
private companion object {
const val LOGOUT_KEY = "logout"
}
}

View File

@@ -0,0 +1,22 @@
package hu.bbara.purefin.core.settings
import dagger.Binds
import dagger.Module
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import dagger.multibindings.IntoSet
import hu.bbara.purefin.core.feature.settings.LogoutSettingsProvider
import hu.bbara.purefin.core.feature.update.AppUpdateController
@Module
@InstallIn(SingletonComponent::class)
abstract class SettingsGroupProviderModule {
@Binds
@IntoSet
abstract fun bindAppUpdateSettingsProvider(impl: AppUpdateController): SettingsGroupProvider
@Binds
@IntoSet
abstract fun bindLogoutSettingsProvider(impl: LogoutSettingsProvider): SettingsGroupProvider
}

View File

@@ -4,11 +4,8 @@ import dagger.Binds
import dagger.Module import dagger.Module
import dagger.hilt.InstallIn import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent import dagger.hilt.components.SingletonComponent
import dagger.multibindings.IntoSet
import hu.bbara.purefin.core.feature.update.AppUpdateController
import hu.bbara.purefin.core.feature.update.AppUpdateInstaller import hu.bbara.purefin.core.feature.update.AppUpdateInstaller
import hu.bbara.purefin.core.feature.update.AppVersionProvider import hu.bbara.purefin.core.feature.update.AppVersionProvider
import hu.bbara.purefin.core.settings.SettingsGroupProvider
@Module @Module
@InstallIn(SingletonComponent::class) @InstallIn(SingletonComponent::class)
@@ -19,8 +16,4 @@ abstract class AppUpdateModule {
@Binds @Binds
abstract fun bindAppVersionProvider(impl: AndroidAppVersionProvider): AppVersionProvider abstract fun bindAppVersionProvider(impl: AndroidAppVersionProvider): AppVersionProvider
@Binds
@IntoSet
abstract fun bindAppUpdateSettingsProvider(impl: AppUpdateController): SettingsGroupProvider
} }

View File

@@ -51,5 +51,15 @@ class DataStoreUserSessionRepository @Inject constructor(
} }
} }
override suspend fun logout() {
userSessionDataStore.updateData {
it.copy(
accessToken = "",
userId = null,
loggedIn = false
)
}
}
override val isOfflineMode: Flow<Boolean> = session.map { it.isOfflineMode }.distinctUntilChanged() override val isOfflineMode: Flow<Boolean> = session.map { it.isOfflineMode }.distinctUntilChanged()
} }