Here is my project in MVI
that has UseCase
. I can call Successful
and Error
in UploadImageResult
sealed class. But when want to show progress in UI, should call UploadedProgressBarProcess
and then get this in ViewModel
. That's not call and work this. Why can't do this?
class UploadImageUseCase(
private val documentsRepository: DocumentsRepository,
private val context: Context
) : UseCase<UploadImageAction, UploadImageResult> {
override fun apply(upstream: Observable<UploadImageAction>): ObservableSource<UploadImageResult> {
return upstream.flatMap { action ->
val imageToFile = FileHelper(context).getFile(action.uri[action.uploadingRequestCount - 1])
val requestFile = imageToFile.asRequestBody("image/*".toMediaTypeOrNull())
val body = ProgressbarUploadingProcessHelper(requestFile.contentType(), imageToFile)
{ percentageOfProgress ->
UploadImageResult.UploadedProgressBarProcess(
percentageOfProgress, action.uri, action.imageId
)
}
documentsRepository.uploadImage(
convertFileToMultipart(action.file, action.file.name, body),
action.imageId,
).toObservable().map { result ->
result.fold(onSuccess = { response ->
UploadImageResult.Successful(
action.imageId, response.data?.token ?: "", action.uploadingRequestCount, action.uri
)
}, onFailure = {
UploadImageResult.Error(action.imageId, action.uri, action.uploadingRequestCount)
})
}.startWithItem(UploadImageResult.Loading(action.imageId, action.uri, action.uploadingRequestCount))
}
}
}
data class UploadImageAction(val imageId: String, val uri: ArrayList<Uri>, val file: File, val uploadingRequestCount: Int) :
Action
sealed class UploadImageResult : ActionResult {
data class Loading(val imageId: String, val uri: ArrayList<Uri>, val uploadingRequestCount: Int) : UploadImageResult()
data class UploadedProgressBarProcess(
val percentageOfProgress: Int, val uri: ArrayList<Uri>, val imageId: String
) :
UploadImageResult()
data class Successful(val imageId: String, val token: String, val uploadingRequestCount: Int, val uri: ArrayList<Uri>) :
UploadImageResult()
data class Error(val imageId: String, val uri: ArrayList<Uri>, val uploadingRequestCount: Int) : UploadImageResult()
}
private fun convertFileToMultipart(
file: File, fileName: String, body: ProgressbarUploadingProcessHelper
): MultipartBody.Part {
val requestFile = file.asRequestBody("image/*".toMediaTypeOrNull())
return MultipartBody.Part.createFormData("file", fileName, body)
}