diff --git a/app/build.gradle.kts b/app/build.gradle.kts index a5ccda1..d725b1f 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -48,4 +48,5 @@ dependencies { implementation("io.ktor:ktor-client-content-negotiation:$ktor") implementation("io.ktor:ktor-serialization-kotlinx-json:$ktor") implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.9.0") + implementation("androidx.datastore:datastore-preferences:1.2.0") } diff --git a/app/src/main/java/ru/myitschool/work/data/repo/AuthRepository.kt b/app/src/main/java/ru/myitschool/work/data/repo/AuthRepository.kt index db1293e..ce5d6e5 100644 --- a/app/src/main/java/ru/myitschool/work/data/repo/AuthRepository.kt +++ b/app/src/main/java/ru/myitschool/work/data/repo/AuthRepository.kt @@ -1,17 +1,19 @@ package ru.myitschool.work.data.repo -import android.util.Log +import kotlinx.coroutines.flow.Flow +import ru.myitschool.work.data.source.LocalDataSource import ru.myitschool.work.data.source.NetworkDataSource - object AuthRepository { + suspend fun clearCode() { + LocalDataSource.setCode("") + } - private var codeCache: String? = null - + val isCodePresentFlow: Flow = LocalDataSource.isCodePresentFlow suspend fun checkAndSave(text: String): Result { return NetworkDataSource.checkAuth(text).onSuccess { success -> if (success) { - codeCache = text + LocalDataSource.setCode(text) } } } -} \ No newline at end of file +} diff --git a/app/src/main/java/ru/myitschool/work/data/source/LocalDataSource.kt b/app/src/main/java/ru/myitschool/work/data/source/LocalDataSource.kt new file mode 100644 index 0000000..b6e84e8 --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/data/source/LocalDataSource.kt @@ -0,0 +1,31 @@ +package ru.myitschool.work.data.source + +import android.content.Context +import android.util.Log +import androidx.datastore.preferences.core.edit +import androidx.datastore.preferences.core.stringPreferencesKey +import androidx.datastore.preferences.preferencesDataStore +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.first +import kotlinx.coroutines.flow.map +import ru.myitschool.work.App + +object LocalDataSource { + private val Context.dataStore by preferencesDataStore("user_data") + + object Keys { + val CODE = stringPreferencesKey("Username") + } + + private val appContext get() = App.context + + suspend fun getCode(): String { + return appContext.dataStore.data.map { it[Keys.CODE] ?: "" }.first() + } + + suspend fun setCode(code: String) { + appContext.dataStore.edit { it[Keys.CODE] = code } + } + + val isCodePresentFlow: Flow = appContext.dataStore.data.map { it[Keys.CODE] != "" } +} \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/domain/auth/CheckAndSaveAuthCodeUseCase.kt b/app/src/main/java/ru/myitschool/work/domain/auth/CheckAndSaveAuthCodeUseCase.kt index 012fb6f..e76a418 100644 --- a/app/src/main/java/ru/myitschool/work/domain/auth/CheckAndSaveAuthCodeUseCase.kt +++ b/app/src/main/java/ru/myitschool/work/domain/auth/CheckAndSaveAuthCodeUseCase.kt @@ -1,6 +1,7 @@ package ru.myitschool.work.domain.auth import ru.myitschool.work.data.repo.AuthRepository +import ru.myitschool.work.App class CheckAndSaveAuthCodeUseCase( private val repository: AuthRepository diff --git a/app/src/main/java/ru/myitschool/work/ui/root/RootActivity.kt b/app/src/main/java/ru/myitschool/work/ui/root/RootActivity.kt index d373d0c..67de67e 100644 --- a/app/src/main/java/ru/myitschool/work/ui/root/RootActivity.kt +++ b/app/src/main/java/ru/myitschool/work/ui/root/RootActivity.kt @@ -7,19 +7,27 @@ import androidx.activity.enableEdgeToEdge import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding import androidx.compose.material3.Scaffold +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue import androidx.compose.ui.Modifier +import kotlinx.coroutines.coroutineScope +import kotlinx.coroutines.runBlocking +import ru.myitschool.work.data.repo.AuthRepository import ru.myitschool.work.ui.screen.AppNavHost import ru.myitschool.work.ui.theme.WorkTheme -class RootActivity : ComponentActivity() { +class RootActivity() : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) enableEdgeToEdge() actionBar?.hide() setContent { WorkTheme { + val codePresence by AuthRepository.isCodePresentFlow.collectAsState(false) + Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding -> AppNavHost( + codePresence = codePresence, modifier = Modifier .fillMaxSize() .padding(innerPadding) diff --git a/app/src/main/java/ru/myitschool/work/ui/screen/NavigationGraph.kt b/app/src/main/java/ru/myitschool/work/ui/screen/NavigationGraph.kt index c83595e..58f52ef 100644 --- a/app/src/main/java/ru/myitschool/work/ui/screen/NavigationGraph.kt +++ b/app/src/main/java/ru/myitschool/work/ui/screen/NavigationGraph.kt @@ -5,12 +5,16 @@ import androidx.compose.animation.ExitTransition import androidx.compose.foundation.layout.Box import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.navigation.NavHostController import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import androidx.navigation.compose.rememberNavController +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.launch +import ru.myitschool.work.data.repo.AuthRepository import ru.myitschool.work.ui.nav.AuthScreenDestination import ru.myitschool.work.ui.nav.BookScreenDestination import ru.myitschool.work.ui.nav.MainScreenDestination @@ -19,14 +23,15 @@ import ru.myitschool.work.ui.screen.auth.AuthScreen @Composable fun AppNavHost( modifier: Modifier = Modifier, - navController: NavHostController = rememberNavController() + navController: NavHostController = rememberNavController(), + codePresence: Boolean ) { NavHost( modifier = modifier, enterTransition = { EnterTransition.None }, exitTransition = { ExitTransition.None }, navController = navController, - startDestination = AuthScreenDestination, + startDestination = if (codePresence) MainScreenDestination else AuthScreenDestination, ) { composable { AuthScreen(navController = navController) @@ -36,6 +41,8 @@ fun AppNavHost( contentAlignment = Alignment.Center ) { Text(text = "MAIN") +// LaunchedEffect(Unit) { AuthRepository.clearCode() } + } } composable { diff --git a/app/src/main/java/ru/myitschool/work/ui/screen/auth/AuthViewModel.kt b/app/src/main/java/ru/myitschool/work/ui/screen/auth/AuthViewModel.kt index 9896bd9..1bbb431 100644 --- a/app/src/main/java/ru/myitschool/work/ui/screen/auth/AuthViewModel.kt +++ b/app/src/main/java/ru/myitschool/work/ui/screen/auth/AuthViewModel.kt @@ -14,7 +14,7 @@ import kotlinx.coroutines.launch import ru.myitschool.work.data.repo.AuthRepository import ru.myitschool.work.domain.auth.CheckAndSaveAuthCodeUseCase -class AuthViewModel : ViewModel() { +class AuthViewModel() : ViewModel() { private val checkAndSaveAuthCodeUseCase by lazy { CheckAndSaveAuthCodeUseCase(AuthRepository) } private val _uiState = MutableStateFlow(AuthState.Data) val uiState: StateFlow = _uiState.asStateFlow()