From 17fd42b316185bb64c7d3fd8ca1e0f0cfced3544 Mon Sep 17 00:00:00 2001 From: aritra Date: Fri, 8 Nov 2024 20:59:07 +0530 Subject: [PATCH] Impl. datastore to save username locally --- .../com/aritradas/uncrack/di/AppModule.kt | 12 ++++++ .../uncrack/presentation/vault/VaultScreen.kt | 1 + .../uncrack/sharedViewModel/UserViewModel.kt | 38 ++++++++++++++++++- 3 files changed, 49 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/aritradas/uncrack/di/AppModule.kt b/app/src/main/java/com/aritradas/uncrack/di/AppModule.kt index 6deba76..df01ca3 100644 --- a/app/src/main/java/com/aritradas/uncrack/di/AppModule.kt +++ b/app/src/main/java/com/aritradas/uncrack/di/AppModule.kt @@ -2,6 +2,10 @@ package com.aritradas.uncrack.di import android.app.Application import android.content.Context +import androidx.datastore.core.DataStore +import androidx.datastore.preferences.core.PreferenceDataStoreFactory +import androidx.datastore.preferences.core.Preferences +import androidx.datastore.preferences.preferencesDataStoreFile import androidx.room.Room import com.aritradas.uncrack.data.datastore.DataStoreUtil import com.aritradas.uncrack.data.db.AccountDatabase @@ -76,4 +80,12 @@ object AppModule { @Provides @Singleton fun provideFirebaseFirestore(): FirebaseFirestore = FirebaseFirestore.getInstance() + + @Provides + @Singleton + fun provideDataStore(@ApplicationContext appContext: Context): DataStore { + return PreferenceDataStoreFactory.create( + produceFile = { appContext.preferencesDataStoreFile("user_preferences") } + ) + } } \ No newline at end of file diff --git a/app/src/main/java/com/aritradas/uncrack/presentation/vault/VaultScreen.kt b/app/src/main/java/com/aritradas/uncrack/presentation/vault/VaultScreen.kt index 511f5d5..3b58c20 100644 --- a/app/src/main/java/com/aritradas/uncrack/presentation/vault/VaultScreen.kt +++ b/app/src/main/java/com/aritradas/uncrack/presentation/vault/VaultScreen.kt @@ -58,6 +58,7 @@ fun VaultScreen( LaunchedEffect(Unit) { vaultViewModel.getAccounts() + userViewModel.getCurrentUser() } Scaffold( diff --git a/app/src/main/java/com/aritradas/uncrack/sharedViewModel/UserViewModel.kt b/app/src/main/java/com/aritradas/uncrack/sharedViewModel/UserViewModel.kt index b4780af..8d6e8cf 100644 --- a/app/src/main/java/com/aritradas/uncrack/sharedViewModel/UserViewModel.kt +++ b/app/src/main/java/com/aritradas/uncrack/sharedViewModel/UserViewModel.kt @@ -1,5 +1,9 @@ package com.aritradas.uncrack.sharedViewModel +import androidx.datastore.core.DataStore +import androidx.datastore.preferences.core.Preferences +import androidx.datastore.preferences.core.edit +import androidx.datastore.preferences.core.stringPreferencesKey import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.aritradas.uncrack.domain.model.User @@ -10,6 +14,7 @@ import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.first import kotlinx.coroutines.launch import kotlinx.coroutines.tasks.await import timber.log.Timber @@ -18,22 +23,37 @@ import javax.inject.Inject @HiltViewModel class UserViewModel @Inject constructor( private val auth: FirebaseAuth, - private val firestore: FirebaseFirestore + private val firestore: FirebaseFirestore, + private val dataStore: DataStore ) : ViewModel() { private val _state = MutableStateFlow(User()) val state: StateFlow = _state init { + loadUserFromDataStore() getCurrentUser() } - private fun getCurrentUser() = viewModelScope.launch(Dispatchers.IO) { + private fun loadUserFromDataStore() { + viewModelScope.launch(Dispatchers.IO) { + try { + val userNamePreference = dataStore.data.first() + val userName = userNamePreference[USER_NAME_KEY] ?: "" + _state.value = _state.value.copy(name = userName) + } catch (e: Exception) { + Timber.e("Error loading user name from DataStore: $e") + } + } + } + + fun getCurrentUser() = viewModelScope.launch(Dispatchers.IO) { try { val currentUser = auth.currentUser if (currentUser != null) { val user = fetchUserFromFirestore(currentUser.uid) _state.value = user + saveUserNameToDataStore(user.name) } else { Timber.e("No user is currently logged in") } @@ -57,4 +77,18 @@ class UserViewModel @Inject constructor( User() } } + + private suspend fun saveUserNameToDataStore(userName: String) { + try { + dataStore.edit { preferences -> + preferences[USER_NAME_KEY] = userName + } + } catch (e: Exception) { + Timber.e("Error saving user name to DataStore: $e") + } + } + + companion object { + private val USER_NAME_KEY = stringPreferencesKey("user_name") + } }