From b80707e2f872b4d332da7de9d3b4cf9303bf7d1a Mon Sep 17 00:00:00 2001 From: ikseong00 <127182222+ikseong00@users.noreply.github.com> Date: Tue, 24 Mar 2026 16:59:48 +0900 Subject: [PATCH 1/2] =?UTF-8?q?[feat]=20#167:=20MviIntentStore=20initialFe?= =?UTF-8?q?tchData=20nullable=20=EC=A0=84=ED=99=98=20=EB=B0=8F=20asStateFl?= =?UTF-8?q?ow=20=EB=B6=84=EA=B8=B0=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../neki/android/core/ui/MviIntentStore.kt | 24 ++++++++++++------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/core/ui/src/main/java/com/neki/android/core/ui/MviIntentStore.kt b/core/ui/src/main/java/com/neki/android/core/ui/MviIntentStore.kt index 6e1aa677f..3b1820319 100644 --- a/core/ui/src/main/java/com/neki/android/core/ui/MviIntentStore.kt +++ b/core/ui/src/main/java/com/neki/android/core/ui/MviIntentStore.kt @@ -8,6 +8,7 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.onStart import kotlinx.coroutines.flow.receiveAsFlow import kotlinx.coroutines.flow.stateIn @@ -22,7 +23,7 @@ interface MviIntentStore { class MviIntentStoreImpl( initialState: STATE, - initialFetchData: () -> Unit, + initialFetchData: (() -> Unit)?, private val coroutineScope: CoroutineScope, private val onIntent: ( intent: INTENT, @@ -32,13 +33,18 @@ class MviIntentStoreImpl( ) -> Unit, ) : MviIntentStore { private val _uiState = MutableStateFlow(initialState) - override val uiState: StateFlow = _uiState - .onStart { initialFetchData() } - .stateIn( - scope = coroutineScope, - started = SharingStarted.WhileSubscribed(5000L), - initialValue = initialState, - ) + override val uiState: StateFlow = + if (initialFetchData != null) { + _uiState + .onStart { initialFetchData() } + .stateIn( + scope = coroutineScope, + started = SharingStarted.WhileSubscribed(5000L), + initialValue = initialState, + ) + } else { + _uiState.asStateFlow() + } private val _sideEffects = Channel(Channel.BUFFERED) override val sideEffects: Flow = _sideEffects.receiveAsFlow() private fun setState(reduce: STATE.() -> STATE) { @@ -62,7 +68,7 @@ class MviIntentStoreImpl( fun ViewModel.mviIntentStore( initialState: STATE, onIntent: (INTENT, STATE, (STATE.() -> STATE) -> Unit, (EFFECT) -> Unit) -> Unit, - initialFetchData: () -> Unit = {}, + initialFetchData: (() -> Unit)? = null, ): MviIntentStore = MviIntentStoreImpl( initialState = initialState, coroutineScope = viewModelScope, From d7eee710ff06d4318f48744900dada21411212bb Mon Sep 17 00:00:00 2001 From: ikseong00 <127182222+ikseong00@users.noreply.github.com> Date: Tue, 24 Mar 2026 17:19:33 +0900 Subject: [PATCH 2/2] =?UTF-8?q?[feat]=20#167:=20=EC=95=84=EC=B9=B4?= =?UTF-8?q?=EC=9D=B4=EB=B8=8C/=ED=8F=AC=EC=A6=88/=EB=A7=88=EC=9D=B4?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80/=EC=95=BD=EA=B4=80/=EC=97=85?= =?UTF-8?q?=EB=A1=9C=EB=93=9C=20ViewModel=20=EC=B4=88=EA=B8=B0=20=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=84=B0=20=EB=A1=9C=EB=93=9C=20init=20=EC=A0=84?= =?UTF-8?q?=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../feature/archive/impl/album/AllAlbumViewModel.kt | 5 ++++- .../feature/archive/impl/main/ArchiveMainViewModel.kt | 7 +++++-- .../neki/android/feature/auth/impl/term/TermViewModel.kt | 5 ++++- .../android/feature/mypage/impl/main/MyPageViewModel.kt | 5 ++++- .../photo_upload/impl/album/UploadAlbumViewModel.kt | 5 ++++- .../feature/pose/impl/detail/PoseDetailViewModel.kt | 2 +- .../feature/pose/impl/random/RandomPoseViewModel.kt | 5 ++++- 7 files changed, 26 insertions(+), 8 deletions(-) diff --git a/feature/archive/impl/src/main/kotlin/com/neki/android/feature/archive/impl/album/AllAlbumViewModel.kt b/feature/archive/impl/src/main/kotlin/com/neki/android/feature/archive/impl/album/AllAlbumViewModel.kt index 98058deac..f6dbbc168 100644 --- a/feature/archive/impl/src/main/kotlin/com/neki/android/feature/archive/impl/album/AllAlbumViewModel.kt +++ b/feature/archive/impl/src/main/kotlin/com/neki/android/feature/archive/impl/album/AllAlbumViewModel.kt @@ -28,9 +28,12 @@ class AllAlbumViewModel @Inject constructor( mviIntentStore( initialState = AllAlbumState(), onIntent = ::onIntent, - initialFetchData = { store.onIntent(AllAlbumIntent.EnterAllAlbumScreen) }, ) + init { + store.onIntent(AllAlbumIntent.EnterAllAlbumScreen) + } + private fun onIntent( intent: AllAlbumIntent, state: AllAlbumState, diff --git a/feature/archive/impl/src/main/kotlin/com/neki/android/feature/archive/impl/main/ArchiveMainViewModel.kt b/feature/archive/impl/src/main/kotlin/com/neki/android/feature/archive/impl/main/ArchiveMainViewModel.kt index 5c823aa54..b036e16da 100644 --- a/feature/archive/impl/src/main/kotlin/com/neki/android/feature/archive/impl/main/ArchiveMainViewModel.kt +++ b/feature/archive/impl/src/main/kotlin/com/neki/android/feature/archive/impl/main/ArchiveMainViewModel.kt @@ -32,10 +32,13 @@ class ArchiveMainViewModel @Inject constructor( mviIntentStore( initialState = ArchiveMainState(), onIntent = ::onIntent, - initialFetchData = { store.onIntent(ArchiveMainIntent.EnterArchiveMainScreen) }, ) - private var fetchJob: Job? = null + + init { + store.onIntent(ArchiveMainIntent.EnterArchiveMainScreen) + } + private fun onIntent( intent: ArchiveMainIntent, state: ArchiveMainState, diff --git a/feature/auth/impl/src/main/kotlin/com/neki/android/feature/auth/impl/term/TermViewModel.kt b/feature/auth/impl/src/main/kotlin/com/neki/android/feature/auth/impl/term/TermViewModel.kt index d08a463d9..30fa9b9d7 100644 --- a/feature/auth/impl/src/main/kotlin/com/neki/android/feature/auth/impl/term/TermViewModel.kt +++ b/feature/auth/impl/src/main/kotlin/com/neki/android/feature/auth/impl/term/TermViewModel.kt @@ -22,9 +22,12 @@ class TermViewModel @Inject constructor( mviIntentStore( initialState = TermState(), onIntent = ::onIntent, - initialFetchData = { store.onIntent(TermIntent.EnterTermScreen) }, ) + init { + store.onIntent(TermIntent.EnterTermScreen) + } + private fun onIntent( intent: TermIntent, state: TermState, diff --git a/feature/mypage/impl/src/main/java/com/neki/android/feature/mypage/impl/main/MyPageViewModel.kt b/feature/mypage/impl/src/main/java/com/neki/android/feature/mypage/impl/main/MyPageViewModel.kt index e86bd2815..918d946fe 100644 --- a/feature/mypage/impl/src/main/java/com/neki/android/feature/mypage/impl/main/MyPageViewModel.kt +++ b/feature/mypage/impl/src/main/java/com/neki/android/feature/mypage/impl/main/MyPageViewModel.kt @@ -29,9 +29,12 @@ internal class MyPageViewModel @Inject constructor( mviIntentStore( initialState = MyPageState(), onIntent = ::onIntent, - initialFetchData = { store.onIntent(MyPageIntent.EnterMypageScreen) }, ) + init { + store.onIntent(MyPageIntent.EnterMypageScreen) + } + private fun onIntent( intent: MyPageIntent, state: MyPageState, diff --git a/feature/photo-upload/impl/src/main/java/com/neki/android/feature/photo_upload/impl/album/UploadAlbumViewModel.kt b/feature/photo-upload/impl/src/main/java/com/neki/android/feature/photo_upload/impl/album/UploadAlbumViewModel.kt index 1f5dbafea..da94bf206 100644 --- a/feature/photo-upload/impl/src/main/java/com/neki/android/feature/photo_upload/impl/album/UploadAlbumViewModel.kt +++ b/feature/photo-upload/impl/src/main/java/com/neki/android/feature/photo_upload/impl/album/UploadAlbumViewModel.kt @@ -44,9 +44,12 @@ class UploadAlbumViewModel @AssistedInject constructor( selectedUris = uriStrings.map { it.toUri() }.toImmutableList(), ), onIntent = ::onIntent, - initialFetchData = { store.onIntent(UploadAlbumIntent.EnterUploadAlbumScreen) }, ) + init { + store.onIntent(UploadAlbumIntent.EnterUploadAlbumScreen) + } + private fun onIntent( intent: UploadAlbumIntent, state: UploadAlbumState, diff --git a/feature/pose/impl/src/main/java/com/neki/android/feature/pose/impl/detail/PoseDetailViewModel.kt b/feature/pose/impl/src/main/java/com/neki/android/feature/pose/impl/detail/PoseDetailViewModel.kt index bb6b51e2a..37340b53b 100644 --- a/feature/pose/impl/src/main/java/com/neki/android/feature/pose/impl/detail/PoseDetailViewModel.kt +++ b/feature/pose/impl/src/main/java/com/neki/android/feature/pose/impl/detail/PoseDetailViewModel.kt @@ -36,10 +36,10 @@ class PoseDetailViewModel @AssistedInject constructor( mviIntentStore( initialState = PoseDetailState(), onIntent = ::onIntent, - initialFetchData = { store.onIntent(PoseDetailIntent.EnterPoseDetailScreen) }, ) init { + store.onIntent(PoseDetailIntent.EnterPoseDetailScreen) viewModelScope.launch { bookmarkRequests .debounce(500) diff --git a/feature/pose/impl/src/main/java/com/neki/android/feature/pose/impl/random/RandomPoseViewModel.kt b/feature/pose/impl/src/main/java/com/neki/android/feature/pose/impl/random/RandomPoseViewModel.kt index 25670ed90..24d3c7a22 100644 --- a/feature/pose/impl/src/main/java/com/neki/android/feature/pose/impl/random/RandomPoseViewModel.kt +++ b/feature/pose/impl/src/main/java/com/neki/android/feature/pose/impl/random/RandomPoseViewModel.kt @@ -42,9 +42,12 @@ internal class RandomPoseViewModel @AssistedInject constructor( mviIntentStore( initialState = RandomPoseState(), onIntent = ::onIntent, - initialFetchData = { store.onIntent(RandomPoseIntent.EnterRandomPoseScreen) }, ) + init { + store.onIntent(RandomPoseIntent.EnterRandomPoseScreen) + } + private fun onIntent( intent: RandomPoseIntent, state: RandomPoseState,