Skip to content

Commit

Permalink
feat(PublicSharePassword): Refactor publicShareViewModel to use resul…
Browse files Browse the repository at this point in the history
…t livedata
  • Loading branch information
FabianDevel committed Sep 18, 2024
1 parent 9c11363 commit dffe4c9
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 20 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,8 @@ class PublicSharePasswordFragment : Fragment() {
passwordValidateButton.setOnClickListener { requireContext().openDeepLinkInBrowser(getPublicShareUrl()) }

publicSharePasswordEditText.addTextChangedListener { publicSharePasswordLayout.error = null }
observeSubmitPasswordResult()
observeInitResult()
}

//region Hack TODO: Remove this when the back will support bearer token
Expand Down Expand Up @@ -87,19 +89,29 @@ class PublicSharePasswordFragment : Fragment() {

showProgressCatching()
val password = binding.publicSharePasswordEditText.text?.trim().toString()
publicShareViewModel.submitPublicSharePassword(password).observe(viewLifecycleOwner) { isAuthorized ->
if (isAuthorized == true) {
publicShareViewModel.hasBeenAuthenticated = true
publicShareViewModel.initPublicShare(::onInitSuccess, ::onInitError)
} else {
hideProgressCatching(R.string.buttonValid)
binding.publicSharePasswordEditText.text = null
binding.publicSharePasswordLayout.error = getString(R.string.errorWrongPassword)
}
publicShareViewModel.submitPublicSharePassword(password)
}
}

private fun observeSubmitPasswordResult() = with(binding) {
publicShareViewModel.submitPasswordResult.observe(viewLifecycleOwner) { isAuthorized ->
if (isAuthorized == true) {
publicShareViewModel.hasBeenAuthenticated = true
publicShareViewModel.initPublicShare()
} else {
passwordValidateButton.hideProgressCatching(R.string.buttonValid)
publicSharePasswordEditText.text = null
publicSharePasswordLayout.error = getString(R.string.errorWrongPassword)
}
}
}

private fun observeInitResult() {
publicShareViewModel.initPublicShareResult.observe(viewLifecycleOwner) { (errorMessage, fileId) ->
errorMessage?.let(::onInitError) ?: onInitSuccess(fileId)
}
}

private fun onInitSuccess(fileId: Int?) {
binding.passwordValidateButton.hideProgressCatching(R.string.buttonValid)
safeNavigate(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,10 @@ package com.infomaniak.drive.ui.publicShare
import android.content.Context
import android.content.Intent
import androidx.core.content.FileProvider
import androidx.lifecycle.*
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.SavedStateHandle
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.infomaniak.drive.R
import com.infomaniak.drive.data.api.ApiRepository
import com.infomaniak.drive.data.api.CursorApiResponse
Expand All @@ -35,7 +38,6 @@ import com.infomaniak.drive.utils.printPdf
import com.infomaniak.drive.utils.saveToKDrive
import com.infomaniak.drive.utils.shareFile
import com.infomaniak.lib.core.models.ApiError
import com.infomaniak.lib.core.models.ApiResponseStatus
import com.infomaniak.lib.core.utils.SentryLog
import com.infomaniak.lib.core.utils.SingleLiveEvent
import kotlinx.coroutines.*
Expand All @@ -47,6 +49,8 @@ class PublicShareViewModel(val savedStateHandle: SavedStateHandle) : ViewModel()
var fileClicked: File? = null
val downloadProgressLiveData = MutableLiveData(0)
val buildArchiveResult = SingleLiveEvent<Pair<Int?, ArchiveUUID?>>()
val initPublicShareResult = SingleLiveEvent<Pair<ApiError?, Int?>>()
val submitPasswordResult = SingleLiveEvent<Boolean?>()
var hasBeenAuthenticated = false

val driveId: Int
Expand All @@ -64,18 +68,15 @@ class PublicShareViewModel(val savedStateHandle: SavedStateHandle) : ViewModel()
private var getPublicShareFilesJob: Job = Job()
private var currentCursor: String? = null

fun initPublicShare(onSuccess: (Int?) -> Unit, onError: (ApiError?) -> Unit) = viewModelScope.launch(Dispatchers.IO) {
fun initPublicShare() = viewModelScope.launch(Dispatchers.IO) {
val apiResponse = ApiRepository.getPublicShareInfo(driveId, publicShareUuid)
Dispatchers.Main {
when (apiResponse.result) {
ApiResponseStatus.SUCCESS -> apiResponse.data?.let { onSuccess(it.fileId) } ?: onError(null)
else -> onError(apiResponse.error)
}
}
val result = if (apiResponse.isSuccess()) null to apiResponse.data?.fileId else apiResponse.error to null

initPublicShareResult.postValue(result)
}

fun submitPublicSharePassword(password: String) = liveData(Dispatchers.IO) {
emit(ApiRepository.submitPublicSharePassword(driveId, publicShareUuid, password).data)
fun submitPublicSharePassword(password: String) = viewModelScope.launch(Dispatchers.IO) {
submitPasswordResult.postValue(ApiRepository.submitPublicSharePassword(driveId, publicShareUuid, password).data)
}

fun downloadPublicShareRootFile() = viewModelScope.launch(Dispatchers.IO) {
Expand Down

0 comments on commit dffe4c9

Please sign in to comment.