main #6
@@ -6,13 +6,16 @@ import ru.myitschool.work.data.source.NetworkDataSource
|
||||
|
||||
object AuthRepository {
|
||||
private var codeCache: String? = null
|
||||
// TODO: разобраться с контекстом
|
||||
suspend fun checkAndSave(text: String): Result<Boolean> {
|
||||
return NetworkDataSource.checkAuth(text).onSuccess { success ->
|
||||
/* return NetworkDataSource.checkAuth(text).onSuccess { success ->
|
||||
if (success) {
|
||||
codeCache = text
|
||||
createAuthCode(context = appContext, code = text)
|
||||
createAuthCode(code = text)
|
||||
}
|
||||
}
|
||||
} */
|
||||
codeCache = text
|
||||
createAuthCode(code = text)
|
||||
return Result.success(true) // TODO: ВЕРНУТЬ СЕТЕВОЙ ЗАПРОС
|
||||
}
|
||||
}
|
||||
@@ -1,26 +1,34 @@
|
||||
package ru.myitschool.work.data.source
|
||||
|
||||
import android.content.Context
|
||||
import android.util.Log
|
||||
import androidx.compose.material3.rememberTimePickerState
|
||||
import androidx.datastore.core.DataStore
|
||||
import androidx.datastore.preferences.core.Preferences
|
||||
import androidx.datastore.preferences.core.stringPreferencesKey
|
||||
import androidx.datastore.preferences.preferencesDataStore
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import kotlinx.coroutines.flow.map
|
||||
import ru.myitschool.work.App
|
||||
import ru.myitschool.work.core.OurConstants.DS_AUTH_KEY
|
||||
|
||||
|
||||
val Context.dataStore: DataStore<Preferences> by preferencesDataStore(name = "auth")
|
||||
val AUTH_KEY = stringPreferencesKey(DS_AUTH_KEY)
|
||||
|
||||
object DataStoreDataSource {
|
||||
fun authFlow(context : Context): Flow<String> = context.dataStore.data.map { preferences ->
|
||||
(preferences[AUTH_KEY] ?: 0).toString()
|
||||
fun authFlow(): Flow<String> {
|
||||
Log.d("AnnaKonda", "Code is checking")
|
||||
return App.context.dataStore.data.map { preferences ->
|
||||
(preferences[AUTH_KEY] ?: 0).toString()
|
||||
}
|
||||
}
|
||||
// TODO: разобраться с контекстом
|
||||
suspend fun createAuthCode (context : Context, code : String) {
|
||||
context.dataStore.updateData {
|
||||
|
||||
suspend fun createAuthCode(code: String) {
|
||||
App.context.dataStore.updateData {
|
||||
it.toMutablePreferences().also { preferences ->
|
||||
preferences[AUTH_KEY] = code
|
||||
Log.d("AnnaKonda", "Code added to ds")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,12 +8,15 @@ import androidx.compose.foundation.layout.fillMaxSize
|
||||
import androidx.compose.foundation.layout.padding
|
||||
import androidx.compose.material3.Scaffold
|
||||
import androidx.compose.ui.Modifier
|
||||
import ru.myitschool.work.App
|
||||
import ru.myitschool.work.data.source.DataStoreDataSource.authFlow
|
||||
import ru.myitschool.work.ui.screen.AppNavHost
|
||||
import ru.myitschool.work.ui.theme.WorkTheme
|
||||
|
||||
class RootActivity : ComponentActivity() {
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
App.context = applicationContext
|
||||
enableEdgeToEdge()
|
||||
setContent {
|
||||
WorkTheme {
|
||||
|
||||
@@ -11,10 +11,12 @@ import androidx.navigation.NavHostController
|
||||
import androidx.navigation.compose.NavHost
|
||||
import androidx.navigation.compose.composable
|
||||
import androidx.navigation.compose.rememberNavController
|
||||
import ru.myitschool.work.data.source.DataStoreDataSource.authFlow
|
||||
import ru.myitschool.work.ui.nav.AuthScreenDestination
|
||||
import ru.myitschool.work.ui.nav.BookScreenDestination
|
||||
import ru.myitschool.work.ui.nav.MainScreenDestination
|
||||
import ru.myitschool.work.ui.screen.auth.AuthScreen
|
||||
import ru.myitschool.work.ui.screen.auth.AuthViewModel
|
||||
import ru.myitschool.work.ui.screen.book.BookScreen
|
||||
import ru.myitschool.work.ui.screen.main.MainScreen
|
||||
|
||||
|
||||
@@ -3,4 +3,5 @@ package ru.myitschool.work.ui.screen.auth
|
||||
sealed interface AuthIntent {
|
||||
data class Send(val text: String): AuthIntent
|
||||
data class TextInput(val text: String): AuthIntent
|
||||
object CheckLogIntent: AuthIntent
|
||||
}
|
||||
@@ -39,13 +39,13 @@ fun AuthScreen(
|
||||
navController: NavController
|
||||
) {
|
||||
val state by viewModel.uiState.collectAsState()
|
||||
viewModel.onIntent(AuthIntent.CheckLogIntent)
|
||||
|
||||
LaunchedEffect(Unit) {
|
||||
viewModel.actionFlow.collect {
|
||||
navController.navigate(MainScreenDestination)
|
||||
}
|
||||
}
|
||||
|
||||
Column(
|
||||
modifier = Modifier
|
||||
.fillMaxSize()
|
||||
@@ -65,6 +65,9 @@ fun AuthScreen(
|
||||
modifier = Modifier.size(64.dp)
|
||||
)
|
||||
}
|
||||
is AuthState.LoggedIn -> {
|
||||
navController.navigate(MainScreenDestination)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -90,7 +93,7 @@ private fun Content(
|
||||
Button(
|
||||
modifier = Modifier.testTag(TestIds.Auth.SIGN_BUTTON).fillMaxWidth(),
|
||||
onClick = {
|
||||
if (!inputText.isEmpty() || inputText.length == 4 || inputText.matches(Regex(SHABLON))){
|
||||
if (!inputText.isEmpty() && inputText.length == 4 && inputText.matches(Regex(SHABLON))){
|
||||
viewModel.onIntent(AuthIntent.Send(inputText))
|
||||
}
|
||||
},
|
||||
|
||||
@@ -3,4 +3,5 @@ package ru.myitschool.work.ui.screen.auth
|
||||
sealed interface AuthState {
|
||||
object Loading: AuthState
|
||||
object Data: AuthState
|
||||
object LoggedIn: AuthState
|
||||
}
|
||||
@@ -1,5 +1,6 @@
|
||||
package ru.myitschool.work.ui.screen.auth
|
||||
|
||||
import android.util.Log
|
||||
import androidx.lifecycle.ViewModel
|
||||
import androidx.lifecycle.viewModelScope
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
@@ -11,6 +12,7 @@ import kotlinx.coroutines.flow.asStateFlow
|
||||
import kotlinx.coroutines.flow.update
|
||||
import kotlinx.coroutines.launch
|
||||
import ru.myitschool.work.data.repo.AuthRepository
|
||||
import ru.myitschool.work.data.source.DataStoreDataSource.authFlow
|
||||
import ru.myitschool.work.domain.auth.CheckAndSaveAuthCodeUseCase
|
||||
|
||||
class AuthViewModel : ViewModel() {
|
||||
@@ -28,7 +30,7 @@ class AuthViewModel : ViewModel() {
|
||||
_uiState.update { AuthState.Loading }
|
||||
checkAndSaveAuthCodeUseCase.invoke(intent.text).fold(
|
||||
onSuccess = {
|
||||
// TODO: Поведение при успехе
|
||||
_uiState.update { AuthState.LoggedIn }
|
||||
},
|
||||
onFailure = { error ->
|
||||
error.printStackTrace()
|
||||
@@ -40,6 +42,20 @@ class AuthViewModel : ViewModel() {
|
||||
}
|
||||
}
|
||||
is AuthIntent.TextInput -> Unit
|
||||
is AuthIntent.CheckLogIntent -> {
|
||||
viewModelScope.launch {
|
||||
_uiState.update { AuthState.Loading }
|
||||
authFlow().collect {
|
||||
Log.d("AnnaKonda", it)
|
||||
if (it != "0"){
|
||||
_uiState.update { AuthState.LoggedIn }
|
||||
} else {
|
||||
_uiState.update { AuthState.Data }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user