Skip to content

Commit 067476c

Browse files
authored
Merge pull request #185 from YAPP-Github/feat/#178-select-album
[feat] #178 select-album 모듈 구현 및 upload-album 전환
2 parents 745b798 + 987ffed commit 067476c

21 files changed

Lines changed: 611 additions & 466 deletions

File tree

app/build.gradle.kts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,8 @@ dependencies {
8383
implementation(projects.feature.mypage.impl)
8484
implementation(projects.feature.photoUpload.api)
8585
implementation(projects.feature.photoUpload.impl)
86+
implementation(projects.feature.selectAlbum.api)
87+
implementation(projects.feature.selectAlbum.impl)
8688

8789
implementation(libs.timber)
8890

app/src/main/java/com/neki/android/app/MainActivity.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ import com.neki.android.core.navigation.root.RootNavigator
3232
import com.neki.android.feature.auth.api.AuthNavKey
3333
import com.neki.android.feature.auth.impl.navigation.authEntryProvider
3434
import com.neki.android.feature.photo_upload.api.navigateToQRScan
35-
import com.neki.android.feature.photo_upload.api.navigateToUploadAlbum
35+
import com.neki.android.feature.select_album.api.navigateToSelectAlbum
3636
import android.net.Uri
3737
import androidx.core.content.IntentCompat
3838
import dagger.hilt.android.AndroidEntryPoint
@@ -123,8 +123,7 @@ class MainActivity : ComponentActivity() {
123123
onTabSelected = { mainNavigator.navigate(it) },
124124
onBack = { mainNavigator.goBack() },
125125
navigateToQRScan = mainNavigator::navigateToQRScan,
126-
navigateToUploadAlbumWithGallery = mainNavigator::navigateToUploadAlbum,
127-
navigateToUploadAlbumWithQRScan = mainNavigator::navigateToUploadAlbum,
126+
navigateToSelectAlbum = { action -> mainNavigator.navigateToSelectAlbum(action) },
128127
pendingShareUriStrings = pendingShareUriStrings,
129128
onShareUrisConsumed = { pendingShareUriStrings = persistentListOf() },
130129
)

app/src/main/java/com/neki/android/app/main/MainContract.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.neki.android.app.main
22

33
import android.net.Uri
4+
import com.neki.android.feature.select_album.api.SelectAlbumAction
45
import kotlinx.collections.immutable.ImmutableList
56
import kotlinx.collections.immutable.persistentListOf
67

@@ -28,8 +29,7 @@ sealed interface MainIntent {
2829
sealed interface MainSideEffect {
2930
data object NavigateToQRScan : MainSideEffect
3031
data object OpenGallery : MainSideEffect
31-
data class NavigateToUploadAlbumWithGallery(val uriStrings: List<String>) : MainSideEffect
32-
data class NavigateToUploadAlbumWithQRScan(val imageUrl: String) : MainSideEffect
32+
data class NavigateToSelectAlbum(val action: SelectAlbumAction) : MainSideEffect
3333
data class ShowToast(val message: String) : MainSideEffect
3434
data object RefreshArchive : MainSideEffect
3535
}

app/src/main/java/com/neki/android/app/main/MainScreen.kt

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ import com.neki.android.feature.mypage.api.MyPageNavKey
4343
import com.neki.android.feature.photo_upload.api.PhotoUploadNavKey
4444
import com.neki.android.feature.photo_upload.api.QRScanResult
4545
import com.neki.android.feature.pose.api.PoseNavKey
46+
import com.neki.android.feature.select_album.api.SelectAlbumAction
4647
import timber.log.Timber
4748

4849
@Composable
@@ -54,8 +55,7 @@ fun MainRoute(
5455
onTabSelected: (NavKey) -> Unit,
5556
onBack: () -> Unit,
5657
navigateToQRScan: () -> Unit,
57-
navigateToUploadAlbumWithGallery: (List<String>) -> Unit,
58-
navigateToUploadAlbumWithQRScan: (String) -> Unit,
58+
navigateToSelectAlbum: (SelectAlbumAction) -> Unit,
5959
pendingShareUriStrings: ImmutableList<String> = persistentListOf(),
6060
onShareUrisConsumed: () -> Unit = {},
6161
viewModel: MainViewModel = hiltViewModel(),
@@ -95,9 +95,7 @@ fun MainRoute(
9595
MainSideEffect.OpenGallery -> photoPicker.launch(
9696
PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly),
9797
)
98-
99-
is MainSideEffect.NavigateToUploadAlbumWithGallery -> navigateToUploadAlbumWithGallery(sideEffect.uriStrings)
100-
is MainSideEffect.NavigateToUploadAlbumWithQRScan -> navigateToUploadAlbumWithQRScan(sideEffect.imageUrl)
98+
is MainSideEffect.NavigateToSelectAlbum -> navigateToSelectAlbum(sideEffect.action)
10199
is MainSideEffect.ShowToast -> nekiToast.showToast(sideEffect.message)
102100
MainSideEffect.RefreshArchive -> resultBus.sendResult(result = PhotoUploadedResult, allowDuplicate = false)
103101
}

app/src/main/java/com/neki/android/app/main/MainViewModel.kt

Lines changed: 28 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import com.neki.android.core.domain.usecase.UploadMultiplePhotoUseCase
77
import com.neki.android.core.domain.usecase.UploadSinglePhotoUseCase
88
import com.neki.android.core.ui.MviIntentStore
99
import com.neki.android.core.ui.mviIntentStore
10+
import com.neki.android.feature.select_album.api.SelectAlbumAction
1011
import dagger.hilt.android.lifecycle.HiltViewModel
1112
import kotlinx.collections.immutable.persistentListOf
1213
import kotlinx.collections.immutable.toImmutableList
@@ -39,10 +40,12 @@ class MainViewModel @Inject constructor(
3940
reduce { copy(isShowAddPhotoBottomSheet = false) }
4041
postSideEffect(MainSideEffect.NavigateToQRScan)
4142
}
43+
4244
MainIntent.ClickGalleryUpload -> {
4345
reduce { copy(isShowAddPhotoBottomSheet = false) }
4446
postSideEffect(MainSideEffect.OpenGallery)
4547
}
48+
4649
is MainIntent.SelectGalleryImage -> reduce { copy(isShowSelectWithAlbumDialog = true, selectedUris = intent.uris.toImmutableList()) }
4750
is MainIntent.ShareImageReceived -> reduce { copy(isShowSelectWithAlbumDialog = true, selectedUris = intent.uris.toImmutableList()) }
4851
is MainIntent.QRCodeScanned -> reduce { copy(scannedImageUrl = intent.imageUrl, isShowSelectWithAlbumDialog = true) }
@@ -53,43 +56,41 @@ class MainViewModel @Inject constructor(
5356
scannedImageUrl = null,
5457
)
5558
}
59+
5660
MainIntent.ClickUploadWithAlbum -> {
61+
val action = if (state.scannedImageUrl != null) {
62+
SelectAlbumAction.UploadFromQR(imageUrl = state.scannedImageUrl)
63+
} else {
64+
SelectAlbumAction.UploadFromGallery(
65+
imageUriStrings = state.selectedUris.map { it.toString() },
66+
)
67+
}
5768
reduce {
5869
copy(
5970
isShowSelectWithAlbumDialog = false,
6071
scannedImageUrl = null,
6172
selectedUris = persistentListOf(),
6273
)
6374
}
75+
postSideEffect(MainSideEffect.NavigateToSelectAlbum(action))
76+
}
77+
78+
MainIntent.ClickUploadWithoutAlbum -> {
79+
reduce { copy(isShowSelectWithAlbumDialog = false) }
6480
if (state.scannedImageUrl != null) {
65-
postSideEffect(MainSideEffect.NavigateToUploadAlbumWithQRScan(state.scannedImageUrl))
81+
uploadSingleImage(
82+
imageUrl = state.scannedImageUrl,
83+
reduce = reduce,
84+
postSideEffect = postSideEffect,
85+
)
6686
} else {
67-
postSideEffect(MainSideEffect.NavigateToUploadAlbumWithGallery(state.selectedUris.map { it.toString() }))
87+
uploadMultipleImages(
88+
imageUris = state.selectedUris,
89+
reduce = reduce,
90+
postSideEffect = postSideEffect,
91+
)
6892
}
6993
}
70-
MainIntent.ClickUploadWithoutAlbum -> uploadWithoutAlbum(state, reduce, postSideEffect)
71-
}
72-
}
73-
74-
private fun uploadWithoutAlbum(
75-
state: MainState,
76-
reduce: (MainState.() -> MainState) -> Unit,
77-
postSideEffect: (MainSideEffect) -> Unit,
78-
) {
79-
reduce { copy(isShowSelectWithAlbumDialog = false) }
80-
81-
if (state.scannedImageUrl != null) {
82-
uploadSingleImage(
83-
imageUrl = state.scannedImageUrl,
84-
reduce = reduce,
85-
postSideEffect = postSideEffect,
86-
)
87-
} else {
88-
uploadMultipleImages(
89-
imageUris = state.selectedUris,
90-
reduce = reduce,
91-
postSideEffect = postSideEffect,
92-
)
9394
}
9495
}
9596

