From 1af9aad25b13d4d3fe197bb7869eb461de9e3fb1 Mon Sep 17 00:00:00 2001 From: Niktia Date: Thu, 20 Feb 2025 16:25:58 +0300 Subject: [PATCH] adminFragment --- .../work/domain/user/GetUserUseCase.kt | 3 +- .../myitschool/work/ui/admin/AdminFragment.kt | 56 ++++++++++++------ .../work/ui/admin/AdminViewModel.kt | 57 ++++++++++++++----- .../work/ui/profile/ProfileFragment.kt | 1 + .../work/ui/profile/ProfileViewModel.kt | 2 +- .../main/res/navigation/main_nav_graph.xml | 4 +- 6 files changed, 88 insertions(+), 35 deletions(-) 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 f49a288..0106108 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 @@ -10,7 +10,8 @@ class GetUserUseCase( private fun getUserFromStorage() : UserDto? { return authStorageDataSource.userInfo } - suspend operator fun invoke() = repo.getUser(getUserFromStorage()?.login!!) + suspend operator fun invoke(user_login : String?) = repo.getUser(user_login + ?: getUserFromStorage()?.login!!) suspend fun getEntrancesList() = repo.getEntrancesList(getUserFromStorage()?.login!!) } \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/ui/admin/AdminFragment.kt b/app/src/main/java/ru/myitschool/work/ui/admin/AdminFragment.kt index 7225a7b..1641e06 100644 --- a/app/src/main/java/ru/myitschool/work/ui/admin/AdminFragment.kt +++ b/app/src/main/java/ru/myitschool/work/ui/admin/AdminFragment.kt @@ -1,5 +1,6 @@ package ru.myitschool.work.ui.admin +import android.annotation.SuppressLint import android.os.Bundle import android.view.View import androidx.fragment.app.Fragment @@ -12,6 +13,7 @@ import ru.myitschool.work.databinding.FragmentAdminBinding import ru.myitschool.work.databinding.FragmentProfileBinding import ru.myitschool.work.ui.profile.ProfileViewModel import ru.myitschool.work.utils.collectWithLifecycle +import ru.sicampus.bootcamp2025.ui.centerList.EntranceAdapter class AdminFragment : Fragment(R.layout.fragment_admin) { private var _viewBinding: FragmentAdminBinding? = null @@ -19,27 +21,47 @@ class AdminFragment : Fragment(R.layout.fragment_admin) { private val viewModel by viewModels { AdminViewModel.Factory } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { _viewBinding = FragmentAdminBinding.bind(view) super.onViewCreated(view, savedInstanceState) + val adapter = EntranceAdapter() + viewBinding.recyclerView.adapter = adapter -// -// viewModel.state.collectWithLifecycle(this) { state -> -// -// viewBinding.error.visibility = if (state is AdminViewModel.State.Error) View.VISIBLE else View.GONE -// -// -// when(state) { -// is AdminViewModel.State.Loading -> Unit -// is AdminViewModel.State.GoToInfo -> { -// findNavController().navigate() -// } -// is ProfileViewModel.State.Error -> { -// viewBinding.errorText.text = state.text -// } -// } -// -// } + viewBinding.findButton.setOnClickListener { + val login = viewBinding.userLogin.text.toString() + viewModel.search(login) + } + + + viewModel.state.collectWithLifecycle(this) { state -> + + viewBinding.error.visibility = if (state is AdminViewModel.State.Error) View.VISIBLE else View.GONE + + + when(state) { + is AdminViewModel.State.Loading -> Unit + is AdminViewModel.State.Show -> { + viewBinding.noData.visibility = View.GONE + viewBinding.name.text = "Должность: ${state.profileInfo.position}" + if (state.profileInfo.lastEntry == null) viewBinding.lastEntry.text = "Время последнего входа: Нет данных" + else viewBinding.lastEntry.text = "Время последнего входа: ${state.profileInfo.lastEntry}" + Picasso.get().load(state.profileInfo.avatarUrl).resize(100, 100).centerCrop().into(viewBinding.imageView) + + if (state.entrancesList.isEmpty()) { + viewBinding.noData.visibility = View.VISIBLE + } + else { + viewBinding.recyclerView.visibility = View.VISIBLE + adapter.submitList(state.entrancesList) + + } + } + is AdminViewModel.State.Error -> { + viewBinding.errorText.text = state.text + } + } + } } override fun onDestroyView() { diff --git a/app/src/main/java/ru/myitschool/work/ui/admin/AdminViewModel.kt b/app/src/main/java/ru/myitschool/work/ui/admin/AdminViewModel.kt index 843fd2b..0b230bc 100644 --- a/app/src/main/java/ru/myitschool/work/ui/admin/AdminViewModel.kt +++ b/app/src/main/java/ru/myitschool/work/ui/admin/AdminViewModel.kt @@ -15,6 +15,7 @@ import ru.myitschool.work.domain.user.EntranceEntity import ru.myitschool.work.domain.user.GetUserUseCase import ru.myitschool.work.domain.user.UnBlockUseCase import ru.myitschool.work.domain.user.UserEntity +import ru.myitschool.work.ui.profile.ProfileViewModel.State class AdminViewModel( private val getUserUseCase: GetUserUseCase, @@ -24,15 +25,9 @@ class AdminViewModel( private val _state = MutableStateFlow(State.Loading) val state = _state.asStateFlow() - init { - updateStateGet() - } - - fun clickRefresh() { - updateStateGet() - } - - fun updateStateGet() { + fun search( + login : String, + ) { viewModelScope.launch { _state.emit(State.Loading) val entranceList : List = getUserUseCase.getEntrancesList().fold( @@ -44,22 +39,54 @@ class AdminViewModel( } ) _state.emit( - getUserUseCase.invoke().fold( + getUserUseCase.invoke(login).fold( onSuccess = { data -> Log.d("uraa", "успех успех ${data.toString()}") - State.GoToInfo(data, entranceList) + State.Show(data, entranceList) }, onFailure = { error -> Log.d("kaput", error.message.toString()) State.Error(error.message.toString()) } - ) + ) as State ) - _state.emit(State.Error("о нет ошибка ошибка помогите")) + _state.emit(State.Error("Не удалось загрузить профиль")) } } +// fun clickRefresh() { +// updateStateGet() +// } + +// fun updateStateGet() { +// viewModelScope.launch { +// _state.emit(State.Loading) +// val entranceList : List = getUserUseCase.getEntrancesList().fold( +// onSuccess = { list -> +// list +// }, +// onFailure = { +// emptyList() +// } +// ) +// _state.emit( +// getUserUseCase.invoke().fold( +// onSuccess = { data -> +// Log.d("uraa", "успех успех ${data.toString()}") +// +// State.Show(data, entranceList) +// }, +// onFailure = { error -> +// Log.d("kaput", error.message.toString()) +// State.Error(error.message.toString()) +// } +// ) as State +// ) +// _state.emit(State.Error("о нет ошибка ошибка помогите")) +// } +// } + suspend fun blockUser() { blockUseCase.invoke().fold( onSuccess = { data -> @@ -86,8 +113,8 @@ class AdminViewModel( sealed interface State { data object Loading: State - data class GoToInfo( - val profileInfo: UserEntity, + data class Show( + val profileInfo : UserEntity, val entrancesList : List ) : State data class Error( diff --git a/app/src/main/java/ru/myitschool/work/ui/profile/ProfileFragment.kt b/app/src/main/java/ru/myitschool/work/ui/profile/ProfileFragment.kt index 64dca72..2735970 100644 --- a/app/src/main/java/ru/myitschool/work/ui/profile/ProfileFragment.kt +++ b/app/src/main/java/ru/myitschool/work/ui/profile/ProfileFragment.kt @@ -1,5 +1,6 @@ package ru.myitschool.work.ui.profile +import android.annotation.SuppressLint import android.content.Intent import android.os.Bundle import android.util.Log diff --git a/app/src/main/java/ru/myitschool/work/ui/profile/ProfileViewModel.kt b/app/src/main/java/ru/myitschool/work/ui/profile/ProfileViewModel.kt index 66fc4af..9946527 100644 --- a/app/src/main/java/ru/myitschool/work/ui/profile/ProfileViewModel.kt +++ b/app/src/main/java/ru/myitschool/work/ui/profile/ProfileViewModel.kt @@ -41,7 +41,7 @@ class ProfileViewModel( } ) _state.emit( - getUserUseCase.invoke().fold( + getUserUseCase.invoke(null).fold( onSuccess = { data -> Log.d("uraa", "успех успех ${data.toString()}") State.Show(data, entranceList) diff --git a/app/src/main/res/navigation/main_nav_graph.xml b/app/src/main/res/navigation/main_nav_graph.xml index def8425..20bd97a 100644 --- a/app/src/main/res/navigation/main_nav_graph.xml +++ b/app/src/main/res/navigation/main_nav_graph.xml @@ -34,7 +34,9 @@ tools:layout="@layout/fragment_qr_result" > + app:destination="@id/fragment_profile" + app:popUpTo="@id/fragment_qr_result" + app:popUpToInclusive="true"/>