Skip to content

Commit

Permalink
[feat/#39] 다중 이미지 업로드 로직 개선
Browse files Browse the repository at this point in the history
  • Loading branch information
Jokwanhee committed Aug 3, 2024
1 parent 90010d3 commit 2c57535
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 55 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -279,7 +279,6 @@ class ReviewActivity : BaseActivity<ActivityReviewBinding>({
val fileExtension = getFileExtension(this, imageUri)
val imageData = readImageData(this, imageUri)
if (imageData != null) {
Log.d("minju1", fileExtension)
viewModel.requestPreSignedUrl(fileExtension)
} else {
toast("파일을 읽을 수 없습니다.")
Expand All @@ -293,22 +292,15 @@ class ReviewActivity : BaseActivity<ActivityReviewBinding>({
when (state) {
is UiState.Success -> {
val presignedUrl = state.data.presignedUrl
Log.d("minju3", "Presigned URL: $presignedUrl")
val uniqueImageUris = selectedImageUris.distinct()
Log.d("minju4", "Unique Image URIs: $uniqueImageUris")
val imageDataList = uniqueImageUris.mapNotNull { imageUriString ->
val imageDataList = selectedImageUris.mapNotNull { imageUriString ->
val imageUri = Uri.parse(imageUriString)
val imageData = readImageData(this, imageUri)
Log.d("minju5", "Image Data for $imageUriString: $imageData")
imageData
}

if (viewModel.preSignedUrlImages.value.contains(presignedUrl).not()) {
viewModel.setPreSignedUrlImages(listOf(presignedUrl))
}
viewModel.uploadImagesSequentially(presignedUrl, imageDataList) {
Log.d("minju10", "Upload images complete")
}
viewModel.uploadImagesSequentially(presignedUrl, imageDataList)
}

is UiState.Failure -> {
Expand All @@ -321,18 +313,9 @@ class ReviewActivity : BaseActivity<ActivityReviewBinding>({
}

private fun observeUploadImageToS3() {
viewModel.uploadImageState.asLiveData().observe(this) { state ->
when (state) {
is UiState.Success -> {
viewModel.postSeatReview()
Log.d("minju11", viewModel.preSignedUrlImages.value.toString())
}

is UiState.Failure -> {
toast("이미지 업로드 실패")
}

else -> {}
viewModel.count.asLiveData().observe(this) {
if (it == selectedImageUris.size && it != 0) {
viewModel.postSeatReview()
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -93,15 +93,13 @@ class ReviewViewModel @Inject constructor(
private val _seatRangeState = MutableStateFlow<UiState<List<SeatRangeModel>>>(UiState.Empty)
val seatRangeState: StateFlow<UiState<List<SeatRangeModel>>> = _seatRangeState

private val _getPreSignedUrl = MutableStateFlow<UiState<ResponsePresignedUrlModel>>(UiState.Loading)
private val _getPreSignedUrl =
MutableStateFlow<UiState<ResponsePresignedUrlModel>>(UiState.Loading)
val getPreSignedUrl = _getPreSignedUrl.asStateFlow()

private val _postReviewState = MutableStateFlow<UiState<Unit>>(UiState.Empty)
val postReviewState: StateFlow<UiState<Unit>> = _postReviewState.asStateFlow()

private val _uploadImageState = MutableStateFlow<UiState<Unit>>(UiState.Empty)
val uploadImageState: StateFlow<UiState<Unit>> = _uploadImageState.asStateFlow()

fun updateSelectedStadiumId(stadiumId: Int) {
_selectedStadiumId.value = stadiumId
}
Expand All @@ -124,12 +122,10 @@ class ReviewViewModel @Inject constructor(

fun setPreSignedUrlImages(images: List<String>) {
val newImages = images.map { removeQueryParameters(it) }.toSet()
Log.d("minju6", newImages.toString())
val currentImages = _preSignedUrlImages.value.map { removeQueryParameters(it) }.toSet()

val updatedImages = (currentImages + newImages).toList()
_preSignedUrlImages.value = updatedImages
Log.d("minju7", _preSignedUrlImages.value.toString())
}

private fun removeQueryParameters(url: String): String {
Expand Down Expand Up @@ -261,12 +257,12 @@ class ReviewViewModel @Inject constructor(
}
}
}

fun requestPreSignedUrl(fileExtension: String) {
viewModelScope.launch {
_getPreSignedUrl.value = UiState.Loading
seatReviewRepository.postReviewImagePresigned(fileExtension)
.onSuccess { response ->
Log.d("minju2", getPreSignedUrl.toString())
Timber.d("REQUEST PRESIGNED URL SUCCESS : $response")
_getPreSignedUrl.value = UiState.Success(response)
}
Expand All @@ -279,24 +275,30 @@ class ReviewViewModel @Inject constructor(
}
}


private var index = -1

private var _count = MutableStateFlow(0)
val count = _count.asStateFlow()

private fun uploadImageToPreSignedUrl(
presignedUrl: String,
image: ByteArray,
onComplete: () -> Unit,
imageDataList: List<ByteArray>,
) {
index++
viewModelScope.launch {
val result = seatReviewRepository.putImagePreSignedUrl(presignedUrl, image)
val result =
seatReviewRepository.putImagePreSignedUrl(presignedUrl, imageDataList[index])
result.onSuccess {
Timber.d("uploadImageToPreSignedUrl called with presignedUrl: $presignedUrl")
onComplete()
_count.value += 1
}.onFailure { t ->
if (t is HttpException) {
Timber.e("UPLOAD IMAGE FAILURE for presignedUrl: $presignedUrl with error: $t")
}
onComplete()
}
}
}

fun postSeatReview() {
viewModelScope.launch {
val seatReviewModel = SeatReviewModel(
Expand Down Expand Up @@ -332,29 +334,13 @@ class ReviewViewModel @Inject constructor(
}
}
}

fun uploadImagesSequentially(
presignedUrl: String,
imageDataList: List<ByteArray>,
onComplete: () -> Unit,
) {
var currentIndex = 0
_uploadImageState.value = UiState.Loading
fun uploadNextImages() {
if (currentIndex < imageDataList.size) {
val imageData = imageDataList[currentIndex]
Log.d("minju8", "Uploading image $currentIndex: $imageData")
uploadImageToPreSignedUrl(presignedUrl, imageData) {
currentIndex++
if (currentIndex < imageDataList.size) {
uploadNextImages()
} else {
_uploadImageState.value = UiState.Success(Unit)
Log.d("minju9", "All images uploaded successfully")
onComplete()
}
}
}
}
uploadNextImages()
uploadImageToPreSignedUrl(
presignedUrl, imageDataList
)
}
}

0 comments on commit 2c57535

Please sign in to comment.