@@ -101,7 +102,7 @@ class MainViewModel @Inject constructor(
101102
viewModelScope.launch {
102103
reduce { copy(isLoading = true) }
103104

104-
uploadSinglePhotoUseCase(imageUrl = imageUrl)
105+
uploadSinglePhotoUseCase(imageUrl = imageUrl, folderId = null)
105106
.onSuccess {
106107
reduce { copy(isLoading = false, scannedImageUrl = null) }
107108
postSideEffect(MainSideEffect.ShowToast("이미지를 추가했어요"))
@@ -123,7 +124,7 @@ class MainViewModel @Inject constructor(
123124
viewModelScope.launch {
124125
reduce { copy(isLoading = true) }
125126

126-
uploadMultiplePhotoUseCase(imageUris = imageUris)
127+
uploadMultiplePhotoUseCase(imageUris = imageUris, folderId = null)
127128
.onSuccess {
128129
reduce { copy(isLoading = false, selectedUris = persistentListOf()) }
129130
postSideEffect(MainSideEffect.ShowToast("이미지를 추가했어요"))

feature/photo-upload/api/src/main/java/com/neki/android/feature/photo_upload/api/PhotoUploadNavKey.kt

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,22 +8,8 @@ sealed interface PhotoUploadNavKey : NavKey {
88

99
@Serializable
1010
data object QRScan : PhotoUploadNavKey
11-
12-
@Serializable
13-
data class UploadAlbum(
14-
val imageUrl: String? = null,
15-
val uriStrings: List<String> = emptyList(),
16-
) : PhotoUploadNavKey
1711
}
1812

1913
fun MainNavigator.navigateToQRScan() {
2014
navigate(PhotoUploadNavKey.QRScan)
2115
}
22-
23-
fun MainNavigator.navigateToUploadAlbum(uriStrings: List<String>) {
24-
navigate(PhotoUploadNavKey.UploadAlbum(uriStrings = uriStrings))
25-
}
26-
27-
fun MainNavigator.navigateToUploadAlbum(imageUrl: String) {
28-
navigate(PhotoUploadNavKey.UploadAlbum(imageUrl = imageUrl))
29-
}

feature/photo-upload/impl/src/main/java/com/neki/android/feature/photo_upload/impl/album/UploadAlbumContract.kt

Lines changed: 0 additions & 39 deletions
This file was deleted.

feature/photo-upload/impl/src/main/java/com/neki/android/feature/photo_upload/impl/album/UploadAlbumScreen.kt

Lines changed: 0 additions & 135 deletions
This file was deleted.

0 commit comments

Comments
 (0)