From b70cdbff5636d898b5610024461cfb78f62bb411 Mon Sep 17 00:00:00 2001 From: imglmd Date: Mon, 1 Dec 2025 21:51:56 +0300 Subject: [PATCH] commit --- .../work/data/repo/AuthRepository.kt | 17 +++-- .../work/data/repo/UserRepository.kt | 18 +++--- .../auth/CheckAndSaveAuthCodeUseCase.kt | 3 +- .../work/domain/user/GetUserUseCase.kt | 10 ++- .../ru/myitschool/work/ui/main/MainState.kt | 6 +- .../myitschool/work/ui/main/MainViewModel.kt | 62 ++++++++++++++++--- 6 files changed, 83 insertions(+), 33 deletions(-) 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 eddfc75..c4d8585 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 @@ -6,28 +6,24 @@ import ru.myitschool.work.util.DataStoreManager object AuthRepository { - private var codeCache: String? = null - suspend fun checkAndSaveCode(code: String): MyResult { - return when (val result = NetworkDataSource.checkAuth(code)) { + /*return when (val result = NetworkDataSource.checkAuth(code)) { is MyResult.Success -> { if (result.data) { DataStoreManager.saveAuthCode(code) - codeCache = code MyResult.Success(Unit) } else { MyResult.Error("Неверный код") } } - is MyResult.Error -> { - MyResult.Error(result.error) - } - } + is MyResult.Error -> result + }*/ + DataStoreManager.saveAuthCode(code) + return MyResult.Success(Unit) } suspend fun logOut(): MyResult { return try { DataStoreManager.clearAuthCode() - codeCache = null MyResult.Success(Unit) } catch (e: Exception) { MyResult.Error("Ошибка при выходе") @@ -36,4 +32,7 @@ object AuthRepository { suspend fun checkCode(code: String): MyResult = NetworkDataSource.checkAuth(code) + + suspend fun getSavedCode(): String? = + DataStoreManager.getAuthCode() } \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/data/repo/UserRepository.kt b/app/src/main/java/ru/myitschool/work/data/repo/UserRepository.kt index 213ea4e..9bd7da0 100644 --- a/app/src/main/java/ru/myitschool/work/data/repo/UserRepository.kt +++ b/app/src/main/java/ru/myitschool/work/data/repo/UserRepository.kt @@ -1,5 +1,6 @@ package ru.myitschool.work.data.repo +import ru.myitschool.work.data.dto.UserInfoResponse import ru.myitschool.work.data.source.NetworkDataSource import ru.myitschool.work.domain.MyResult import ru.myitschool.work.domain.user.User @@ -8,16 +9,13 @@ object UserRepository { suspend fun getUserInfo(code: String): MyResult { return when (val result = NetworkDataSource.getUserInfo(code)) { - is MyResult.Success -> { - val dto = result.data - val user = User( - name = dto.name, - imageUrl = dto.photoUrl - ) - MyResult.Success(user) - } - - is MyResult.Error -> MyResult.Error(result.error) + is MyResult.Success -> MyResult.Success(result.data.toUser()) + is MyResult.Error -> result } } + + private fun UserInfoResponse.toUser() = User( + name = name, + imageUrl = photoUrl + ) } \ 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 770be92..5d77e19 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 @@ -8,7 +8,6 @@ class CheckAndSaveAuthCodeUseCase( private val repository: AuthRepository, ) { suspend operator fun invoke(code: String): MyResult { - // return repository.checkAndSaveCode(code) - return MyResult.Success(Unit) + return repository.checkAndSaveCode(code) } } \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/domain/user/GetUserUseCase.kt b/app/src/main/java/ru/myitschool/work/domain/user/GetUserUseCase.kt index e85f569..71fbdab 100644 --- a/app/src/main/java/ru/myitschool/work/domain/user/GetUserUseCase.kt +++ b/app/src/main/java/ru/myitschool/work/domain/user/GetUserUseCase.kt @@ -1,4 +1,12 @@ package ru.myitschool.work.domain.user -class GetUserUseCase { +import ru.myitschool.work.data.repo.UserRepository +import ru.myitschool.work.domain.MyResult + +class GetUserUseCase( + private val repository: UserRepository +) { + suspend operator fun invoke(code: String): MyResult { + return repository.getUserInfo(code) + } } \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/ui/main/MainState.kt b/app/src/main/java/ru/myitschool/work/ui/main/MainState.kt index 86d1c80..a006f55 100644 --- a/app/src/main/java/ru/myitschool/work/ui/main/MainState.kt +++ b/app/src/main/java/ru/myitschool/work/ui/main/MainState.kt @@ -3,5 +3,7 @@ package ru.myitschool.work.ui.main import ru.myitschool.work.domain.user.User data class MainState( - val user: User -) \ No newline at end of file + val user: User = User("", ""), + val isLoading: Boolean = false, + val error: String? = null +) diff --git a/app/src/main/java/ru/myitschool/work/ui/main/MainViewModel.kt b/app/src/main/java/ru/myitschool/work/ui/main/MainViewModel.kt index 2e64c93..11216a0 100644 --- a/app/src/main/java/ru/myitschool/work/ui/main/MainViewModel.kt +++ b/app/src/main/java/ru/myitschool/work/ui/main/MainViewModel.kt @@ -7,40 +7,84 @@ import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.SharedFlow import kotlinx.coroutines.flow.asSharedFlow 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.repo.UserRepository import ru.myitschool.work.domain.MyResult import ru.myitschool.work.domain.auth.LogOutUseCase +import ru.myitschool.work.domain.user.GetUserUseCase import ru.myitschool.work.domain.user.User +import ru.myitschool.work.util.DataStoreManager -class MainViewModel: ViewModel() { +class MainViewModel : ViewModel() { private val logOutUseCase = LogOutUseCase(AuthRepository) + private val getUserUseCase = GetUserUseCase(UserRepository) - private val _mainState = MutableStateFlow(MainState(User("", ""))) + private val _mainState = MutableStateFlow(MainState()) val mainState = _mainState.asStateFlow() private val _navigationEvent = MutableSharedFlow(extraBufferCapacity = 1) val navigationEvent: SharedFlow = _navigationEvent.asSharedFlow() + init { + loadUser() + } sealed class NavigationEvent { data object ToAuth : NavigationEvent() } - - fun onIntent(intent: MainIntent){ - when(intent){ + fun onIntent(intent: MainIntent) { + when (intent) { MainIntent.LogOut -> logOut() - MainIntent.Refresh -> TODO() + MainIntent.Refresh -> loadUser() } } + private fun loadUser() { + viewModelScope.launch { + _mainState.update { it.copy(isLoading = true, error = null) } + val code = DataStoreManager.getAuthCode() + if (code.isNullOrBlank()) { + _navigationEvent.emit(NavigationEvent.ToAuth) + return@launch + } + + when (val result = getUserUseCase(code)) { + is MyResult.Success -> { + _mainState.update { + it.copy( + user = result.data, + isLoading = false, + error = null + ) + } + } + + is MyResult.Error -> { + _mainState.update { + it.copy( + isLoading = false, + error = result.error + ) + } + } + } + } + } private fun logOut() { viewModelScope.launch { - logOutUseCase() - _navigationEvent.emit(NavigationEvent.ToAuth) + when (logOutUseCase()) { + is MyResult.Success -> { + _navigationEvent.emit(NavigationEvent.ToAuth) + } + is MyResult.Error -> { + _mainState.update { it.copy(error = "Ошибка при выходе") } + } + } } } -} +} \ No newline at end of file