Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
cddfb42
[fix] #161: ArchiveResult 송수신 처리 개선
ikseong00 Mar 14, 2026
d3eab4e
[fix] #161: ArchiveMain 결과 수신 시 전체 갱신하도록 변경
ikseong00 Mar 14, 2026
3833051
[fix] #161: AllPhoto/AllAlbum 결과 전파 추가
ikseong00 Mar 14, 2026
a5b0a10
[fix] #161: ArchiveResult를 화면별 Result 타입으로 분리
ikseong00 Mar 23, 2026
9b179f8
[fix] #161: 송수신 로직 화면별 Result 타입으로 전환
ikseong00 Mar 23, 2026
a34ce96
[feat] #175: 사진/포즈 상세 화면 핀치 줌 기능 추가
ikseong00 Mar 30, 2026
6a7dfdd
[feat] #175: 사진 상세 줌 제스처 충돌 해결 및 클리핑 처리
ikseong00 Mar 30, 2026
862a6d2
[feat] #175: PoseDetailScreen 미사용 import 제거
ikseong00 Mar 30, 2026
f874d22
[feat] #168: 사진 상세 메모 UI 및 상태 관리 구현
ikseong00 Mar 31, 2026
df81832
[feat] #168: 메모 수정 API 레이어 추가
ikseong00 Mar 31, 2026
b33be30
[feat] #168: 메모 UI 컴포넌트 분리 및 PhotoDetailImageItem 구조 변경
ikseong00 Mar 31, 2026
dc66204
[feat] #168: 사진별 메모 상태 관리 및 API 연동
ikseong00 Mar 31, 2026
0d1f875
[fix]: PhotoDetailImageItem 메모 수정 모드 시 하단 패딩(ActionBar 높이만큼) 추가
ikseong00 Mar 31, 2026
1e113bc
[chore]: START_ROOT_NAV_KEY 초기값 Auth(Splash)로 원복
ikseong00 Mar 31, 2026
3135b73
[fix] #168: MemoTextField에서 편집 모드(Editing)일 때만 메모 텍스트 변경 이벤트가 발생하도록 수정
ikseong00 Mar 31, 2026
2ff7ada
[feat] #168: 메모 수정 완료 시 이전 화면 갱신 Result 전달 및 memoModes ImmutableMap 적용
ikseong00 Apr 1, 2026
5e7e47c
[chore] #168: PhotoResponse memo 필드 TODO 주석 제거
ikseong00 Apr 2, 2026
7410917
[fix] #175: PhotoDetailScreen 내 AsyncImage 컨테이너의 clipToBounds 제거
ikseong00 Apr 2, 2026
8fef3aa
[fix] #175: PhotoDetail Pager 무한 스크롤 제거 및 인덱스 처리 로직 수정
ikseong00 Apr 5, 2026
11b55d5
Merge pull request #176 from YAPP-Github/feat/#175-photo-zoom-feature
ikseong00 Apr 6, 2026
7b93b83
[fix] #168: PhotoDetailImageItem의 MemoMode에 따른 IME 패딩 로직 수정
ikseong00 Apr 6, 2026
ba6102f
[refactor] #168: MemoTextField 전체 지우기 기능을 NekiTextButton으로 변경 및 레이아웃 수정
ikseong00 Apr 6, 2026
6f8fa73
[fix] #168: MemoTextField 편집 모드 하단 패딩 조정 및 텍스트·커서 색상 수정
ikseong00 Apr 7, 2026
ac301b6
Merge branch 'fix/#161-archive-result' into feat/#168-photo-detail-memo
ikseong00 Apr 7, 2026
665d529
Merge branch 'fix/#161-archive-result' into feat/#168-photo-detail-memo
ikseong00 Apr 7, 2026
1e3b710
Merge remote-tracking branch 'origin/feat/#168-photo-detail-memo' int…
ikseong00 Apr 7, 2026
98c7106
Merge pull request #177 from YAPP-Github/feat/#168-photo-detail-memo
ikseong00 Apr 8, 2026
6bc18e0
[fix] #161: 중간 화면에서 Result 릴레이하여 ArchiveMain 갱신 누락 수정
ikseong00 Apr 8, 2026
206b997
[refactor] #161: ArchiveEntryProvider의 ResultEffect를 ArchiveResult 공통…
ikseong00 Apr 8, 2026
5f9dec3
[fix] #161: ArchiveEntryProvider 내 ResultEffect 처리 대상 원상복구
ikseong00 Apr 9, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions app/src/main/java/com/neki/android/app/main/MainScreen.kt
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ import com.neki.android.core.ui.component.LoadingDialog
import com.neki.android.core.ui.compose.collectWithLifecycle
import com.neki.android.core.ui.toast.NekiToast
import com.neki.android.feature.archive.api.ArchiveNavKey
import com.neki.android.feature.archive.api.ArchiveResult
import com.neki.android.feature.archive.api.PhotoUploadedResult
import com.neki.android.feature.map.api.MapNavKey
import com.neki.android.feature.mypage.api.MyPageNavKey
import com.neki.android.feature.photo_upload.api.PhotoUploadNavKey
Expand Down Expand Up @@ -86,7 +86,7 @@ fun MainRoute(
is MainSideEffect.NavigateToUploadAlbumWithGallery -> navigateToUploadAlbumWithGallery(sideEffect.uriStrings)
is MainSideEffect.NavigateToUploadAlbumWithQRScan -> navigateToUploadAlbumWithQRScan(sideEffect.imageUrl)
is MainSideEffect.ShowToast -> nekiToast.showToast(sideEffect.message)
MainSideEffect.RefreshArchive -> resultBus.sendResult<ArchiveResult>(result = ArchiveResult.PhotoUploaded)
MainSideEffect.RefreshArchive -> resultBus.sendResult(result = PhotoUploadedResult, allowDuplicate = false)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ interface PhotoRepository {

suspend fun updateFavorite(photoId: Long, favorite: Boolean): Result<Unit>

suspend fun updateMemo(photoId: Long, memo: String): Result<Unit>

suspend fun getPhotosPage(
folderId: Long? = null,
page: Int = 0,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package com.neki.android.core.data.remote.api
import com.neki.android.core.data.remote.model.request.DeletePhotoRequest
import com.neki.android.core.data.remote.model.request.RegisterPhotoRequest
import com.neki.android.core.data.remote.model.request.UpdateFavoriteRequest
import com.neki.android.core.data.remote.model.request.UpdateMemoRequest
import com.neki.android.core.data.remote.model.response.BasicNullableResponse
import com.neki.android.core.data.remote.model.response.BasicResponse
import com.neki.android.core.data.remote.model.response.FavoriteSummaryResponse
Expand All @@ -15,6 +16,7 @@ import io.ktor.client.request.get
import io.ktor.client.request.parameter
import io.ktor.client.request.patch
import io.ktor.client.request.post
import io.ktor.client.request.put
import io.ktor.client.request.setBody
import javax.inject.Inject

Expand Down Expand Up @@ -53,6 +55,13 @@ class PhotoService @Inject constructor(
}.body()
}

// 메모 수정
suspend fun updateMemo(photoId: Long, memo: String): BasicNullableResponse<Unit> {
return client.put("/api/photos/$photoId") {
setBody(UpdateMemoRequest(memo))
}.body()
}

// 즐겨찾는 앨범 조회
suspend fun getFavoritePhotos(
page: Int = 0,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.neki.android.core.data.remote.model.request

import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

@Serializable
data class UpdateMemoRequest(
@SerialName("memo") val memo: String,
)
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ data class PhotoResponse(
@SerialName("width") val width: Int? = null,
@SerialName("height") val height: Int? = null,
@SerialName("createdAt") val createdAt: String,
@SerialName("memo") val memo: String? = null,
) {
internal fun toModel() = Photo(
id = photoId,
Expand All @@ -29,6 +30,7 @@ data class PhotoResponse(
height = height,
date = createdAt.toFormattedDate(),
contentType = ContentType.fromString(contentType),
memo = memo.orEmpty(),
)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,10 @@ class PhotoRepositoryImpl @Inject constructor(
photoService.updateFavorite(photoId, favorite)
}

override suspend fun updateMemo(photoId: Long, memo: String): Result<Unit> = runSuspendCatching {
photoService.updateMemo(photoId, memo)
}

override suspend fun getPhotosPage(
folderId: Long?,
page: Int,
Expand Down
23 changes: 23 additions & 0 deletions core/designsystem/src/main/res/drawable/icon_memo.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="28dp"
android:height="28dp"
android:viewportWidth="28"
android:viewportHeight="28">
<path
android:pathData="M11.698,22.845H4.45C3.649,22.845 3,22.196 3,21.396V11.849C3,11.464 3.153,11.095 3.425,10.824L9.824,4.425C10.095,4.153 10.464,4 10.849,4H20.396C21.196,4 21.845,4.649 21.845,5.45V11.248"
android:strokeLineJoin="round"
android:strokeWidth="1.93285"
android:fillColor="#00000000"
android:strokeColor="#4F525F"
android:strokeLineCap="round"/>
<path
android:pathData="M3,11.731H8.315C9.116,11.731 9.765,11.082 9.765,10.282V4"
android:strokeWidth="1.93285"
android:fillColor="#00000000"
android:strokeColor="#4F525F"/>
<path
android:pathData="M20.699,14.347L15.035,20.012C14.91,20.137 14.822,20.294 14.78,20.465L14.37,22.141C14.196,22.85 14.84,23.487 15.547,23.308L17.204,22.886C17.373,22.843 17.527,22.755 17.649,22.632L23.317,16.965C23.694,16.588 23.694,15.976 23.317,15.598L22.066,14.347C21.689,13.97 21.077,13.97 20.699,14.347Z"
android:strokeWidth="1.93285"
android:fillColor="#00000000"
android:strokeColor="#4F525F"/>
</vector>
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,5 @@ data class Photo(
val width: Int? = null,
val height: Int? = null,
val contentType: ContentType = ContentType.JPEG,
val memo: String = "",
)
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
package com.neki.android.feature.archive.api

sealed interface ArchiveResult {
data class PhotoDeleted(val photoId: List<Long>) : ArchiveResult {
constructor(photoId: Long) : this(listOf(photoId))
}
sealed interface ArchiveResult

data class FavoriteChanged(val photoId: Long, val isFavorite: Boolean) : ArchiveResult
data object PhotoDetailResult : ArchiveResult

data object PhotoUploaded : ArchiveResult
}
data object AlbumDetailResult : ArchiveResult

data object AllPhotoResult : ArchiveResult

data object AllAlbumResult : ArchiveResult

data object PhotoUploadedResult : ArchiveResult
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== ArchiveEntryProvider =="
fd 'ArchiveEntryProvider\.kt$' -x sed -n '1,320p' {}

echo
echo "== PhotoUploadedResult consumers and follow-up refresh intents =="
rg -n -C3 --glob '!**/build/**' --glob '!**/dist/**' '\bPhotoUploadedResult\b|\bRefreshArchiveMain\b|\bRefreshPhotos\b|\bRefreshAlbums\b' .

Repository: YAPP-Github/27th-App-Team-2-Android

Length of output: 30061


PhotoUploadedResult의 이벤트 전파(fan-out)가 불완전합니다.

현재 PhotoUploadedResultArchiveEntryProvider의 ArchiveMain 진입점에서만 소비되어 ArchiveMainIntent.RefreshArchiveMain을 dispatch합니다. 하지만 AllPhoto와 AlbumDetail 화면은 이 결과를 전혀 처리하지 않아, 사용자가 업로드 후 이 화면들에 머물고 있다면 새로운 사진이 반영되지 않습니다.

AllPhoto와 AlbumDetail도 업로드 이벤트에 응답하도록, ArchiveEntryProvider의 해당 진입점들에서 PhotoUploadedResult를 처리하고 각각 AllPhotoIntent.RefreshPhotosAlbumDetailIntent.RefreshPhotos를 dispatch해야 합니다.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@feature/archive/api/src/main/kotlin/com/neki/android/feature/archive/api/ArchiveResult.kt`
at line 13, PhotoUploadedResult currently only triggers handling in
ArchiveEntryProvider's ArchiveMain entry point (dispatching
ArchiveMainIntent.RefreshArchiveMain), so AllPhoto and AlbumDetail screens don't
refresh after uploads; update ArchiveEntryProvider to handle PhotoUploadedResult
in the entry points for AllPhoto and AlbumDetail as well and dispatch
AllPhotoIntent.RefreshPhotos and AlbumDetailIntent.RefreshPhotos respectively
when PhotoUploadedResult is received (ensure you reference the
PhotoUploadedResult enum/object, the ArchiveEntryProvider handlers for AllPhoto
and AlbumDetail, and the intent classes AllPhotoIntent.RefreshPhotos and
AlbumDetailIntent.RefreshPhotos).

1 change: 1 addition & 0 deletions feature/archive/impl/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,5 @@ dependencies {

implementation(libs.androidx.activity.compose)
implementation(libs.androidx.paging.compose)
implementation(libs.zoomable)
}
Original file line number Diff line number Diff line change
Expand Up @@ -53,11 +53,15 @@ sealed interface AllAlbumIntent {
data object DismissDeleteAlbumBottomSheet : AllAlbumIntent
data class SelectDeleteOption(val option: AlbumDeleteOption) : AllAlbumIntent
data object ClickDeleteConfirmButton : AllAlbumIntent

// Result Intent
data object RefreshAlbums : AllAlbumIntent
}

sealed interface AllAlbumSideEffect {
data object NavigateBack : AllAlbumSideEffect
data class NavigateToFavoriteAlbum(val albumId: Long) : AllAlbumSideEffect
data class NavigateToAlbumDetail(val albumId: Long, val title: String) : AllAlbumSideEffect
data class ShowToastMessage(val message: String) : AllAlbumSideEffect
data object NotifyResult : AllAlbumSideEffect
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.neki.android.core.designsystem.DevicePreview
import com.neki.android.core.designsystem.ui.theme.NekiTheme
import com.neki.android.core.model.AlbumPreview
import com.neki.android.core.navigation.result.LocalResultEventBus
import com.neki.android.feature.archive.api.AllAlbumResult
import com.neki.android.core.ui.component.AlbumRowComponent
import com.neki.android.core.ui.component.DoubleButtonOptionBottomSheet
import com.neki.android.core.ui.component.FavoriteAlbumRowComponent
Expand All @@ -41,6 +43,7 @@ internal fun AllAlbumRoute(
val uiState by viewModel.store.uiState.collectAsStateWithLifecycle()
val context = LocalContext.current
val nekiToast = remember { NekiToast(context) }
val resultEventBus = LocalResultEventBus.current

viewModel.store.sideEffects.collectWithLifecycle { sideEffect ->
when (sideEffect) {
Expand All @@ -50,6 +53,9 @@ internal fun AllAlbumRoute(
is AllAlbumSideEffect.ShowToastMessage -> {
nekiToast.showToast(text = sideEffect.message)
}
AllAlbumSideEffect.NotifyResult -> {
resultEventBus.sendResult(result = AllAlbumResult, allowDuplicate = false)
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,9 @@ class AllAlbumViewModel @Inject constructor(
AllAlbumIntent.DismissDeleteAlbumBottomSheet -> reduce { copy(isShowDeleteAlbumBottomSheet = false) }
is AllAlbumIntent.SelectDeleteOption -> reduce { copy(selectedDeleteOption = intent.option) }
AllAlbumIntent.ClickDeleteConfirmButton -> handleDeleteConfirm(state, reduce, postSideEffect)

// Result Intent
AllAlbumIntent.RefreshAlbums -> fetchInitialData(reduce)
}
}

Expand Down Expand Up @@ -178,6 +181,7 @@ class AllAlbumViewModel @Inject constructor(
.onSuccess {
fetchFolders(reduce)
postSideEffect(AllAlbumSideEffect.ShowToastMessage("새로운 앨범을 추가했어요"))
postSideEffect(AllAlbumSideEffect.NotifyResult)
}
.onFailure { e ->
postSideEffect(AllAlbumSideEffect.ShowToastMessage("앨범 추가에 실패했어요"))
Expand All @@ -200,6 +204,7 @@ class AllAlbumViewModel @Inject constructor(
.onSuccess {
fetchFolders(reduce)
postSideEffect(AllAlbumSideEffect.ShowToastMessage("앨범을 삭제했어요"))
postSideEffect(AllAlbumSideEffect.NotifyResult)
}
.onFailure { e ->
Timber.e(e, "사진 삭제 실패")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,9 +71,8 @@ sealed interface AlbumDetailIntent {
data object ClickRenameBottomSheetConfirmButton : AlbumDetailIntent

// Result Intent
data class PhotoDeleted(val photoIds: List<Long>) : AlbumDetailIntent
data object RefreshPhotos : AlbumDetailIntent
data class ClickFavoriteIcon(val photo: Photo) : AlbumDetailIntent
data class FavoriteChanged(val photoId: Long, val isFavorite: Boolean) : AlbumDetailIntent
}

sealed interface AlbumDetailSideEffect {
Expand All @@ -83,4 +82,5 @@ sealed interface AlbumDetailSideEffect {
data class DownloadImages(val imageUrls: List<String>) : AlbumDetailSideEffect
data object OpenGallery : AlbumDetailSideEffect
data object RefreshPhotos : AlbumDetailSideEffect
data object NotifyResult : AlbumDetailSideEffect
}
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,8 @@ import androidx.paging.compose.itemKey
import com.neki.android.core.designsystem.ui.theme.NekiTheme
import com.neki.android.core.model.Photo
import com.neki.android.core.model.SortOrder
import com.neki.android.core.navigation.result.LocalResultEventBus
import com.neki.android.feature.archive.api.AlbumDetailResult
import com.neki.android.core.ui.component.DoubleButtonOptionBottomSheet
import com.neki.android.feature.archive.api.ArchiveNavKey
import com.neki.android.core.ui.component.LoadingDialog
Expand Down Expand Up @@ -69,6 +71,7 @@ internal fun AlbumDetailRoute(
val pagingItems = viewModel.photoPagingData.collectAsLazyPagingItems()
val context = LocalContext.current
val nekiToast = remember { NekiToast(context) }
val resultEventBus = LocalResultEventBus.current
val photoPicker = rememberLauncherForActivityResult(ActivityResultContracts.PickMultipleVisualMedia(10)) { uris ->
if (uris.isNotEmpty()) {
viewModel.store.onIntent(AlbumDetailIntent.SelectGalleryImage(uris))
Expand Down Expand Up @@ -109,6 +112,10 @@ internal fun AlbumDetailRoute(

AlbumDetailSideEffect.OpenGallery -> photoPicker.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly))
AlbumDetailSideEffect.RefreshPhotos -> pagingItems.refresh()

AlbumDetailSideEffect.NotifyResult -> {
resultEventBus.sendResult(result = AlbumDetailResult, allowDuplicate = false)
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -143,8 +143,10 @@ class AlbumDetailViewModel @AssistedInject constructor(
is AlbumDetailIntent.SelectGalleryImage -> uploadMultipleImages(intent.uris, reduce, postSideEffect)

// Result Intent
is AlbumDetailIntent.PhotoDeleted -> {
deletedPhotoIds.update { it + intent.photoIds.toSet() }
AlbumDetailIntent.RefreshPhotos -> {
deletedPhotoIds.value = emptySet()
updatedFavorites.value = emptyMap()
postSideEffect(AlbumDetailSideEffect.RefreshPhotos)
}

is AlbumDetailIntent.ClickFavoriteIcon -> {
Expand All @@ -160,10 +162,6 @@ class AlbumDetailViewModel @AssistedInject constructor(
}
}

is AlbumDetailIntent.FavoriteChanged -> {
updatedFavorites.update { it + (intent.photoId to intent.isFavorite) }
}

AlbumDetailIntent.DismissRenameBottomSheet -> reduce {
copy(isShowRenameAlbumBottomSheet = false, renameAlbumTextState = TextFieldState())
}
Expand Down Expand Up @@ -196,6 +194,7 @@ class AlbumDetailViewModel @AssistedInject constructor(
)
}
postSideEffect(AlbumDetailSideEffect.ShowToastMessage("앨범 이름을 변경했어요"))
postSideEffect(AlbumDetailSideEffect.NotifyResult)
}.onFailure { e ->
Timber.e(e)
reduce { copy(isLoading = false) }
Expand All @@ -220,6 +219,7 @@ class AlbumDetailViewModel @AssistedInject constructor(
reduce { copy(isLoading = false) }
postSideEffect(AlbumDetailSideEffect.RefreshPhotos)
postSideEffect(AlbumDetailSideEffect.ShowToastMessage("새로운 사진을 추가했어요"))
postSideEffect(AlbumDetailSideEffect.NotifyResult)
}.onFailure { e ->
Timber.e(e)
postSideEffect(AlbumDetailSideEffect.ShowToastMessage("이미지 업로드에 실패했어요"))
Expand Down Expand Up @@ -322,6 +322,7 @@ class AlbumDetailViewModel @AssistedInject constructor(
)
}
postSideEffect(AlbumDetailSideEffect.ShowToastMessage("사진을 삭제했어요"))
postSideEffect(AlbumDetailSideEffect.NotifyResult)
}
.onFailure { e ->
Timber.e(e)
Expand Down Expand Up @@ -364,6 +365,7 @@ class AlbumDetailViewModel @AssistedInject constructor(
)
}
postSideEffect(AlbumDetailSideEffect.ShowToastMessage("사진을 삭제했어요"))
postSideEffect(AlbumDetailSideEffect.NotifyResult)
}
.onFailure { e ->
Timber.e(e)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ data class ArchiveMainState(

sealed interface ArchiveMainIntent {
data object EnterArchiveMainScreen : ArchiveMainIntent
data object RefreshArchiveMainPhotos : ArchiveMainIntent
data object RefreshArchiveMain : ArchiveMainIntent
data object ClickScreen : ArchiveMainIntent
data object ClickGoToTopButton : ArchiveMainIntent

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,13 @@ class ArchiveMainViewModel @Inject constructor(
if (intent != ArchiveMainIntent.EnterArchiveMainScreen) reduce { copy(isFirstEntered = false) }
when (intent) {
ArchiveMainIntent.EnterArchiveMainScreen -> fetchInitialData(reduce)
ArchiveMainIntent.RefreshArchiveMainPhotos -> viewModelScope.launch { fetchPhotos(reduce) }
ArchiveMainIntent.RefreshArchiveMain -> viewModelScope.launch {
awaitAll(
async { fetchFavoriteSummary(reduce) },
async { fetchPhotos(reduce) },
async { fetchFolders(reduce) },
)
}
ArchiveMainIntent.ClickScreen -> reduce { copy(isFirstEntered = false) }
ArchiveMainIntent.ClickGoToTopButton -> postSideEffect(ArchiveMainSideEffect.ScrollToTop)

Expand Down
Loading
Loading