main #6
@@ -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: ВЕРНУТЬ СЕТЕВОЙ ЗАПРОС
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
@@ -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))
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
@@ -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 }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user