diff --git a/app/src/main/java/ru/myitschool/work/api/RetrofitClient.kt b/app/src/main/java/ru/myitschool/work/api/RetrofitClient.kt index 01f981e..1ceb126 100644 --- a/app/src/main/java/ru/myitschool/work/api/RetrofitClient.kt +++ b/app/src/main/java/ru/myitschool/work/api/RetrofitClient.kt @@ -57,6 +57,7 @@ class RetrofitClient(context: Context) { fun getApiServiceList(): ApiServiceList { return retrofitWithAuth.create(ApiServiceList::class.java) } + fun getApiServiceAdmin(): ApiServiceAdmin { return retrofitWithAuth.create(ApiServiceAdmin::class.java) } diff --git a/app/src/main/java/ru/myitschool/work/api/admin/ApiServiceAdmin.kt b/app/src/main/java/ru/myitschool/work/api/admin/ApiServiceAdmin.kt index e31acd3..496e179 100644 --- a/app/src/main/java/ru/myitschool/work/api/admin/ApiServiceAdmin.kt +++ b/app/src/main/java/ru/myitschool/work/api/admin/ApiServiceAdmin.kt @@ -2,10 +2,8 @@ package ru.myitschool.work.api.admin import retrofit2.Response import retrofit2.http.Body -import retrofit2.http.GET import retrofit2.http.PATCH import retrofit2.http.Path -import ru.myitschool.work.api.main.UserInfo interface ApiServiceAdmin { @PATCH("api/admin/authority/change/{login}") diff --git a/app/src/main/java/ru/myitschool/work/ui/RootActivity.kt b/app/src/main/java/ru/myitschool/work/ui/RootActivity.kt index 2eadf1a..a4baea5 100644 --- a/app/src/main/java/ru/myitschool/work/ui/RootActivity.kt +++ b/app/src/main/java/ru/myitschool/work/ui/RootActivity.kt @@ -9,6 +9,8 @@ import androidx.navigation.fragment.NavHostFragment import androidx.navigation.fragment.fragment import dagger.hilt.android.AndroidEntryPoint import ru.myitschool.work.R +import ru.myitschool.work.ui.admin.AdminDestination +import ru.myitschool.work.ui.admin.AdminFragment import ru.myitschool.work.ui.login.LoginDestination import ru.myitschool.work.ui.login.LoginFragment import ru.myitschool.work.ui.main.MainDestination @@ -36,7 +38,7 @@ class RootActivity : AppCompatActivity() { fragment() fragment() fragment() - /*fragment()*/ + fragment() } } diff --git a/app/src/main/java/ru/myitschool/work/ui/admin/AdminDestination.kt b/app/src/main/java/ru/myitschool/work/ui/admin/AdminDestination.kt new file mode 100644 index 0000000..4f02d97 --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/ui/admin/AdminDestination.kt @@ -0,0 +1,6 @@ +package ru.myitschool.work.ui.admin + +import kotlinx.serialization.Serializable + +@Serializable +data object AdminDestination \ 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 new file mode 100644 index 0000000..2aa2a3b --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/ui/admin/AdminFragment.kt @@ -0,0 +1,101 @@ +package ru.myitschool.work.ui.admin + +import android.os.Bundle +import android.util.Log +import android.view.View +import android.widget.Toast +import androidx.fragment.app.Fragment +import androidx.fragment.app.viewModels +import androidx.navigation.fragment.findNavController +import dagger.hilt.android.AndroidEntryPoint +import ru.myitschool.work.R +import ru.myitschool.work.databinding.FragmentAdminBinding +import ru.myitschool.work.ui.main.MainDestination +import ru.myitschool.work.utils.AuthPreferences +import ru.myitschool.work.utils.QrPreferences +import ru.myitschool.work.utils.collectWhenStarted +import ru.myitschool.work.utils.visibleOrGone + +@AndroidEntryPoint +class AdminFragment : Fragment(R.layout.fragment_admin) { + private var _binding: FragmentAdminBinding? = null + private val binding: FragmentAdminBinding get() = _binding!! + private val viewModel: AdminViewModel by viewModels() + + private lateinit var authPreferences: AuthPreferences + private lateinit var qrPreferences: QrPreferences + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + authPreferences = AuthPreferences(requireContext()) + qrPreferences = QrPreferences(requireContext()) + + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + _binding = FragmentAdminBinding.bind(view) + + setupOpenComponents() + observeOpenState() + } + + private fun setupOpenComponents() { + binding.apply { + block.setOnClickListener { + authPreferences.getLogin().toString().let { + viewModel.block( + it, + true + ) + } + } + } + } + + private fun observeOpenState() { + viewModel.state.collectWhenStarted(this) { state -> + when (state) { + is AdminViewModel.ResultState.Loading -> { + + } + is AdminViewModel.ResultState.Success -> { + + + } + is AdminViewModel.ResultState.InvalidCredentials -> { + + } + is AdminViewModel.ResultState.Error -> { + + } + AdminViewModel.ResultState.Initial -> { + + } + } + } + } + + private fun visibleAll(isVisible: Boolean) { + binding.apply { + } + } + + private fun navigateToMainScreen() { + try { + findNavController().apply { + popBackStack(MainDestination, false) + navigate(MainDestination) + } + } catch (e: Exception) { + Log.e("ResultFragment", "Navigation error", e) + Toast.makeText(context, getText(R.string.errorGoText).toString(), Toast.LENGTH_SHORT).show() + } + } + + override fun onDestroyView() { + _binding = null + super.onDestroyView() + } +} \ No newline at end of file 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 new file mode 100644 index 0000000..3d78b19 --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/ui/admin/AdminViewModel.kt @@ -0,0 +1,135 @@ +package ru.myitschool.work.ui.admin + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.launch +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response +import ru.myitschool.work.api.admin.AdminJson +import ru.myitschool.work.api.admin.ApiServiceAdmin +import ru.myitschool.work.api.list.ListInfo +import ru.myitschool.work.api.main.ApiServiceMain +import ru.myitschool.work.api.main.Authorities +import ru.myitschool.work.api.main.UserInfo +import ru.myitschool.work.ui.list.ListRepository +import javax.inject.Inject + +@HiltViewModel +class AdminViewModel @Inject constructor( + private val apiService: ApiServiceAdmin, + private val apiServiceData: ApiServiceMain, + private val listRepository: ListRepository +) : ViewModel() { + + private val _state = MutableStateFlow(ResultState.Initial) + val state = _state.asStateFlow() + + private val _stateData = MutableStateFlow(ResultStateData.Initial) + val stateData = _stateData.asStateFlow() + + fun block(login: String, authority: Boolean) { + viewModelScope.launch { + _state.value = ResultState.Loading + + try { + val response = apiService.block( + login = login, + data = AdminJson( + if (authority) Authorities.ROLE_BLOCK + else Authorities.ROLE_USER + ) + ) + + when (response.code()) { + 200 -> { + _state.value = ResultState.Success + } + 403 -> { + _state.value = ResultState.InvalidCredentials + } + 401 -> { + _state.value = ResultState.Error + } + else -> { + _state.value = ResultState.Error + } + } + } catch (t: Throwable) { + _state.value = ResultState.Error + } + } + } + + fun getUserData(login: String) { + viewModelScope.launch { + _stateData.value = ResultStateData.Loading + + + apiServiceData.getDataUser(login).enqueue(object : Callback { + override fun onResponse(call: Call, response: Response) { + + when { + response.isSuccessful -> { + val userInfo = response.body() + _stateData.value = userInfo?.let { ResultStateData.Success(it) }!! + } + response.code() == 401 -> { + _stateData.value = ResultStateData.Error("Unauthorized") + } + response.code() == 403 -> { + _stateData.value = ResultStateData.Error("Block") + } + else -> { + _stateData.value = ResultStateData.Error("Error") + } + } + } + + override fun onFailure(call: Call, t: Throwable) { + _stateData.value = ResultStateData.Error("Network Error") + } + }) + } + } + + private val _listState = MutableStateFlow(ListState.Loading) + val listState: StateFlow = _listState + + sealed class ListState { + data object Loading : ListState() + data class Success(val data: List) : ListState() + data class Error(val message: String) : ListState() + } + + fun loadList(login: String) { + viewModelScope.launch { + _listState.value = ListState.Loading + try { + val list = listRepository.getList(login) + _listState.value = ListState.Success(list) + } catch (e: Exception) { + _listState.value = ListState.Error(e.message ?: "Unknown error") + } + } + } + + sealed class ResultState { + data object Initial : ResultState() + data object InvalidCredentials : ResultState() + data object Loading : ResultState() + data object Success : ResultState() + data object Error : ResultState() + } + + sealed class ResultStateData { + data object Initial : ResultStateData() + data object Loading : ResultStateData() + data class Success(val userInfo: UserInfo) : ResultStateData() + data class Error(val message: String) : ResultStateData() + } +} \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/ui/main/MainFragment.kt b/app/src/main/java/ru/myitschool/work/ui/main/MainFragment.kt index 00f0012..b207dcd 100644 --- a/app/src/main/java/ru/myitschool/work/ui/main/MainFragment.kt +++ b/app/src/main/java/ru/myitschool/work/ui/main/MainFragment.kt @@ -12,6 +12,7 @@ import dagger.hilt.android.AndroidEntryPoint import ru.myitschool.work.R import ru.myitschool.work.api.main.Authorities import ru.myitschool.work.databinding.FragmentMainBinding +import ru.myitschool.work.ui.admin.AdminDestination import ru.myitschool.work.ui.list.ListAdapter import ru.myitschool.work.ui.login.LoginDestination import ru.myitschool.work.ui.scan.qr.QrScanDestination @@ -186,12 +187,12 @@ class MainFragment : Fragment(R.layout.fragment_main) { private fun navigateToAdmin() { - try {/* + try { authPreferences.clearLoginState() findNavController().apply { popBackStack(AdminDestination, false) navigate(AdminDestination) - }*/ + } } catch (e: Exception) { Log.e("MainFragment", "Error navigating to login", e) } diff --git a/app/src/main/java/ru/myitschool/work/ui/result/TextStatus.kt b/app/src/main/java/ru/myitschool/work/ui/result/TextStatus.kt deleted file mode 100644 index cb4a621..0000000 --- a/app/src/main/java/ru/myitschool/work/ui/result/TextStatus.kt +++ /dev/null @@ -1,6 +0,0 @@ -package ru.myitschool.work.ui.result - -object TextStatus { - const val error = "Вход был отменён/Operation was cancelled" - const val success = "Успешно/Success" -}