@@ -11,7 +11,6 @@ import androidx.paging.map
1111import com.neki.android.core.dataapi.repository.FolderRepository
1212import com.neki.android.core.dataapi.repository.PhotoRepository
1313import com.neki.android.core.domain.usecase.UploadMultiplePhotoUseCase
14- import com.neki.android.core.model.AlbumPreview
1514import com.neki.android.core.model.Photo
1615import com.neki.android.core.ui.MviIntentStore
1716import com.neki.android.core.ui.mviIntentStore
@@ -25,11 +24,11 @@ import dagger.hilt.android.lifecycle.HiltViewModel
2524import kotlinx.collections.immutable.persistentListOf
2625import kotlinx.collections.immutable.toImmutableList
2726import kotlinx.collections.immutable.toImmutableSet
28- import kotlinx.coroutines.async
29- import kotlinx.coroutines.awaitAll
27+ import kotlinx.coroutines.ExperimentalCoroutinesApi
3028import kotlinx.coroutines.flow.Flow
3129import kotlinx.coroutines.flow.MutableStateFlow
3230import kotlinx.coroutines.flow.combine
31+ import kotlinx.coroutines.flow.flatMapLatest
3332import kotlinx.coroutines.flow.update
3433import kotlinx.coroutines.launch
3534import timber.log.Timber
@@ -51,6 +50,7 @@ class AlbumDetailViewModel @AssistedInject constructor(
5150
5251 private val deletedPhotoIds = MutableStateFlow <Set <Long >>(emptySet())
5352 private val updatedFavorites = MutableStateFlow <Map <Long , Boolean >>(emptyMap())
53+ private val _importAlbumFilter = MutableStateFlow <Long ?>(null )
5454
5555 private val originalPagingData: Flow <PagingData <Photo >> =
5656 if (isFavoriteAlbum) {
@@ -59,6 +59,12 @@ class AlbumDetailViewModel @AssistedInject constructor(
5959 photoRepository.getPhotosFlow(albumId)
6060 }.cachedIn(viewModelScope)
6161
62+ @OptIn(ExperimentalCoroutinesApi ::class )
63+ val importPhotoPagingData: Flow <PagingData <Photo >> =
64+ _importAlbumFilter .flatMapLatest { folderId ->
65+ photoRepository.getPhotosFlow(folderId = folderId)
66+ }.cachedIn(viewModelScope)
67+
6268 val photoPagingData: Flow <PagingData <Photo >> = combine(
6369 originalPagingData,
6470 deletedPhotoIds,
@@ -109,11 +115,12 @@ class AlbumDetailViewModel @AssistedInject constructor(
109115
110116 AlbumDetailIntent .DismissImportPhotoBottomSheet -> {
111117 reduce { copy(isShowImportPhotoBottomSheet = false , importPhotoState = ImportPhotoState ()) }
118+ _importAlbumFilter .value = null
112119 }
113120
114121 is AlbumDetailIntent .SelectImportAlbum -> {
115122 reduce { copy(importPhotoState = importPhotoState.copy(selectedAlbumId = intent.albumId, isShowAlbumDropdown = false )) }
116- loadImportPhotos( intent.albumId, reduce)
123+ _importAlbumFilter .value = intent.albumId
117124 }
118125
119126 AlbumDetailIntent .ToggleImportAlbumDropdown -> {
@@ -209,7 +216,7 @@ class AlbumDetailViewModel @AssistedInject constructor(
209216 postSideEffect(AlbumDetailSideEffect .OpenGallery )
210217 } else {
211218 reduce { copy(isShowImportPhotoBottomSheet = true , importPhotoState = ImportPhotoState (currentAlbumId = albumId)) }
212- loadImportAlbumsAndPhotos (reduce)
219+ loadImportAlbums (reduce)
213220 }
214221 }
215222
@@ -280,29 +287,14 @@ class AlbumDetailViewModel @AssistedInject constructor(
280287 }
281288 }
282289
283- private fun loadImportAlbumsAndPhotos (reduce : (AlbumDetailState .() -> AlbumDetailState ) -> Unit ) {
284- viewModelScope.launch {
285- var loadedAlbums: List <AlbumPreview > = emptyList()
286- awaitAll(
287- async { folderRepository.getFolders().onSuccess { albums -> loadedAlbums = albums } },
288- async {
289- photoRepository.getPhotos(folderId = null ).onSuccess { photos ->
290- reduce { copy(importPhotoState = importPhotoState.copy(photos = photos.toImmutableList())) }
291- }
292- },
293- )
294- val options = buildList {
295- add(AlbumFilterOption (null , " 전체사진" , loadedAlbums.sumOf { it.photoCount }))
296- addAll(loadedAlbums.map { AlbumFilterOption (it.id, it.title, it.photoCount) })
297- }.toImmutableList()
298- reduce { copy(importPhotoState = importPhotoState.copy(allAlbumOptions = options)) }
299- }
300- }
301-
302- private fun loadImportPhotos (albumId : Long? , reduce : (AlbumDetailState .() -> AlbumDetailState ) -> Unit ) {
290+ private fun loadImportAlbums (reduce : (AlbumDetailState .() -> AlbumDetailState ) -> Unit ) {
303291 viewModelScope.launch {
304- photoRepository.getPhotos(folderId = albumId).onSuccess { photos ->
305- reduce { copy(importPhotoState = importPhotoState.copy(photos = photos.toImmutableList())) }
292+ folderRepository.getFolders().onSuccess { albums ->
293+ val options = buildList {
294+ add(AlbumFilterOption (null , " 전체사진" , albums.sumOf { it.photoCount }))
295+ addAll(albums.map { AlbumFilterOption (it.id, it.title, it.photoCount) })
296+ }.toImmutableList()
297+ reduce { copy(importPhotoState = importPhotoState.copy(allAlbumOptions = options)) }
306298 }
307299 }
308300 }
@@ -319,6 +311,7 @@ class AlbumDetailViewModel @AssistedInject constructor(
319311 targetFolderIds = listOf (albumId),
320312 ).onSuccess {
321313 reduce { copy(isShowImportPhotoBottomSheet = false , importPhotoState = ImportPhotoState ()) }
314+ _importAlbumFilter .value = null
322315 postSideEffect(AlbumDetailSideEffect .ShowToastMessage (" 사진을 앨범에 추가했어요" ))
323316 postSideEffect(AlbumDetailSideEffect .PhotoImported (albumId))
324317 }.onFailure { e ->
0 commit comments