From 48110115dc8d664e7dfe5a8ba078ca388f22024d Mon Sep 17 00:00:00 2001 From: v228a Date: Thu, 20 Feb 2025 14:16:36 +0300 Subject: [PATCH] =?UTF-8?q?=D0=AD=D0=BA=D1=80=D0=B0=D0=BD=20=D0=B2=D0=B2?= =?UTF-8?q?=D0=BE=D0=B4=D0=B0=20=D0=B4=D0=B0=D0=BD=D0=BD=D1=8B=D1=85=20?= =?UTF-8?q?=D1=81=D0=BE=D1=82=D1=80=D1=83=D0=B4=D0=BD=D0=B8=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../work/ui/searchuser/SearchUserFragment.kt | 42 ++++++++++--- .../work/ui/searchuser/SearchUserViewModel.kt | 59 ++++++++++++++++++- .../res/layout-land/fragment_search_user.xml | 13 ++++ app/src/main/res/layout/fragment_login.xml | 1 + .../main/res/layout/fragment_search_user.xml | 52 ++++++++++++---- 5 files changed, 145 insertions(+), 22 deletions(-) diff --git a/app/src/main/java/ru/myitschool/work/ui/searchuser/SearchUserFragment.kt b/app/src/main/java/ru/myitschool/work/ui/searchuser/SearchUserFragment.kt index c4b60cb..b3eead4 100644 --- a/app/src/main/java/ru/myitschool/work/ui/searchuser/SearchUserFragment.kt +++ b/app/src/main/java/ru/myitschool/work/ui/searchuser/SearchUserFragment.kt @@ -1,6 +1,8 @@ package ru.myitschool.work.ui.searchuser import android.os.Bundle +import ru.myitschool.work.utils.collectWhenStarted +import ru.myitschool.work.utils.visibleOrGone import android.view.View import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels @@ -9,7 +11,6 @@ import dagger.hilt.android.AndroidEntryPoint import ru.myitschool.work.R import ru.myitschool.work.databinding.FragmentSearchUserBinding import ru.myitschool.work.ui.profile.ProfileDestination -import ru.myitschool.work.utils.collectWhenStarted @AndroidEntryPoint @@ -18,7 +19,6 @@ class SearchUserFragment : Fragment(R.layout.fragment_search_user) { private var _binding: FragmentSearchUserBinding? = null private val binding: FragmentSearchUserBinding get() = _binding!! - private val viewModel: SearchUserViewModel by viewModels() override fun onViewCreated(view: View, savedInstanceState: Bundle?) { @@ -27,11 +27,18 @@ class SearchUserFragment : Fragment(R.layout.fragment_search_user) { initCallback() subscribe() + // Set the initial state to not show the loading state - } - + } private fun initCallback() { binding.floatingActionButton2.setOnClickListener { viewModel.closeSearchUser() } + binding.login.setOnClickListener { + // Clear error text before starting search + binding.error?.text = "" + // Set loading state before calling search method + viewModel.setLoadingState() + viewModel.searchUser(binding.username.text.toString()) + } } private fun subscribe() { @@ -44,9 +51,30 @@ class SearchUserFragment : Fragment(R.layout.fragment_search_user) { } } } + + viewModel.state.collectWhenStarted(this) { state -> + //binding.loading?.visibleOrGone(state is SearchUserViewModel.State.Loading) + // Manage visibility of progress bar and error text + binding.error?.visibleOrGone(state is SearchUserViewModel.State.Error) + //binding.loading?.visibility = View.GONE + + when (state) { + //TODO ПОчинить прогресс бар + is SearchUserViewModel.State.Error -> { + // Set error text + binding.error?.text = state.errorText.localizedMessage + // binding.loading?.visibility = View.GONE + } + is SearchUserViewModel.State.Loading -> { + // Additional logic can be added here if needed + // binding.loading?.visibility = View.VISIBLE + } + } + } } - + override fun onDestroyView() { + super.onDestroyView() + _binding = null // Release binding to avoid memory leaks } - - +} \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/ui/searchuser/SearchUserViewModel.kt b/app/src/main/java/ru/myitschool/work/ui/searchuser/SearchUserViewModel.kt index a0e8924..4580c5b 100644 --- a/app/src/main/java/ru/myitschool/work/ui/searchuser/SearchUserViewModel.kt +++ b/app/src/main/java/ru/myitschool/work/ui/searchuser/SearchUserViewModel.kt @@ -1,12 +1,17 @@ package ru.myitschool.work.ui.searchuser import android.content.Context +import android.util.Log import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.qualifiers.ApplicationContext +import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asSharedFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch +import ru.myitschool.work.R import ru.myitschool.work.utils.MutablePublishFlow import javax.inject.Inject @@ -17,12 +22,62 @@ class SearchUserViewModel @Inject constructor( private val _action = MutablePublishFlow() val action = _action.asSharedFlow() - fun closeSearchUser(){ + private val _state = MutableStateFlow( + initialState + ) + val state = _state.asStateFlow() + + fun closeSearchUser() { viewModelScope.launch { _action.emit(Action.OpenProfile) } } + + fun setLoadingState() { + viewModelScope.launch { + _state.update { State.Loading } + } + } + + fun searchUser(userName: String) { + viewModelScope.launch { + setLoadingState() + // Simulating delay for data retrieval + kotlinx.coroutines.delay(1000) // Delay for 1 second + + // Mock user check + val existingUsers = listOf("user1", "user2", "user3") // Mock users + val userExists = existingUsers.contains(userName) + + if (userExists) { + // If user exists, log their name + Log.d("SearchUser ViewModel", "User found: $userName") + // Here you can update the state if needed + } else { + // If user does not exist, update state with error + val errorText = context.resources.getString(R.string.login_error) + _state.update { + State.Error( + errorText = Throwable("User not found: $errorText") + ) + } + } + } + } + sealed interface Action { - data object OpenProfile: Action + data object OpenProfile : Action + } + + sealed interface State { + data object Loading : State + + data class Error( + val errorText: Throwable, + ) : State + } + + companion object { + val initialState = State.Loading } } \ No newline at end of file diff --git a/app/src/main/res/layout-land/fragment_search_user.xml b/app/src/main/res/layout-land/fragment_search_user.xml index 6ab46bc..6c24f7e 100644 --- a/app/src/main/res/layout-land/fragment_search_user.xml +++ b/app/src/main/res/layout-land/fragment_search_user.xml @@ -3,6 +3,19 @@ android:layout_width="match_parent" android:layout_height="match_parent" xmlns:app="http://schemas.android.com/apk/res-auto"> + + + diff --git a/app/src/main/res/layout/fragment_search_user.xml b/app/src/main/res/layout/fragment_search_user.xml index 8ae3527..52ad77c 100644 --- a/app/src/main/res/layout/fragment_search_user.xml +++ b/app/src/main/res/layout/fragment_search_user.xml @@ -3,11 +3,25 @@ android:layout_width="match_parent" android:layout_height="match_parent" xmlns:app="http://schemas.android.com/apk/res-auto"> + + + + + + + + + + + + android:visibility="visible"> + + + + app:layout_constraintWidth_percent="0.8"> - + android:maxLines="1"> +