From 3aa012adf98869271c506c16f63b3201af316dd2 Mon Sep 17 00:00:00 2001 From: a1pha Date: Thu, 20 Feb 2025 15:30:21 +0300 Subject: [PATCH] fixes / feat: some bugs with dto fixed and block / unblock use case done --- .../work/data/AdminRepositoryImpl.kt | 6 +++- .../work/data/PassRepositoryImpl.kt | 4 +-- .../myitschool/work/data/QrRepositoryImpl.kt | 1 + .../work/data/UserRepositoryImpl.kt | 18 +++++++--- .../ru/myitschool/work/data/dto/PassDto.kt | 12 +++++-- .../ru/myitschool/work/data/dto/UserDto.kt | 4 +-- .../data/network/AdminNetworkDataSource.kt | 16 ++++++++- .../data/network/PassNetworkDataSource.kt | 2 +- .../work/data/network/QrNetworkDataSource.kt | 33 ++++++++--------- .../data/network/UserNetworkDataSource.kt | 6 ++-- .../work/domain/admin/AdminRepository.kt | 1 + .../work/domain/admin/UnblockUserUseCase.kt | 8 +++++ .../work/domain/entities/UserEntity.kt | 2 +- .../work/ui/admin/search/AdminViewModel.kt | 20 ++++++++--- .../ui/admin/view/ViewUserAsAdminFragment.kt | 10 ++++-- .../work/ui/login/SplashFragment.kt | 12 +------ .../work/ui/profile/PassesPagingSource.kt | 2 +- .../work/ui/profile/UserFragment.kt | 25 +++++++++++-- .../work/ui/profile/UserViewModel.kt | 3 +- .../work/ui/qr/result/QrResultFragment.kt | 21 +++-------- .../work/ui/qr/result/QrResultViewModel.kt | 13 +++++-- .../main/res/layout-land/fragment_user.xml | 17 ++++++++- app/src/main/res/layout/fragment_user.xml | 35 +++++++++++++------ app/src/main/res/navigation/nav_graph.xml | 5 +++ app/src/main/res/values-en-rUS/strings.xml | 5 +-- app/src/main/res/values/strings.xml | 5 +-- 26 files changed, 191 insertions(+), 95 deletions(-) create mode 100644 app/src/main/java/ru/myitschool/work/domain/admin/UnblockUserUseCase.kt diff --git a/app/src/main/java/ru/myitschool/work/data/AdminRepositoryImpl.kt b/app/src/main/java/ru/myitschool/work/data/AdminRepositoryImpl.kt index 3cd5a62..ff41c98 100644 --- a/app/src/main/java/ru/myitschool/work/data/AdminRepositoryImpl.kt +++ b/app/src/main/java/ru/myitschool/work/data/AdminRepositoryImpl.kt @@ -7,8 +7,12 @@ import ru.myitschool.work.domain.admin.AdminRepository class AdminRepositoryImpl( private val networkDataSource: AdminNetworkDataSource, private val localCredentialsLocalDataSource: CredentialsLocalDataSource -): AdminRepository { +) : AdminRepository { override suspend fun blockUser(login: String): Result { return networkDataSource.blockUser(login, localCredentialsLocalDataSource.getToken()) } + + override suspend fun unblockUser(login: String): Result { + return networkDataSource.unblockUser(login, localCredentialsLocalDataSource.getToken()) + } } \ No newline at end of file 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 8a5ede7..ca276f1 100644 --- a/app/src/main/java/ru/myitschool/work/data/PassRepositoryImpl.kt +++ b/app/src/main/java/ru/myitschool/work/data/PassRepositoryImpl.kt @@ -40,8 +40,8 @@ class PassRepositoryImpl( return listDto.map { successListDto -> successListDto.mapNotNull { dto -> PassEntity( - type = dto.type ?: return@mapNotNull null, - name = dto.name ?: return@mapNotNull null, + type = dto.terminal?.type ?: return@mapNotNull null, + name = dto.terminal.name ?: return@mapNotNull null, time = dto.time ?: return@mapNotNull null ) } diff --git a/app/src/main/java/ru/myitschool/work/data/QrRepositoryImpl.kt b/app/src/main/java/ru/myitschool/work/data/QrRepositoryImpl.kt index 69976ab..1e82e99 100644 --- a/app/src/main/java/ru/myitschool/work/data/QrRepositoryImpl.kt +++ b/app/src/main/java/ru/myitschool/work/data/QrRepositoryImpl.kt @@ -1,6 +1,7 @@ package ru.myitschool.work.data import ru.myitschool.work.data.local.CredentialsLocalDataSource +import ru.myitschool.work.data.network.QrNetworkDataSource import ru.myitschool.work.domain.entities.QrEntity import ru.myitschool.work.domain.qr.QrRepository 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 c5b1ddb..73d44e9 100644 --- a/app/src/main/java/ru/myitschool/work/data/UserRepositoryImpl.kt +++ b/app/src/main/java/ru/myitschool/work/data/UserRepositoryImpl.kt @@ -21,7 +21,9 @@ class UserRepositoryImpl( .fold( onSuccess = { dto -> map(dto).fold( - onSuccess = { userLocalDataSource.cacheData(it) }, + onSuccess = { + userLocalDataSource.cacheData(it) + }, onFailure = { error(it) } ) }, @@ -32,8 +34,13 @@ class UserRepositoryImpl( override suspend fun authorize(token: String): Result { return networkDataSource.login(token).fold( - onSuccess = { Result.success(Unit) }, - onFailure = { error -> Result.failure(error) } + onSuccess = { dto -> + map(dto).fold( + onSuccess = { Result.success(userLocalDataSource.cacheData(it)) }, + onFailure = { Result.failure(it) } + ) + }, + onFailure = { Result.failure(it) } ) } @@ -54,7 +61,7 @@ class UserRepositoryImpl( return runCatching { UserEntity( name = userDto.name ?: error("Null user name"), - lastVisit = userDto.lastVisit ?: error("Null user lastVisit"), + lastVisit = userDto.lastVisit ?: "", photoUrl = userDto.photoUrl ?: error("Null user photoUrl"), position = userDto.position ?: error("Null user position"), isAdmin = userDto.roleId?.let { it -> @@ -62,7 +69,8 @@ class UserRepositoryImpl( it, credentialsLocalDataSource.getToken() ).fold(onSuccess = { it }, onFailure = { error(it) }) - } ?: error("Null user roleId") + } ?: error("Null user roleId"), + isCardBlocked = userDto.isCardBlocked ?: error("Null user isCardBlocked") ) } } 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 22dc062..9acbd39 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,10 +6,16 @@ import kotlinx.serialization.Serializable @Serializable data class PassDto( + @SerialName("time") + val time: String?, + @SerialName("localDateTime") + val terminal: TerminalDto? +) + +@Serializable +data class TerminalDto( @SerialName("type") val type: String?, @SerialName("name") - val name: String?, - @SerialName("time") - val time: String? + val name: String? ) diff --git a/app/src/main/java/ru/myitschool/work/data/dto/UserDto.kt b/app/src/main/java/ru/myitschool/work/data/dto/UserDto.kt index 71a90d1..c4af54e 100644 --- a/app/src/main/java/ru/myitschool/work/data/dto/UserDto.kt +++ b/app/src/main/java/ru/myitschool/work/data/dto/UserDto.kt @@ -5,7 +5,7 @@ import kotlinx.serialization.Serializable @Serializable data class UserDto( - @SerialName("roleId") + @SerialName("authority_id") val roleId: Int?, @SerialName("name") val name: String?, @@ -15,7 +15,7 @@ data class UserDto( val photoUrl: String?, @SerialName("position") val position: String?, - @SerialName("login") + @SerialName("username") val login: String?, @SerialName("isCardBlocked") val isCardBlocked: Boolean? 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 332e6ee..58c91c6 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/employees/block?login=$login") { headers { append(HttpHeaders.Authorization, token) } @@ -27,4 +27,18 @@ 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") { + headers { + append(HttpHeaders.Authorization, token) + } + } + + if (response.status != HttpStatusCode.OK) + error("Status ${response.status}") + Unit + } + } } diff --git a/app/src/main/java/ru/myitschool/work/data/network/PassNetworkDataSource.kt b/app/src/main/java/ru/myitschool/work/data/network/PassNetworkDataSource.kt index d9e638c..de063aa 100644 --- a/app/src/main/java/ru/myitschool/work/data/network/PassNetworkDataSource.kt +++ b/app/src/main/java/ru/myitschool/work/data/network/PassNetworkDataSource.kt @@ -21,7 +21,7 @@ object PassNetworkDataSource { withContext(Dispatchers.IO) { runCatching { val response = - client.get("$SERVER_ADDRESS/api/passes?pageNum=$pageNum&pageSize=$pageSize") { + client.get("$SERVER_ADDRESS/api/passes/paginated/?page=$pageNum&size=$pageSize") { headers { append(HttpHeaders.Authorization, token) } diff --git a/app/src/main/java/ru/myitschool/work/data/network/QrNetworkDataSource.kt b/app/src/main/java/ru/myitschool/work/data/network/QrNetworkDataSource.kt index 2ad9c06..478d93e 100644 --- a/app/src/main/java/ru/myitschool/work/data/network/QrNetworkDataSource.kt +++ b/app/src/main/java/ru/myitschool/work/data/network/QrNetworkDataSource.kt @@ -1,4 +1,4 @@ -package ru.myitschool.work.data +package ru.myitschool.work.data.network import io.ktor.client.request.headers import io.ktor.client.request.patch @@ -11,28 +11,25 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import ru.myitschool.work.core.Constants import ru.myitschool.work.data.dto.QrDto -import ru.myitschool.work.data.network.KtorClient import ru.myitschool.work.domain.entities.QrEntity object QrNetworkDataSource { - suspend fun pushQr(qrEntity: QrEntity, token: String): Result = withContext(Dispatchers.IO) { - - runCatching { - - val response = KtorClient.client.patch("${Constants.SERVER_ADDRESS}/api/push_qr") { - headers { - append(HttpHeaders.Authorization, token) - } - contentType(ContentType.Application.Json) - setBody( - QrDto(code = qrEntity.code) - ) + suspend fun pushQr(qrEntity: QrEntity, token: String): Result = + withContext(Dispatchers.IO) { + runCatching { + val response = + KtorClient.client.patch("${Constants.SERVER_ADDRESS}/api/open") { + headers { + append(HttpHeaders.Authorization, token) + } + contentType(ContentType.Application.Json) + setBody(QrDto(qrEntity.code)) + } + if (response.status != HttpStatusCode.OK) + error("Status ${response.status}") + Unit } - if (response.status != HttpStatusCode.OK) - error("Status ${response.status}") - Unit } - } } \ No newline at end of file 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 d5024a5..298fc16 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 @@ -14,7 +14,7 @@ object UserNetworkDataSource { suspend fun isUserExist(login: String): Result = withContext(Dispatchers.IO) { runCatching { - val result = KtorClient.client.get("${Constants.SERVER_ADDRESS}/api/employees/$login") + val result = KtorClient.client.get("${Constants.SERVER_ADDRESS}/api/users/username/$login") result.status == HttpStatusCode.OK } } @@ -23,7 +23,7 @@ object UserNetworkDataSource { withContext(Dispatchers.IO) { runCatching { val result = - KtorClient.client.get("${Constants.SERVER_ADDRESS}/api/employees/login") { + KtorClient.client.get("${Constants.SERVER_ADDRESS}/api/users/login") { headers { append(HttpHeaders.Authorization, token) } @@ -38,7 +38,7 @@ object UserNetworkDataSource { withContext(Dispatchers.IO) { runCatching { val response = - KtorClient.client.get("${Constants.SERVER_ADDRESS}/api/roles/info?$roleId") { + KtorClient.client.get("${Constants.SERVER_ADDRESS}/api/authority/$roleId") { headers { append(HttpHeaders.Authorization, token) } diff --git a/app/src/main/java/ru/myitschool/work/domain/admin/AdminRepository.kt b/app/src/main/java/ru/myitschool/work/domain/admin/AdminRepository.kt index d4730ff..acfe197 100644 --- a/app/src/main/java/ru/myitschool/work/domain/admin/AdminRepository.kt +++ b/app/src/main/java/ru/myitschool/work/domain/admin/AdminRepository.kt @@ -2,4 +2,5 @@ package ru.myitschool.work.domain.admin interface AdminRepository { suspend fun blockUser(login: String): Result + suspend fun unblockUser(login: String): Result } diff --git a/app/src/main/java/ru/myitschool/work/domain/admin/UnblockUserUseCase.kt b/app/src/main/java/ru/myitschool/work/domain/admin/UnblockUserUseCase.kt new file mode 100644 index 0000000..fe28dca --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/domain/admin/UnblockUserUseCase.kt @@ -0,0 +1,8 @@ +package ru.myitschool.work.domain.admin + +class UnblockUserUseCase( + private val repository: AdminRepository +) { + + suspend operator fun invoke(login: String) = repository.unblockUser(login) +} \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/domain/entities/UserEntity.kt b/app/src/main/java/ru/myitschool/work/domain/entities/UserEntity.kt index e453de3..483d9ac 100644 --- a/app/src/main/java/ru/myitschool/work/domain/entities/UserEntity.kt +++ b/app/src/main/java/ru/myitschool/work/domain/entities/UserEntity.kt @@ -6,5 +6,5 @@ data class UserEntity( val lastVisit: String, val photoUrl: String, val position: String, - + val isCardBlocked: Boolean ) 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 a8427f0..c5cb3da 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 @@ -21,6 +21,7 @@ import ru.myitschool.work.data.network.AdminNetworkDataSource import ru.myitschool.work.data.network.PassNetworkDataSource import ru.myitschool.work.data.network.UserNetworkDataSource import ru.myitschool.work.domain.admin.BlockUserUseCase +import ru.myitschool.work.domain.admin.UnblockUserUseCase import ru.myitschool.work.domain.entities.PassEntity import ru.myitschool.work.domain.entities.UserEntity import ru.myitschool.work.domain.passes.GetUsersPassesUseCase @@ -30,6 +31,7 @@ import ru.myitschool.work.ui.admin.view.UsersPassesPagingSource class AdminViewModel( private val getUserByLoginUseCase: GetUserByLoginUseCase, private val getUsersPassesUseCase: GetUsersPassesUseCase, + private val unBlockUserUseCase: UnblockUserUseCase, private val blockUserUseCase: BlockUserUseCase ) : ViewModel() { @@ -88,6 +90,12 @@ class AdminViewModel( } } + fun unblock() { + viewModelScope.launch { + unBlockUserUseCase(currentLogin!!) + } + } + sealed interface State { data class Show(val user: UserEntity) : State data object Waiting : State @@ -100,6 +108,10 @@ class AdminViewModel( val Factory: ViewModelProvider.Factory = object : ViewModelProvider.Factory { @Suppress("UNCHECKED_CAST") override fun create(modelClass: Class, extras: CreationExtras): T { + val adminRepository = AdminRepositoryImpl( + networkDataSource = AdminNetworkDataSource, + localCredentialsLocalDataSource = CredentialsLocalDataSource.getInstance() + ) return AdminViewModel( getUserByLoginUseCase = GetUserByLoginUseCase( repository = UserRepositoryImpl( @@ -115,10 +127,10 @@ class AdminViewModel( ) ), blockUserUseCase = BlockUserUseCase( - repository = AdminRepositoryImpl( - networkDataSource = AdminNetworkDataSource, - localCredentialsLocalDataSource = CredentialsLocalDataSource.getInstance() - ) + repository = adminRepository + ), + unBlockUserUseCase = UnblockUserUseCase( + repository = adminRepository ) ) as T } 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 10cc6ab..dfadb46 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 @@ -26,20 +26,20 @@ class ViewUserAsAdminFragment : Fragment(R.layout.fragment_user) { binding.findUser.visibleOrGone(false) binding.logout.visibleOrGone(false) - binding.block.visibleOrGone(true) val adapter = PassesListAdapter() binding.passes.adapter = adapter viewModel.state.collectWithLifecycle(this) { state -> binding.refresh.isRefreshing = state is AdminViewModel.State.Loading - binding.content?.visibleOrGone(state is AdminViewModel.State.Show) + binding.content.visibleOrGone(state is AdminViewModel.State.Show) when (state) { is AdminViewModel.State.Loading -> Unit is AdminViewModel.State.Show -> { val user = state.user - binding.findUser.visibleOrGone(user.isAdmin) + binding.block.visibleOrGone(!user.isCardBlocked) + binding.unblock.visibleOrGone(user.isCardBlocked) binding.fullname.text = user.name binding.position.text = user.position binding.lastEntry.text = user.lastVisit @@ -79,6 +79,10 @@ class ViewUserAsAdminFragment : Fragment(R.layout.fragment_user) { .show() } + binding.unblock.setOnClickListener { + viewModel.unblock() + } + } override fun onDestroy() { diff --git a/app/src/main/java/ru/myitschool/work/ui/login/SplashFragment.kt b/app/src/main/java/ru/myitschool/work/ui/login/SplashFragment.kt index 500d5da..25435f1 100644 --- a/app/src/main/java/ru/myitschool/work/ui/login/SplashFragment.kt +++ b/app/src/main/java/ru/myitschool/work/ui/login/SplashFragment.kt @@ -9,14 +9,10 @@ import androidx.navigation.fragment.findNavController import ru.myitschool.work.R import ru.myitschool.work.core.Constants import ru.myitschool.work.data.local.CredentialsLocalDataSource -import ru.myitschool.work.databinding.FragmentSplashBinding import ru.myitschool.work.utils.collectWithLifecycle class SplashFragment : Fragment(R.layout.fragment_splash) { - private var _binding: FragmentSplashBinding? = null - private val binding: FragmentSplashBinding get() = _binding!! - private val viewModel by viewModels { LoginViewModel.Factory } override fun onCreate(savedInstanceState: Bundle?) { @@ -30,21 +26,15 @@ class SplashFragment : Fragment(R.layout.fragment_splash) { } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - _binding = FragmentSplashBinding.bind(view) viewModel.action.collectWithLifecycle(this) { action -> val navController = findNavController() when (action) { is LoginViewModel.Action.GoToLogin -> navController.navigate(R.id.loginFragment) is LoginViewModel.Action.OpenApp -> - navController.navigate(R.id.action_loginFragment_to_userFragment) + navController.navigate(R.id.action_splashFragment_to_userFragment) } } } - - override fun onDestroy() { - _binding = null - super.onDestroy() - } } \ 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 de2ec84..99d0dc8 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 @@ -15,7 +15,7 @@ class PassesPagingSource( } override suspend fun load(params: LoadParams): LoadResult { - val pageNum = params.key ?: 0 + val pageNum = params.key ?: 1 return request.invoke(pageNum, params.loadSize).fold( onSuccess = { value -> LoadResult.Page( 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 bcc4c6a..7f620ae 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 @@ -1,6 +1,7 @@ package ru.myitschool.work.ui.profile import android.os.Bundle +import android.util.Log import android.view.View import androidx.appcompat.app.AlertDialog import androidx.fragment.app.Fragment @@ -10,9 +11,12 @@ import androidx.paging.LoadState import com.squareup.picasso.Picasso import ru.myitschool.work.R import ru.myitschool.work.databinding.FragmentUserBinding +import ru.myitschool.work.ui.qr.result.RESPONSE_KEY +import ru.myitschool.work.ui.qr.scan.QrScanDestination import ru.myitschool.work.utils.collectWithLifecycle import ru.myitschool.work.utils.visibleOrGone + class UserFragment : Fragment(R.layout.fragment_user) { private var _binding: FragmentUserBinding? = null @@ -28,11 +32,13 @@ 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) + binding.content.visibleOrGone(state is UserViewModel.State.Show) + Log.d("info", state.toString()) when (state) { is UserViewModel.State.Loading -> Unit is UserViewModel.State.Show -> { val user = state.userEntity + binding.scan.visibleOrGone(!user.isCardBlocked) binding.findUser.visibleOrGone(user.isAdmin) binding.fullname.text = user.name binding.position.text = user.position @@ -65,14 +71,27 @@ class UserFragment : Fragment(R.layout.fragment_user) { .setTitle("Выход") .setMessage("Вы уверены, что хотите выйти из аккаунта?") .setIcon(android.R.drawable.ic_dialog_alert) - .setPositiveButton(android.R.string.ok) { _, _ -> viewModel.onLogout() } + .setPositiveButton(android.R.string.ok) { _, _ -> + viewModel.onLogout() + findNavController().navigate(R.id.action_userFragment_to_loginFragment) + } .show() - findNavController().navigate(R.id.action_userFragment_to_loginFragment) } 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) + } } } 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 de33173..1f3417d 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 @@ -47,7 +47,8 @@ class UserViewModel( private fun updateState() { viewModelScope.launch { - State.Show(getCurrentUserUseCase()) + _state.emit(State.Loading) + _state.emit(State.Show(getCurrentUserUseCase())) } } diff --git a/app/src/main/java/ru/myitschool/work/ui/qr/result/QrResultFragment.kt b/app/src/main/java/ru/myitschool/work/ui/qr/result/QrResultFragment.kt index a56876d..cc6ac00 100644 --- a/app/src/main/java/ru/myitschool/work/ui/qr/result/QrResultFragment.kt +++ b/app/src/main/java/ru/myitschool/work/ui/qr/result/QrResultFragment.kt @@ -8,7 +8,7 @@ import androidx.fragment.app.viewModels import androidx.navigation.fragment.findNavController import ru.myitschool.work.R import ru.myitschool.work.databinding.FragmentQrResultBinding -import ru.myitschool.work.ui.qr.scan.QrScanDestination +import ru.myitschool.work.domain.entities.QrEntity import ru.myitschool.work.ui.qr.scan.QrScanDestination.getDataIfExist import ru.myitschool.work.utils.collectWithLifecycle @@ -20,25 +20,18 @@ class QrResultFragment : Fragment(R.layout.fragment_qr_result) { private var _binding: FragmentQrResultBinding? = null private val binding: FragmentQrResultBinding get() = _binding!! - private var _resultQr: String? = null - private val resultQr: String = _resultQr!! - private val viewModel by viewModels { QrResultViewModel.Factory } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { _binding = FragmentQrResultBinding.bind(view) - if (savedInstanceState != null) { - _resultQr = savedInstanceState.getString(QrScanDestination.REQUEST_KEY) - } - parentFragmentManager.setFragmentResultListener(RESPONSE_KEY, this) { _, result -> - _resultQr = getDataIfExist(result) - viewModel.update(resultQr) + getDataIfExist(result)?.let { viewModel.setQr(QrEntity(it)) } + viewModel.update() } viewModel.state.collectWithLifecycle(this) { state -> - if (_resultQr == null) { + if (viewModel._qrEntity == null) { binding.result.setText(R.string.door_closed) binding.close.background = ContextCompat.getDrawable(requireContext(), R.drawable.warn_button) @@ -65,12 +58,6 @@ class QrResultFragment : Fragment(R.layout.fragment_qr_result) { } } - - override fun onSaveInstanceState(outState: Bundle) { - super.onSaveInstanceState(outState) - outState.putString(QrScanDestination.REQUEST_KEY, resultQr) - } - override fun onDestroy() { _binding = null super.onDestroy() diff --git a/app/src/main/java/ru/myitschool/work/ui/qr/result/QrResultViewModel.kt b/app/src/main/java/ru/myitschool/work/ui/qr/result/QrResultViewModel.kt index e69739c..d2d84bf 100644 --- a/app/src/main/java/ru/myitschool/work/ui/qr/result/QrResultViewModel.kt +++ b/app/src/main/java/ru/myitschool/work/ui/qr/result/QrResultViewModel.kt @@ -7,7 +7,7 @@ import androidx.lifecycle.viewmodel.CreationExtras import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch -import ru.myitschool.work.data.QrNetworkDataSource +import ru.myitschool.work.data.network.QrNetworkDataSource import ru.myitschool.work.data.QrRepositoryImpl import ru.myitschool.work.data.local.CredentialsLocalDataSource import ru.myitschool.work.domain.entities.QrEntity @@ -20,9 +20,16 @@ class QrResultViewModel( private val _state = MutableStateFlow(State.Loading) val state = _state.asStateFlow() - fun update(qrValue: String) { + var _qrEntity: QrEntity? = null + private val qrEntity: QrEntity get() = _qrEntity!! + + fun setQr(qrEntity: QrEntity) { + _qrEntity = qrEntity + } + + fun update() { viewModelScope.launch { - pushQrUseCase(QrEntity(code = qrValue)).fold( + pushQrUseCase(qrEntity).fold( onSuccess = { _state.emit(State.Show) }, onFailure = { _state.emit(State.Error(it.message.toString())) } ) diff --git a/app/src/main/res/layout-land/fragment_user.xml b/app/src/main/res/layout-land/fragment_user.xml index 1c946e9..c1fa1e2 100644 --- a/app/src/main/res/layout-land/fragment_user.xml +++ b/app/src/main/res/layout-land/fragment_user.xml @@ -14,6 +14,7 @@ android:layout_height="match_parent"> + android:textColor="@color/warn_button_color" + android:visibility="gone" + tools:visibility="visible" /> + +