From 5297d47340c2c0773b9cbe4abea4da607d42e8cd Mon Sep 17 00:00:00 2001 From: a1pha Date: Thu, 20 Feb 2025 16:54:50 +0300 Subject: [PATCH] feat: last commit --- .../work/data/PassRepositoryImpl.kt | 1 + .../work/data/UserRepositoryImpl.kt | 2 +- .../ru/myitschool/work/data/dto/PassDto.kt | 4 +- .../data/network/AdminNetworkDataSource.kt | 4 +- .../data/network/UserNetworkDataSource.kt | 4 +- .../work/ui/admin/search/AdminFragment.kt | 4 +- .../work/ui/admin/search/AdminViewModel.kt | 26 +++--- .../ui/admin/view/ViewUserAsAdminFragment.kt | 39 ++++----- .../work/ui/profile/PassesListAdapter.kt | 12 +-- .../work/ui/profile/PassesPagingSource.kt | 5 +- .../work/ui/profile/UserFragment.kt | 81 ++++++++----------- .../work/ui/profile/UserViewModel.kt | 13 ++- .../res/drawable/ic_launcher_background.xml | 74 +++++++++++++++++ .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 +- 14 files changed, 171 insertions(+), 103 deletions(-) create mode 100644 app/src/main/res/drawable/ic_launcher_background.xml diff --git a/app/src/main/java/ru/myitschool/work/data/PassRepositoryImpl.kt b/app/src/main/java/ru/myitschool/work/data/PassRepositoryImpl.kt index ca276f1..d93497f 100644 --- a/app/src/main/java/ru/myitschool/work/data/PassRepositoryImpl.kt +++ b/app/src/main/java/ru/myitschool/work/data/PassRepositoryImpl.kt @@ -1,5 +1,6 @@ package ru.myitschool.work.data +import android.util.Log import ru.myitschool.work.data.dto.PassDto import ru.myitschool.work.data.local.CredentialsLocalDataSource import ru.myitschool.work.data.network.PassNetworkDataSource diff --git a/app/src/main/java/ru/myitschool/work/data/UserRepositoryImpl.kt b/app/src/main/java/ru/myitschool/work/data/UserRepositoryImpl.kt index 73d44e9..f2e8648 100644 --- a/app/src/main/java/ru/myitschool/work/data/UserRepositoryImpl.kt +++ b/app/src/main/java/ru/myitschool/work/data/UserRepositoryImpl.kt @@ -77,7 +77,7 @@ class UserRepositoryImpl( override suspend fun getUserByLogin(login: String): Result { return networkDataSource.getUserByLogin(login, credentialsLocalDataSource.getToken()).fold( - onSuccess = { map(it) }, onFailure = { error(it) } + onSuccess = { map(it) }, onFailure = { Result.failure(it) } ) } } \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/data/dto/PassDto.kt b/app/src/main/java/ru/myitschool/work/data/dto/PassDto.kt index 9acbd39..bba3323 100644 --- a/app/src/main/java/ru/myitschool/work/data/dto/PassDto.kt +++ b/app/src/main/java/ru/myitschool/work/data/dto/PassDto.kt @@ -6,9 +6,9 @@ import kotlinx.serialization.Serializable @Serializable data class PassDto( - @SerialName("time") - val time: String?, @SerialName("localDateTime") + val time: String?, + @SerialName("terminal") val terminal: TerminalDto? ) diff --git a/app/src/main/java/ru/myitschool/work/data/network/AdminNetworkDataSource.kt b/app/src/main/java/ru/myitschool/work/data/network/AdminNetworkDataSource.kt index 58c91c6..379e376 100644 --- a/app/src/main/java/ru/myitschool/work/data/network/AdminNetworkDataSource.kt +++ b/app/src/main/java/ru/myitschool/work/data/network/AdminNetworkDataSource.kt @@ -15,7 +15,7 @@ object AdminNetworkDataSource { suspend fun blockUser(login: String, token: String): Result = withContext(Dispatchers.IO) { runCatching { - val response = client.patch("$SERVER_ADDRESS/api/employees/block?login=$login") { + val response = client.patch("$SERVER_ADDRESS/api/users/block?username=$login") { headers { append(HttpHeaders.Authorization, token) } @@ -30,7 +30,7 @@ object AdminNetworkDataSource { suspend fun unblockUser(login: String, token: String): Result = withContext(Dispatchers.IO) { runCatching { - val response = client.patch("$SERVER_ADDRESS/api/employees/unblock?login=$login") { + val response = client.patch("$SERVER_ADDRESS/api/users/unblock?username=$login") { headers { append(HttpHeaders.Authorization, token) } diff --git a/app/src/main/java/ru/myitschool/work/data/network/UserNetworkDataSource.kt b/app/src/main/java/ru/myitschool/work/data/network/UserNetworkDataSource.kt index 298fc16..915f6e4 100644 --- a/app/src/main/java/ru/myitschool/work/data/network/UserNetworkDataSource.kt +++ b/app/src/main/java/ru/myitschool/work/data/network/UserNetworkDataSource.kt @@ -52,13 +52,13 @@ object UserNetworkDataSource { withContext(Dispatchers.IO) { runCatching { val response = - KtorClient.client.get("${Constants.SERVER_ADDRESS}/api/employees/find?${login}") { + KtorClient.client.get("${Constants.SERVER_ADDRESS}/api/users/get?username=${login}") { headers { append(HttpHeaders.Authorization, token) } } - if (response.status == HttpStatusCode.OK) + if (response.status != HttpStatusCode.OK) error("Status ${response.status}") response.body() } diff --git a/app/src/main/java/ru/myitschool/work/ui/admin/search/AdminFragment.kt b/app/src/main/java/ru/myitschool/work/ui/admin/search/AdminFragment.kt index 068f10d..20d22b4 100644 --- a/app/src/main/java/ru/myitschool/work/ui/admin/search/AdminFragment.kt +++ b/app/src/main/java/ru/myitschool/work/ui/admin/search/AdminFragment.kt @@ -4,6 +4,7 @@ import android.os.Bundle import android.view.View import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels +import androidx.navigation.fragment.findNavController import ru.myitschool.work.R import ru.myitschool.work.databinding.FragmentFindEmployeeBinding import ru.myitschool.work.utils.collectWithLifecycle @@ -23,7 +24,7 @@ class AdminFragment : Fragment(R.layout.fragment_find_employee) { when (state) { is AdminViewModel.State.Error -> binding.error.text = state.errorMessage is AdminViewModel.State.Loading -> Unit - is AdminViewModel.State.Show -> {} + is AdminViewModel.State.Show -> findNavController().navigate(R.id.action_adminFragment_to_viewUserAsAdminFragment) is AdminViewModel.State.Waiting -> Unit } } @@ -31,7 +32,6 @@ class AdminFragment : Fragment(R.layout.fragment_find_employee) { binding.find.setOnClickListener { viewModel.onFind(binding.username.text.toString()) } - } override fun onDestroy() { diff --git a/app/src/main/java/ru/myitschool/work/ui/admin/search/AdminViewModel.kt b/app/src/main/java/ru/myitschool/work/ui/admin/search/AdminViewModel.kt index c5cb3da..4d80b96 100644 --- a/app/src/main/java/ru/myitschool/work/ui/admin/search/AdminViewModel.kt +++ b/app/src/main/java/ru/myitschool/work/ui/admin/search/AdminViewModel.kt @@ -38,10 +38,10 @@ class AdminViewModel( private val _state = MutableStateFlow(State.Waiting) val state = _state.asStateFlow() - private var _listState: Flow>? = null - val listState: Flow> get() = _listState!! +// private var _listState: Flow>? = null +// val listState: Flow> get() = _listState!! - private var currentLogin: String? = null + private var currentLogin: String = "pivanov" fun onFind(login: String) { viewModelScope.launch { @@ -72,16 +72,16 @@ class AdminViewModel( } private fun setUpPager(login: String) { - _listState = Pager( - config = PagingConfig( - pageSize = 10, - enablePlaceholders = false, - maxSize = 50 - ) - ) { - UsersPassesPagingSource(getUsersPassesUseCase::invoke, login) - }.flow - .cachedIn(viewModelScope) +// _listState = Pager( +// config = PagingConfig( +// pageSize = 10, +// enablePlaceholders = false, +// maxSize = 50 +// ) +// ) { +// UsersPassesPagingSource(getUsersPassesUseCase::invoke, login) +// }.flow +// .cachedIn(viewModelScope) } fun onBlock() { diff --git a/app/src/main/java/ru/myitschool/work/ui/admin/view/ViewUserAsAdminFragment.kt b/app/src/main/java/ru/myitschool/work/ui/admin/view/ViewUserAsAdminFragment.kt index dfadb46..e1951d7 100644 --- a/app/src/main/java/ru/myitschool/work/ui/admin/view/ViewUserAsAdminFragment.kt +++ b/app/src/main/java/ru/myitschool/work/ui/admin/view/ViewUserAsAdminFragment.kt @@ -49,27 +49,28 @@ class ViewUserAsAdminFragment : Fragment(R.layout.fragment_user) { is AdminViewModel.State.Error -> binding.error.text = state.errorMessage is AdminViewModel.State.Waiting -> Unit } - - viewModel.listState.collectWithLifecycle(this) { listState -> - adapter.submitData(listState) - } - - adapter.loadStateFlow.collectWithLifecycle(this) { data -> - val dataState = data.refresh - binding.refresh.isRefreshing = dataState is LoadState.Loading - binding.error.visibleOrGone(dataState is LoadState.Error) - - if (dataState is LoadState.Error) { - binding.error.text = dataState.error.toString() - } - } - - binding.refresh.setOnRefreshListener { - viewModel.onRefresh() - adapter.refresh() - } } +// viewModel.listState.collectWithLifecycle(this) { listState -> +// adapter.submitData(listState) +// } + +// adapter.loadStateFlow.collectWithLifecycle(this) { data -> +// val dataState = data.refresh +// binding.refresh.isRefreshing = dataState is LoadState.Loading +// binding.error.visibleOrGone(dataState is LoadState.Error) +// +// if (dataState is LoadState.Error) { +// binding.error.text = dataState.error.toString() +// } +// } + + binding.refresh.setOnRefreshListener { + viewModel.onRefresh() +// adapter.refresh() + } + + binding.block.setOnClickListener { AlertDialog.Builder(requireContext()) .setTitle("Блокировка доступа") diff --git a/app/src/main/java/ru/myitschool/work/ui/profile/PassesListAdapter.kt b/app/src/main/java/ru/myitschool/work/ui/profile/PassesListAdapter.kt index fe87f30..8c25790 100644 --- a/app/src/main/java/ru/myitschool/work/ui/profile/PassesListAdapter.kt +++ b/app/src/main/java/ru/myitschool/work/ui/profile/PassesListAdapter.kt @@ -1,15 +1,17 @@ package ru.myitschool.work.ui.profile +import android.util.Log import android.view.LayoutInflater import android.view.ViewGroup import androidx.paging.PagingDataAdapter import androidx.recyclerview.widget.DiffUtil +import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView import ru.myitschool.work.databinding.PassItemBinding import ru.myitschool.work.domain.entities.PassEntity class PassesListAdapter: - PagingDataAdapter(CenterDiff) { + ListAdapter(CenterDiff) { class ViewHolder( private val binding: PassItemBinding, @@ -38,12 +40,6 @@ class PassesListAdapter: } override fun onBindViewHolder(holder: ViewHolder, position: Int) { - holder.bind( - getItem(position) ?: PassEntity( - type = "Загрузка ...", - name = "Терминал №...", - time = "Давным-давно..." - ) - ) + holder.bind(getItem(position)) } } \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/ui/profile/PassesPagingSource.kt b/app/src/main/java/ru/myitschool/work/ui/profile/PassesPagingSource.kt index 99d0dc8..1ee7815 100644 --- a/app/src/main/java/ru/myitschool/work/ui/profile/PassesPagingSource.kt +++ b/app/src/main/java/ru/myitschool/work/ui/profile/PassesPagingSource.kt @@ -1,5 +1,6 @@ package ru.myitschool.work.ui.profile +import android.util.Log import androidx.paging.PagingSource import androidx.paging.PagingState import ru.myitschool.work.domain.entities.PassEntity @@ -15,12 +16,12 @@ class PassesPagingSource( } override suspend fun load(params: LoadParams): LoadResult { - val pageNum = params.key ?: 1 + val pageNum = params.key ?: 0 return request.invoke(pageNum, params.loadSize).fold( onSuccess = { value -> LoadResult.Page( data = value, - prevKey = (pageNum - 1).takeIf { it >= 0 }, + prevKey = (pageNum - 1).takeIf { it > 0 }, nextKey = (pageNum + 1).takeIf { value.size == params.loadSize } ) }, diff --git a/app/src/main/java/ru/myitschool/work/ui/profile/UserFragment.kt b/app/src/main/java/ru/myitschool/work/ui/profile/UserFragment.kt index 7f620ae..10955f2 100644 --- a/app/src/main/java/ru/myitschool/work/ui/profile/UserFragment.kt +++ b/app/src/main/java/ru/myitschool/work/ui/profile/UserFragment.kt @@ -7,7 +7,6 @@ import androidx.appcompat.app.AlertDialog import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels import androidx.navigation.fragment.findNavController -import androidx.paging.LoadState import com.squareup.picasso.Picasso import ru.myitschool.work.R import ru.myitschool.work.databinding.FragmentUserBinding @@ -33,10 +32,10 @@ class UserFragment : Fragment(R.layout.fragment_user) { viewModel.state.collectWithLifecycle(this) { state -> binding.refresh.isRefreshing = state is UserViewModel.State.Loading binding.content.visibleOrGone(state is UserViewModel.State.Show) - Log.d("info", state.toString()) when (state) { is UserViewModel.State.Loading -> Unit is UserViewModel.State.Show -> { + adapter.submitList(state.passes) val user = state.userEntity binding.scan.visibleOrGone(!user.isCardBlocked) binding.findUser.visibleOrGone(user.isAdmin) @@ -46,53 +45,39 @@ class UserFragment : Fragment(R.layout.fragment_user) { Picasso.get().load(user.photoUrl).into(binding.photo) } } - - viewModel.listState.collectWithLifecycle(this) { listState -> - adapter.submitData(listState) - } - - adapter.loadStateFlow.collectWithLifecycle(this) { data -> - val dataState = data.refresh - binding.refresh.isRefreshing = dataState is LoadState.Loading - binding.error.visibleOrGone(dataState is LoadState.Error) - - if (dataState is LoadState.Error) { - binding.error.text = dataState.error.toString() - } - } - - binding.refresh.setOnRefreshListener { - viewModel.onRefresh() - adapter.refresh() - } - - binding.logout.setOnClickListener { - AlertDialog.Builder(requireContext()) - .setTitle("Выход") - .setMessage("Вы уверены, что хотите выйти из аккаунта?") - .setIcon(android.R.drawable.ic_dialog_alert) - .setPositiveButton(android.R.string.ok) { _, _ -> - viewModel.onLogout() - findNavController().navigate(R.id.action_userFragment_to_loginFragment) - } - .show() - } - - binding.findUser.setOnClickListener { - findNavController().navigate(R.id.find_user) - } - - binding.scan.setOnClickListener { - findNavController().navigate(R.id.action_userFragment_to_qrScanFragment) - } - - parentFragmentManager.setFragmentResultListener( - QrScanDestination.REQUEST_KEY, this - ) { _, result -> - parentFragmentManager.setFragmentResult(RESPONSE_KEY, result) - findNavController().navigate(R.id.action_userFragment_to_qrResultFragment) - } } + + binding.refresh.setOnRefreshListener { + viewModel.onRefresh() + } + + binding.logout.setOnClickListener { + AlertDialog.Builder(requireContext()) + .setTitle("Выход") + .setMessage("Вы уверены, что хотите выйти из аккаунта?") + .setIcon(android.R.drawable.ic_dialog_alert) + .setPositiveButton(android.R.string.ok) { _, _ -> + viewModel.onLogout() + findNavController().navigate(R.id.action_userFragment_to_loginFragment) + } + .show() + } + + binding.findUser.setOnClickListener { + findNavController().navigate(R.id.action_userFragment_to_adminFragment) + } + + binding.scan.setOnClickListener { + findNavController().navigate(R.id.action_userFragment_to_qrScanFragment) + } + + parentFragmentManager.setFragmentResultListener( + QrScanDestination.REQUEST_KEY, this + ) { _, result -> + parentFragmentManager.setFragmentResult(RESPONSE_KEY, result) + findNavController().navigate(R.id.action_userFragment_to_qrResultFragment) + } + } override fun onDestroy() { diff --git a/app/src/main/java/ru/myitschool/work/ui/profile/UserViewModel.kt b/app/src/main/java/ru/myitschool/work/ui/profile/UserViewModel.kt index 1f3417d..c066eea 100644 --- a/app/src/main/java/ru/myitschool/work/ui/profile/UserViewModel.kt +++ b/app/src/main/java/ru/myitschool/work/ui/profile/UserViewModel.kt @@ -1,5 +1,6 @@ package ru.myitschool.work.ui.profile +import android.util.Log import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.viewModelScope @@ -16,6 +17,7 @@ import ru.myitschool.work.data.local.CredentialsLocalDataSource import ru.myitschool.work.data.local.UserLocalDataSource import ru.myitschool.work.data.network.PassNetworkDataSource import ru.myitschool.work.data.network.UserNetworkDataSource +import ru.myitschool.work.domain.entities.PassEntity import ru.myitschool.work.domain.entities.UserEntity import ru.myitschool.work.domain.login.LogoutUseCase import ru.myitschool.work.domain.passes.GetCurrentPassesUseCase @@ -48,7 +50,14 @@ class UserViewModel( private fun updateState() { viewModelScope.launch { _state.emit(State.Loading) - _state.emit(State.Show(getCurrentUserUseCase())) + + _state.emit( + State.Show( + getCurrentUserUseCase(), + getCurrentPassesUseCase(0, 30).getOrNull()!! + ) + ) + } } @@ -62,7 +71,7 @@ class UserViewModel( sealed interface State { data object Loading : State - data class Show(val userEntity: UserEntity) : State + data class Show(val userEntity: UserEntity, val passes: List) : State } companion object { diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..ca3826a --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml index d3f33eb..3766e68 100644 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -1,5 +1,6 @@ - - + + + \ No newline at end of file