main #6

Closed
student-20690 wants to merge 20 commits from (deleted):main into main
8 changed files with 48 additions and 11 deletions
Showing only changes of commit 474b282fbb - Show all commits

View File

@@ -6,13 +6,16 @@ import ru.myitschool.work.data.source.NetworkDataSource
object AuthRepository { object AuthRepository {
private var codeCache: String? = null private var codeCache: String? = null
// TODO: разобраться с контекстом
suspend fun checkAndSave(text: String): Result<Boolean> { suspend fun checkAndSave(text: String): Result<Boolean> {
return NetworkDataSource.checkAuth(text).onSuccess { success -> /* return NetworkDataSource.checkAuth(text).onSuccess { success ->
if (success) { if (success) {
codeCache = text codeCache = text
createAuthCode(context = appContext, code = text) createAuthCode(code = text)
} }
} }
} */
codeCache = text
createAuthCode(code = text)
return Result.success(true) // TODO: ВЕРНУТЬ СЕТЕВОЙ ЗАПРОС
} }
} }

View File

@@ -1,26 +1,34 @@
package ru.myitschool.work.data.source package ru.myitschool.work.data.source
import android.content.Context import android.content.Context
import android.util.Log
import androidx.compose.material3.rememberTimePickerState
import androidx.datastore.core.DataStore import androidx.datastore.core.DataStore
import androidx.datastore.preferences.core.Preferences import androidx.datastore.preferences.core.Preferences
import androidx.datastore.preferences.core.stringPreferencesKey import androidx.datastore.preferences.core.stringPreferencesKey
import androidx.datastore.preferences.preferencesDataStore import androidx.datastore.preferences.preferencesDataStore
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.map
import ru.myitschool.work.App
import ru.myitschool.work.core.OurConstants.DS_AUTH_KEY import ru.myitschool.work.core.OurConstants.DS_AUTH_KEY
val Context.dataStore: DataStore<Preferences> by preferencesDataStore(name = "auth") val Context.dataStore: DataStore<Preferences> by preferencesDataStore(name = "auth")
val AUTH_KEY = stringPreferencesKey(DS_AUTH_KEY) val AUTH_KEY = stringPreferencesKey(DS_AUTH_KEY)
object DataStoreDataSource { object DataStoreDataSource {
fun authFlow(context : Context): Flow<String> = context.dataStore.data.map { preferences -> fun authFlow(): Flow<String> {
Log.d("AnnaKonda", "Code is checking")
return App.context.dataStore.data.map { preferences ->
(preferences[AUTH_KEY] ?: 0).toString() (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 -> it.toMutablePreferences().also { preferences ->
preferences[AUTH_KEY] = code preferences[AUTH_KEY] = code
Log.d("AnnaKonda", "Code added to ds")
} }
} }
} }

View File

@@ -8,12 +8,15 @@ import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.material3.Scaffold import androidx.compose.material3.Scaffold
import androidx.compose.ui.Modifier 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.screen.AppNavHost
import ru.myitschool.work.ui.theme.WorkTheme import ru.myitschool.work.ui.theme.WorkTheme
class RootActivity : ComponentActivity() { class RootActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
App.context = applicationContext
enableEdgeToEdge() enableEdgeToEdge()
setContent { setContent {
WorkTheme { WorkTheme {

View File

@@ -11,10 +11,12 @@ import androidx.navigation.NavHostController
import androidx.navigation.compose.NavHost import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController 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.AuthScreenDestination
import ru.myitschool.work.ui.nav.BookScreenDestination import ru.myitschool.work.ui.nav.BookScreenDestination
import ru.myitschool.work.ui.nav.MainScreenDestination import ru.myitschool.work.ui.nav.MainScreenDestination
import ru.myitschool.work.ui.screen.auth.AuthScreen 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.book.BookScreen
import ru.myitschool.work.ui.screen.main.MainScreen import ru.myitschool.work.ui.screen.main.MainScreen

View File

@@ -3,4 +3,5 @@ package ru.myitschool.work.ui.screen.auth
sealed interface AuthIntent { sealed interface AuthIntent {
data class Send(val text: String): AuthIntent data class Send(val text: String): AuthIntent
data class TextInput(val text: String): AuthIntent data class TextInput(val text: String): AuthIntent
object CheckLogIntent: AuthIntent
} }

View File

@@ -39,13 +39,13 @@ fun AuthScreen(
navController: NavController navController: NavController
) { ) {
val state by viewModel.uiState.collectAsState() val state by viewModel.uiState.collectAsState()
viewModel.onIntent(AuthIntent.CheckLogIntent)
LaunchedEffect(Unit) { LaunchedEffect(Unit) {
viewModel.actionFlow.collect { viewModel.actionFlow.collect {
navController.navigate(MainScreenDestination) navController.navigate(MainScreenDestination)
} }
} }
Column( Column(
modifier = Modifier modifier = Modifier
.fillMaxSize() .fillMaxSize()
@@ -65,6 +65,9 @@ fun AuthScreen(
modifier = Modifier.size(64.dp) modifier = Modifier.size(64.dp)
) )
} }
is AuthState.LoggedIn -> {
navController.navigate(MainScreenDestination)
}
} }
} }
} }
@@ -90,7 +93,7 @@ private fun Content(
Button( Button(
modifier = Modifier.testTag(TestIds.Auth.SIGN_BUTTON).fillMaxWidth(), modifier = Modifier.testTag(TestIds.Auth.SIGN_BUTTON).fillMaxWidth(),
onClick = { 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)) viewModel.onIntent(AuthIntent.Send(inputText))
} }
}, },

View File

@@ -3,4 +3,5 @@ package ru.myitschool.work.ui.screen.auth
sealed interface AuthState { sealed interface AuthState {
object Loading: AuthState object Loading: AuthState
object Data: AuthState object Data: AuthState
object LoggedIn: AuthState
} }

View File

@@ -1,5 +1,6 @@
package ru.myitschool.work.ui.screen.auth package ru.myitschool.work.ui.screen.auth
import android.util.Log
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
@@ -11,6 +12,7 @@ import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.update import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import ru.myitschool.work.data.repo.AuthRepository import ru.myitschool.work.data.repo.AuthRepository
import ru.myitschool.work.data.source.DataStoreDataSource.authFlow
import ru.myitschool.work.domain.auth.CheckAndSaveAuthCodeUseCase import ru.myitschool.work.domain.auth.CheckAndSaveAuthCodeUseCase
class AuthViewModel : ViewModel() { class AuthViewModel : ViewModel() {
@@ -28,7 +30,7 @@ class AuthViewModel : ViewModel() {
_uiState.update { AuthState.Loading } _uiState.update { AuthState.Loading }
checkAndSaveAuthCodeUseCase.invoke(intent.text).fold( checkAndSaveAuthCodeUseCase.invoke(intent.text).fold(
onSuccess = { onSuccess = {
// TODO: Поведение при успехе _uiState.update { AuthState.LoggedIn }
}, },
onFailure = { error -> onFailure = { error ->
error.printStackTrace() error.printStackTrace()
@@ -40,6 +42,20 @@ class AuthViewModel : ViewModel() {
} }
} }
is AuthIntent.TextInput -> Unit 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 }
} }
} }
}
}
}
}
} }