Implement showing authentication progress

This commit is contained in:
Kirill Kamakin
2022-04-09 18:56:25 +05:00
parent 4944cd3cf3
commit 50c8e14593
8 changed files with 89 additions and 21 deletions

View File

@@ -12,6 +12,7 @@ import gq.kirmanak.mealient.R
import gq.kirmanak.mealient.data.network.NetworkError
import gq.kirmanak.mealient.databinding.FragmentBaseUrlBinding
import gq.kirmanak.mealient.extensions.checkIfInputIsEmpty
import gq.kirmanak.mealient.ui.OperationUiState
import gq.kirmanak.mealient.ui.activity.MainActivityViewModel
import timber.log.Timber
@@ -26,7 +27,7 @@ class BaseURLFragment : Fragment(R.layout.fragment_base_url) {
super.onViewCreated(view, savedInstanceState)
Timber.v("onViewCreated() called with: view = $view, savedInstanceState = $savedInstanceState")
binding.button.setOnClickListener(::onProceedClick)
viewModel.checkURLResult.observe(viewLifecycleOwner, ::onCheckURLResult)
viewModel.uiState.observe(viewLifecycleOwner, ::onUiStateChange)
activityViewModel.updateUiState { it.copy(loginButtonVisible = false, titleVisible = true) }
}
@@ -40,13 +41,13 @@ class BaseURLFragment : Fragment(R.layout.fragment_base_url) {
viewModel.saveBaseUrl(url)
}
private fun onCheckURLResult(result: Result<Unit>) {
Timber.v("onCheckURLResult() called with: result = $result")
if (result.isSuccess) {
private fun onUiStateChange(uiState: OperationUiState<Unit>) = with(binding) {
Timber.v("onUiStateChange() called with: uiState = $uiState")
if (uiState.isSuccess) {
findNavController().navigate(BaseURLFragmentDirections.actionBaseURLFragmentToRecipesFragment())
return
}
binding.urlInputLayout.error = when (val exception = result.exceptionOrNull()) {
urlInputLayout.error = when (val exception = uiState.exceptionOrNull) {
is NetworkError.NoServerConnection -> getString(R.string.fragment_base_url_no_connection)
is NetworkError.NotMealie -> getString(R.string.fragment_base_url_unexpected_response)
is NetworkError.MalformedUrl -> {
@@ -56,5 +57,8 @@ class BaseURLFragment : Fragment(R.layout.fragment_base_url) {
null -> null
else -> getString(R.string.fragment_base_url_unknown_error)
}
uiState.updateButtonState(button)
uiState.updateProgressState(progress)
}
}

View File

@@ -8,6 +8,7 @@ import dagger.hilt.android.lifecycle.HiltViewModel
import gq.kirmanak.mealient.data.baseurl.BaseURLStorage
import gq.kirmanak.mealient.data.baseurl.VersionDataSource
import gq.kirmanak.mealient.extensions.runCatchingExceptCancel
import gq.kirmanak.mealient.ui.OperationUiState
import kotlinx.coroutines.launch
import timber.log.Timber
import javax.inject.Inject
@@ -18,11 +19,12 @@ class BaseURLViewModel @Inject constructor(
private val versionDataSource: VersionDataSource,
) : ViewModel() {
private val _checkURLResult = MutableLiveData<Result<Unit>>()
val checkURLResult: LiveData<Result<Unit>> get() = _checkURLResult
private val _uiState = MutableLiveData<OperationUiState<Unit>>(OperationUiState.Initial())
val uiState: LiveData<OperationUiState<Unit>> get() = _uiState
fun saveBaseUrl(baseURL: String) {
Timber.v("saveBaseUrl() called with: baseURL = $baseURL")
_uiState.value = OperationUiState.Progress()
val hasPrefix = ALLOWED_PREFIXES.any { baseURL.startsWith(it) }
val url = baseURL.takeIf { hasPrefix } ?: WITH_PREFIX_FORMAT.format(baseURL)
viewModelScope.launch { checkBaseURL(url) }
@@ -36,7 +38,7 @@ class BaseURLViewModel @Inject constructor(
baseURLStorage.storeBaseURL(baseURL)
}
Timber.i("checkBaseURL: result is $result")
_checkURLResult.value = result
_uiState.value = OperationUiState.fromResult(result)
}
companion object {