From 32cadc26d38f6da668d257ef36aa530d7459d3f3 Mon Sep 17 00:00:00 2001 From: sysong Date: Fri, 22 Aug 2025 11:41:00 +0900 Subject: [PATCH 01/17] =?UTF-8?q?(CHORE)[#554]=20'core:ui'=20'core.router.?= =?UTF-8?q?routerApi'=20=EC=9D=98=EC=A1=B4=EC=84=B1=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/ui/build.gradle.kts | 1 + 1 file changed, 1 insertion(+) diff --git a/core/ui/build.gradle.kts b/core/ui/build.gradle.kts index 9b05f6a57..b8a38f033 100644 --- a/core/ui/build.gradle.kts +++ b/core/ui/build.gradle.kts @@ -12,4 +12,5 @@ android { dependencies { implementation(projects.core.designsystem) implementation(projects.core.domain.domainSessionApi) + implementation(projects.core.router.routerApi) } From 6cf9af986a62e4d3e9519844e0c7347b683de6f2 Mon Sep 17 00:00:00 2001 From: sysong Date: Fri, 22 Aug 2025 11:43:27 +0900 Subject: [PATCH 02/17] =?UTF-8?q?(FEAT)[#554]=20BaseViewModel.kt=20?= =?UTF-8?q?=EC=A0=95=EC=9D=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../droidknights/app/core/ui/BaseViewModel.kt | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 core/ui/src/main/java/com/droidknights/app/core/ui/BaseViewModel.kt diff --git a/core/ui/src/main/java/com/droidknights/app/core/ui/BaseViewModel.kt b/core/ui/src/main/java/com/droidknights/app/core/ui/BaseViewModel.kt new file mode 100644 index 000000000..d03739719 --- /dev/null +++ b/core/ui/src/main/java/com/droidknights/app/core/ui/BaseViewModel.kt @@ -0,0 +1,37 @@ +package com.droidknights.app.core.ui + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.droidknights.app.core.router.api.Navigator +import com.droidknights.app.core.router.api.model.Route +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.asSharedFlow +import kotlinx.coroutines.launch +import javax.inject.Inject + +@HiltViewModel +open class BaseViewModel @Inject constructor(): ViewModel() { + + @Inject + lateinit var navigator: Navigator + + protected val _errorFlow = MutableSharedFlow() + val errorFlow = _errorFlow.asSharedFlow() + + fun navigateBack() = viewModelScope.launch { + navigator.navigateBack() + } + + fun navigateWeb(url: String) = viewModelScope.launch { + navigator.navigateWeb(url) + } + + fun navigateTo( + route: Route, + saveState: Boolean = false, + launchSingleTop: Boolean = false + ) = viewModelScope.launch { + navigator.navigate(route, saveState, launchSingleTop) + } +} \ No newline at end of file From abb681641196a0ab5f7085d6a4164558a87a5b0d Mon Sep 17 00:00:00 2001 From: sysong Date: Fri, 22 Aug 2025 11:50:51 +0900 Subject: [PATCH 03/17] =?UTF-8?q?(REFACTOR)[#554]=20MainViewModel.kt?= =?UTF-8?q?=EC=97=90=20BaseViewModel.kt=20=EC=83=81=EC=86=8D=20=EC=B2=98?= =?UTF-8?q?=EB=A6=AC=20=ED=9B=84=20=EC=BD=94=EB=93=9C=20=EC=82=AD=EC=A0=9C?= =?UTF-8?q?.=20=EA=B7=B8=EC=97=90=EB=94=B0=EB=A5=B8=20MainActivity.kt?= =?UTF-8?q?=EC=9D=98=20=ED=99=94=EB=A9=B4=20=EC=9D=B4=EB=8F=99=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/feature/main/MainActivity.kt | 21 ++++++++-- .../app/feature/main/MainViewModel.kt | 41 ++----------------- 2 files changed, 20 insertions(+), 42 deletions(-) diff --git a/feature/main/src/main/java/com/droidknights/app/feature/main/MainActivity.kt b/feature/main/src/main/java/com/droidknights/app/feature/main/MainActivity.kt index 898361672..70a9fa97f 100644 --- a/feature/main/src/main/java/com/droidknights/app/feature/main/MainActivity.kt +++ b/feature/main/src/main/java/com/droidknights/app/feature/main/MainActivity.kt @@ -12,6 +12,7 @@ import com.droidknights.app.core.designsystem.theme.KnightsTheme import com.droidknights.app.core.router.LaunchedRouter import com.droidknights.app.feature.bookmark.api.RouteBookmark import com.droidknights.app.feature.home.api.RouteHome +import com.droidknights.app.feature.session.api.RouteSessionDetail import com.droidknights.app.feature.setting.api.RouteSetting import com.droidknights.app.widget.DroidKnightsWidget.Companion.KEY_SESSION_ID import com.droidknights.app.widget.sendWidgetUpdateCommand @@ -47,7 +48,7 @@ class MainActivity : ComponentActivity() { LaunchedEffect(sessionId) { sessionId?.let { - viewModel.navigateSessionDetail(it) + viewModel.navigateTo(RouteSessionDetail(it)) } } @@ -56,9 +57,21 @@ class MainActivity : ComponentActivity() { navigator = navigator, onTabSelected = { when (it.route) { - is RouteSetting -> viewModel.navigateSetting() - is RouteBookmark -> viewModel.navigateBookmark() - is RouteHome -> viewModel.navigateHome() + is RouteSetting -> viewModel.navigateTo( + route = RouteSetting, + saveState = true, + launchSingleTop = true + ) + is RouteBookmark -> viewModel.navigateTo( + route = RouteBookmark, + saveState = true, + launchSingleTop = true + ) + is RouteHome -> viewModel.navigateTo( + route = RouteHome, + saveState = true, + launchSingleTop = true + ) } }, ) diff --git a/feature/main/src/main/java/com/droidknights/app/feature/main/MainViewModel.kt b/feature/main/src/main/java/com/droidknights/app/feature/main/MainViewModel.kt index fba836056..aece43aba 100644 --- a/feature/main/src/main/java/com/droidknights/app/feature/main/MainViewModel.kt +++ b/feature/main/src/main/java/com/droidknights/app/feature/main/MainViewModel.kt @@ -1,50 +1,15 @@ package com.droidknights.app.feature.main -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope import com.droidknights.app.core.data.settings.api.SettingsRepository -import com.droidknights.app.core.router.api.Navigator -import com.droidknights.app.feature.bookmark.api.RouteBookmark -import com.droidknights.app.feature.home.api.RouteHome -import com.droidknights.app.feature.session.api.RouteSessionDetail -import com.droidknights.app.feature.setting.api.RouteSetting +import com.droidknights.app.core.ui.BaseViewModel import dagger.hilt.android.lifecycle.HiltViewModel -import kotlinx.coroutines.launch import javax.inject.Inject @HiltViewModel internal class MainViewModel @Inject constructor( - settingsRepository: SettingsRepository, - private val navigator: Navigator, -) : ViewModel() { + settingsRepository: SettingsRepository +) : BaseViewModel() { val isDarkTheme = settingsRepository.flowIsDarkTheme() - fun navigateSessionDetail(sessionId: String) = viewModelScope.launch { - navigator.navigate(RouteSessionDetail(sessionId)) - } - - fun navigateSetting() = viewModelScope.launch { - navigator.navigate( - route = RouteSetting, - saveState = true, - launchSingleTop = true, - ) - } - - fun navigateBookmark() = viewModelScope.launch { - navigator.navigate( - route = RouteBookmark, - saveState = true, - launchSingleTop = true, - ) - } - - fun navigateHome() = viewModelScope.launch { - navigator.navigate( - route = RouteHome, - saveState = true, - launchSingleTop = true, - ) - } } From 0b679d5fb3e74830767ce95fb306bd95525b249b Mon Sep 17 00:00:00 2001 From: sysong Date: Fri, 22 Aug 2025 14:15:23 +0900 Subject: [PATCH 04/17] =?UTF-8?q?(FIX)[#554]=20BaseViewModel=EB=82=B4,=20N?= =?UTF-8?q?avigator=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EA=B0=80=EB=8A=A5?= =?UTF-8?q?=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/droidknights/app/core/ui/BaseViewModel.kt | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/core/ui/src/main/java/com/droidknights/app/core/ui/BaseViewModel.kt b/core/ui/src/main/java/com/droidknights/app/core/ui/BaseViewModel.kt index d03739719..be2cf2b34 100644 --- a/core/ui/src/main/java/com/droidknights/app/core/ui/BaseViewModel.kt +++ b/core/ui/src/main/java/com/droidknights/app/core/ui/BaseViewModel.kt @@ -1,5 +1,6 @@ package com.droidknights.app.core.ui +import androidx.annotation.VisibleForTesting import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.droidknights.app.core.router.api.Navigator @@ -13,11 +14,16 @@ import javax.inject.Inject @HiltViewModel open class BaseViewModel @Inject constructor(): ViewModel() { + protected val _errorFlow = MutableSharedFlow() + val errorFlow = _errorFlow.asSharedFlow() + @Inject lateinit var navigator: Navigator - protected val _errorFlow = MutableSharedFlow() - val errorFlow = _errorFlow.asSharedFlow() + @VisibleForTesting + fun injectNavigator(navigator: Navigator) { + this.navigator = navigator + } fun navigateBack() = viewModelScope.launch { navigator.navigateBack() From 89ff34c4e9cb12525b69417294332bb3c43d07fd Mon Sep 17 00:00:00 2001 From: sysong Date: Fri, 22 Aug 2025 14:15:35 +0900 Subject: [PATCH 05/17] =?UTF-8?q?(TEST)[#554]=20MainViewModelTest=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/feature/main/MainViewModelTest.kt | 25 ++++++++++++++----- 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/feature/main/src/test/java/com/droidknights/app/feature/main/MainViewModelTest.kt b/feature/main/src/test/java/com/droidknights/app/feature/main/MainViewModelTest.kt index 06fe23ae5..8aaa0be28 100644 --- a/feature/main/src/test/java/com/droidknights/app/feature/main/MainViewModelTest.kt +++ b/feature/main/src/test/java/com/droidknights/app/feature/main/MainViewModelTest.kt @@ -35,7 +35,8 @@ class MainViewModelTest { fun setup() { // given every { settingsRepository.flowIsDarkTheme() } returns flowOf(false) - viewModel = MainViewModel(settingsRepository, navigator) + viewModel = MainViewModel(settingsRepository) + viewModel.injectNavigator(navigator) } @Test @@ -52,7 +53,7 @@ class MainViewModelTest { coEvery { navigator.navigate(RouteSessionDetail(fakeSessionId)) } just Runs // when - viewModel.navigateSessionDetail(fakeSessionId) + viewModel.navigateTo(RouteSessionDetail(fakeSessionId)) // then coVerify(exactly = 1) { navigator.navigate(RouteSessionDetail(fakeSessionId)) } @@ -70,7 +71,11 @@ class MainViewModelTest { } just Runs // when - viewModel.navigateSetting() + viewModel.navigateTo( + route = RouteSetting, + saveState = true, + launchSingleTop = true + ) // then coVerify(exactly = 1) { @@ -94,14 +99,18 @@ class MainViewModelTest { } just Runs // when - viewModel.navigateBookmark() + viewModel.navigateTo( + route = RouteBookmark, + saveState = true, + launchSingleTop = true + ) // then coVerify(exactly = 1) { navigator.navigate( route = RouteBookmark, saveState = true, - launchSingleTop = true, + launchSingleTop = true ) } } @@ -118,7 +127,11 @@ class MainViewModelTest { } just Runs // when - viewModel.navigateHome() + viewModel.navigateTo( + route = RouteHome, + saveState = true, + launchSingleTop = true + ) // then coVerify(exactly = 1) { From 457345fa35aab96b82d1e9a1ec6fcc6924830398 Mon Sep 17 00:00:00 2001 From: sysong Date: Fri, 22 Aug 2025 14:24:48 +0900 Subject: [PATCH 06/17] =?UTF-8?q?(REFACTOR)[#554]=20BookmarkViewModel.kt?= =?UTF-8?q?=EC=97=90=20BaseViewModel.kt=20=EC=83=81=EC=86=8D=20=EC=B2=98?= =?UTF-8?q?=EB=A6=AC=20=ED=9B=84=20=EC=BD=94=EB=93=9C=20=EC=82=AD=EC=A0=9C?= =?UTF-8?q?.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/feature/bookmark/BookmarkViewModel.kt | 21 ++++++------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/feature/bookmark/src/main/java/com/droidknights/app/feature/bookmark/BookmarkViewModel.kt b/feature/bookmark/src/main/java/com/droidknights/app/feature/bookmark/BookmarkViewModel.kt index 8c408cd08..d9303d1fa 100644 --- a/feature/bookmark/src/main/java/com/droidknights/app/feature/bookmark/BookmarkViewModel.kt +++ b/feature/bookmark/src/main/java/com/droidknights/app/feature/bookmark/BookmarkViewModel.kt @@ -1,11 +1,10 @@ package com.droidknights.app.feature.bookmark -import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.droidknights.app.core.domain.session.usecase.api.DeleteBookmarkedSessionUseCase import com.droidknights.app.core.domain.session.usecase.api.GetBookmarkedSessionsUseCase import com.droidknights.app.core.model.session.Session -import com.droidknights.app.core.router.api.Navigator +import com.droidknights.app.core.ui.BaseViewModel import com.droidknights.app.feature.bookmark.model.BookmarkItemUiState import com.droidknights.app.feature.bookmark.model.BookmarkUiState import com.droidknights.app.feature.session.api.RouteSession @@ -13,9 +12,7 @@ import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.collections.immutable.persistentSetOf import kotlinx.collections.immutable.toPersistentList import kotlinx.collections.immutable.toPersistentSet -import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.asSharedFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.combine @@ -29,12 +26,8 @@ import javax.inject.Inject @HiltViewModel class BookmarkViewModel @Inject constructor( private val getBookmarkedSessionsUseCase: GetBookmarkedSessionsUseCase, - private val deleteBookmarkedSessionUseCase: DeleteBookmarkedSessionUseCase, - private val navigator: Navigator, -) : ViewModel() { - - private val _errorFlow = MutableSharedFlow() - val errorFlow = _errorFlow.asSharedFlow() + private val deleteBookmarkedSessionUseCase: DeleteBookmarkedSessionUseCase +) : BaseViewModel() { private val _bookmarkUiState = MutableStateFlow(BookmarkUiState.Loading) val bookmarkUiState = _bookmarkUiState.asStateFlow() @@ -132,10 +125,8 @@ class BookmarkViewModel @Inject constructor( if (state !is BookmarkUiState.Success || state.isEditMode) { return } - viewModelScope.launch { - navigator.navigate( - route = RouteSession(sessionId = session.id), - ) - } + navigateTo( + route = RouteSession(sessionId = session.id) + ) } } From 4c04ebe865cbd7523939e501c6fcf4074a63d7e6 Mon Sep 17 00:00:00 2001 From: sysong Date: Fri, 22 Aug 2025 14:25:08 +0900 Subject: [PATCH 07/17] =?UTF-8?q?(TEST)[#554]=20BookmarkViewModelTest.kt?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../feature/bookmark/BookmarkViewModelTest.kt | 32 ++++++++----------- 1 file changed, 14 insertions(+), 18 deletions(-) diff --git a/feature/bookmark/src/test/java/com/droidknights/app/feature/bookmark/BookmarkViewModelTest.kt b/feature/bookmark/src/test/java/com/droidknights/app/feature/bookmark/BookmarkViewModelTest.kt index 43716c00a..b49fe1679 100644 --- a/feature/bookmark/src/test/java/com/droidknights/app/feature/bookmark/BookmarkViewModelTest.kt +++ b/feature/bookmark/src/test/java/com/droidknights/app/feature/bookmark/BookmarkViewModelTest.kt @@ -48,9 +48,8 @@ class BookmarkViewModelTest { // given & when viewModel = BookmarkViewModel( getBookmarkedSessionsUseCase, - deleteBookmarkedSessionUseCase, - navigator - ) + deleteBookmarkedSessionUseCase + ).also { it.injectNavigator(navigator) } // then viewModel.bookmarkUiState.test { @@ -76,9 +75,8 @@ class BookmarkViewModelTest { // given viewModel = BookmarkViewModel( getBookmarkedSessionsUseCase, - deleteBookmarkedSessionUseCase, - navigator - ) + deleteBookmarkedSessionUseCase + ).also { it.injectNavigator(navigator) } viewModel.bookmarkUiState.test { val initialIsEditMode = (awaitItem() as BookmarkUiState.Success).isEditMode @@ -98,9 +96,8 @@ class BookmarkViewModelTest { // given viewModel = BookmarkViewModel( getBookmarkedSessionsUseCase, - deleteBookmarkedSessionUseCase, - navigator - ) + deleteBookmarkedSessionUseCase + ).also { it.injectNavigator(navigator) } // when viewModel.selectSession(mockSession1) @@ -120,9 +117,9 @@ class BookmarkViewModelTest { // given viewModel = BookmarkViewModel( getBookmarkedSessionsUseCase, - deleteBookmarkedSessionUseCase, - navigator - ) + deleteBookmarkedSessionUseCase + ).also { it.injectNavigator(navigator) } + viewModel.selectSession(mockSession1) // when @@ -144,9 +141,9 @@ class BookmarkViewModelTest { coEvery { deleteBookmarkedSessionUseCase(persistentSetOf("1")) } just Runs viewModel = BookmarkViewModel( getBookmarkedSessionsUseCase, - deleteBookmarkedSessionUseCase, - navigator - ) + deleteBookmarkedSessionUseCase + ).also { it.injectNavigator(navigator) } + viewModel.selectSession(mockSession1) // when @@ -167,9 +164,8 @@ class BookmarkViewModelTest { coEvery { navigator.navigate(RouteSession(sessionId = mockSession2.id)) } just Runs viewModel = BookmarkViewModel( getBookmarkedSessionsUseCase, - deleteBookmarkedSessionUseCase, - navigator - ) + deleteBookmarkedSessionUseCase + ).also { it.injectNavigator(navigator) } // when viewModel.redirectToSessionScreen(mockSession2) From 0eb4165abea69050d10bb8f428b91fb197fcc37a Mon Sep 17 00:00:00 2001 From: sysong Date: Fri, 22 Aug 2025 14:31:37 +0900 Subject: [PATCH 08/17] =?UTF-8?q?(REFACTOR)[#554]=20SessionDetailViewModel?= =?UTF-8?q?.kt=EC=97=90=20BaseViewModel.kt=20=EC=83=81=EC=86=8D=20?= =?UTF-8?q?=EC=B2=98=EB=A6=AC=20=ED=9B=84=20=EC=BD=94=EB=93=9C=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../feature/session/detail/SessionDetailViewModel.kt | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/feature/session/src/main/java/com/droidknights/app/feature/session/detail/SessionDetailViewModel.kt b/feature/session/src/main/java/com/droidknights/app/feature/session/detail/SessionDetailViewModel.kt index e9f244fe4..2db9023b2 100644 --- a/feature/session/src/main/java/com/droidknights/app/feature/session/detail/SessionDetailViewModel.kt +++ b/feature/session/src/main/java/com/droidknights/app/feature/session/detail/SessionDetailViewModel.kt @@ -1,11 +1,10 @@ package com.droidknights.app.feature.session.detail -import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.droidknights.app.core.domain.session.usecase.api.BookmarkSessionUseCase import com.droidknights.app.core.domain.session.usecase.api.GetBookmarkedSessionIdsUseCase import com.droidknights.app.core.domain.session.usecase.api.GetSessionUseCase -import com.droidknights.app.core.router.api.Navigator +import com.droidknights.app.core.ui.BaseViewModel import com.droidknights.app.feature.session.detail.model.SessionDetailEffect import com.droidknights.app.feature.session.detail.model.SessionDetailUiState import dagger.hilt.android.lifecycle.HiltViewModel @@ -21,9 +20,8 @@ import javax.inject.Inject class SessionDetailViewModel @Inject constructor( private val getSessionUseCase: GetSessionUseCase, getBookmarkedSessionIdsUseCase: GetBookmarkedSessionIdsUseCase, - private val bookmarkSessionUseCase: BookmarkSessionUseCase, - private val navigator: Navigator, -) : ViewModel() { + private val bookmarkSessionUseCase: BookmarkSessionUseCase +) : BaseViewModel() { private val _sessionUiState = MutableStateFlow(SessionDetailUiState.Loading) @@ -72,8 +70,4 @@ class SessionDetailViewModel @Inject constructor( _sessionUiEffect.value = SessionDetailEffect.Idle } } - - fun navigateBack() = viewModelScope.launch { - navigator.navigateBack() - } } From 0b6b2a81bab76a83b62a3b8cbbc3eefaf27ecc63 Mon Sep 17 00:00:00 2001 From: sysong Date: Fri, 22 Aug 2025 14:32:34 +0900 Subject: [PATCH 09/17] =?UTF-8?q?(TEST)[#554]=20SessionDetailViewModelTest?= =?UTF-8?q?.kt=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../detail/SessionDetailViewModelTest.kt | 21 ++++++++----------- 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/feature/session/src/test/java/com/droidknights/app/feature/session/detail/SessionDetailViewModelTest.kt b/feature/session/src/test/java/com/droidknights/app/feature/session/detail/SessionDetailViewModelTest.kt index 53976e91e..df42dd6a8 100644 --- a/feature/session/src/test/java/com/droidknights/app/feature/session/detail/SessionDetailViewModelTest.kt +++ b/feature/session/src/test/java/com/droidknights/app/feature/session/detail/SessionDetailViewModelTest.kt @@ -60,9 +60,8 @@ class SessionDetailViewModelTest { viewModel = SessionDetailViewModel( getSessionUseCase, getBookmarkedSessionIdsUseCase, - bookmarkSessionUseCase, - navigator, - ) + bookmarkSessionUseCase + ).also { it.injectNavigator(navigator) } // when viewModel.fetchSession(sessionId) @@ -83,9 +82,8 @@ class SessionDetailViewModelTest { viewModel = SessionDetailViewModel( getSessionUseCase, getBookmarkedSessionIdsUseCase, - bookmarkSessionUseCase, - navigator, - ) + bookmarkSessionUseCase + ).also { it.injectNavigator(navigator) } // when viewModel.fetchSession(sessionId) @@ -112,9 +110,9 @@ class SessionDetailViewModelTest { viewModel = SessionDetailViewModel( getSessionUseCase, getBookmarkedSessionIdsUseCase, - bookmarkSessionUseCase, - navigator, - ) + bookmarkSessionUseCase + ).also { it.injectNavigator(navigator) } + viewModel.fetchSession(sessionId) // when @@ -134,9 +132,8 @@ class SessionDetailViewModelTest { viewModel = SessionDetailViewModel( getSessionUseCase, getBookmarkedSessionIdsUseCase, - bookmarkSessionUseCase, - navigator, - ) + bookmarkSessionUseCase + ).also { it.injectNavigator(navigator) } // when viewModel.navigateBack() From deeb8b8157841123fe4d313ab99e4f42593a4777 Mon Sep 17 00:00:00 2001 From: sysong Date: Fri, 22 Aug 2025 14:34:08 +0900 Subject: [PATCH 10/17] =?UTF-8?q?(REFACTOR)[#554]=20SessionListViewModel.k?= =?UTF-8?q?t=EC=97=90=20BaseViewModel.kt=20=EC=83=81=EC=86=8D=20=EC=B2=98?= =?UTF-8?q?=EB=A6=AC=20=ED=9B=84=20=EC=BD=94=EB=93=9C=20=EC=82=AD=EC=A0=9C?= =?UTF-8?q?.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../session/list/SessionListViewModel.kt | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) diff --git a/feature/session/src/main/java/com/droidknights/app/feature/session/list/SessionListViewModel.kt b/feature/session/src/main/java/com/droidknights/app/feature/session/list/SessionListViewModel.kt index 0dafff14f..5d429e5ab 100644 --- a/feature/session/src/main/java/com/droidknights/app/feature/session/list/SessionListViewModel.kt +++ b/feature/session/src/main/java/com/droidknights/app/feature/session/list/SessionListViewModel.kt @@ -1,17 +1,14 @@ package com.droidknights.app.feature.session.list -import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.droidknights.app.core.domain.session.usecase.api.GetBookmarkedSessionIdsUseCase import com.droidknights.app.core.domain.session.usecase.api.GetSessionsUseCase -import com.droidknights.app.core.router.api.Navigator +import com.droidknights.app.core.ui.BaseViewModel import com.droidknights.app.feature.session.api.RouteSessionDetail import com.droidknights.app.feature.session.list.model.SessionUiState import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.collections.immutable.toPersistentList -import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.asSharedFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.combine @@ -23,12 +20,8 @@ import javax.inject.Inject @HiltViewModel class SessionListViewModel @Inject constructor( getSessionsUseCase: GetSessionsUseCase, - getBookmarkedSessionIdsUseCase: GetBookmarkedSessionIdsUseCase, - private val navigator: Navigator, -) : ViewModel() { - - private val _errorFlow = MutableSharedFlow() - val errorFlow = _errorFlow.asSharedFlow() + getBookmarkedSessionIdsUseCase: GetBookmarkedSessionIdsUseCase +) : BaseViewModel() { private val _uiState = MutableStateFlow(SessionUiState.Loading) val uiState = _uiState.asStateFlow() @@ -58,8 +51,4 @@ class SessionListViewModel @Inject constructor( fun navigateSessionDetail(sessionId: String) = viewModelScope.launch { navigator.navigate(RouteSessionDetail(sessionId)) } - - fun navigateBack() = viewModelScope.launch { - navigator.navigateBack() - } } From 89b944d048386d71d4ac9d6bf7751865e7383b8d Mon Sep 17 00:00:00 2001 From: sysong Date: Fri, 22 Aug 2025 14:34:40 +0900 Subject: [PATCH 11/17] =?UTF-8?q?(TEST)[#554]=20SessionListViewModelTest.k?= =?UTF-8?q?t=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/feature/session/list/SessionListViewModelTest.kt | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/feature/session/src/test/java/com/droidknights/app/feature/session/list/SessionListViewModelTest.kt b/feature/session/src/test/java/com/droidknights/app/feature/session/list/SessionListViewModelTest.kt index 636845bd7..6831e3edb 100644 --- a/feature/session/src/test/java/com/droidknights/app/feature/session/list/SessionListViewModelTest.kt +++ b/feature/session/src/test/java/com/droidknights/app/feature/session/list/SessionListViewModelTest.kt @@ -53,9 +53,8 @@ internal class SessionListViewModelTest { // given viewModel = SessionListViewModel( getSessionsUseCase, - getBookmarkedSessionIdsUseCase, - navigator, - ) + getBookmarkedSessionIdsUseCase + ).also { it.injectNavigator(navigator) } } @Test From 75db57b9c059cd2d5dc2500e948506063e0f1be7 Mon Sep 17 00:00:00 2001 From: sysong Date: Fri, 22 Aug 2025 14:37:37 +0900 Subject: [PATCH 12/17] =?UTF-8?q?(REFACTOR)[#554]=20HomeViewModel.kt?= =?UTF-8?q?=EC=97=90=20BaseViewModel.kt=20=EC=83=81=EC=86=8D=20=EC=B2=98?= =?UTF-8?q?=EB=A6=AC=20=ED=9B=84=20=EC=BD=94=EB=93=9C=20=EC=82=AD=EC=A0=9C?= =?UTF-8?q?.=20=EA=B7=B8=EC=97=90=EB=94=B0=EB=A5=B8=20HomeScreen.kt?= =?UTF-8?q?=EC=9D=98=20=ED=99=94=EB=A9=B4=20=EC=9D=B4=EB=8F=99=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/feature/home/HomeScreen.kt | 8 ++++-- .../app/feature/home/HomeViewModel.kt | 28 ++----------------- 2 files changed, 8 insertions(+), 28 deletions(-) diff --git a/feature/home/src/main/java/com/droidknights/app/feature/home/HomeScreen.kt b/feature/home/src/main/java/com/droidknights/app/feature/home/HomeScreen.kt index 09565ef51..efa708cfc 100644 --- a/feature/home/src/main/java/com/droidknights/app/feature/home/HomeScreen.kt +++ b/feature/home/src/main/java/com/droidknights/app/feature/home/HomeScreen.kt @@ -15,10 +15,12 @@ import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.droidknights.app.feature.contributor.api.RouteContributor import com.droidknights.app.feature.home.component.ContributorCard import com.droidknights.app.feature.home.component.SessionCard import com.droidknights.app.feature.home.component.SponsorCard import com.droidknights.app.feature.home.model.SponsorsUiState +import com.droidknights.app.feature.session.api.RouteSession import kotlinx.coroutines.flow.collectLatest @Composable @@ -35,9 +37,9 @@ internal fun HomeRoute( HomeScreen( padding = padding, sponsorsUiState = sponsorsUiState, - onSessionClick = viewModel::navigateSession, - onContributorClick = viewModel::navigateContributor, - onOrganizationSponsorClick = viewModel::navigateOrganizationSponsor, + onSessionClick = { viewModel.navigateTo(RouteSession()) }, + onContributorClick = { viewModel.navigateTo(RouteContributor) }, + onOrganizationSponsorClick = viewModel::navigateWeb, ) } diff --git a/feature/home/src/main/java/com/droidknights/app/feature/home/HomeViewModel.kt b/feature/home/src/main/java/com/droidknights/app/feature/home/HomeViewModel.kt index c049b7ece..11af60e4b 100644 --- a/feature/home/src/main/java/com/droidknights/app/feature/home/HomeViewModel.kt +++ b/feature/home/src/main/java/com/droidknights/app/feature/home/HomeViewModel.kt @@ -1,33 +1,23 @@ package com.droidknights.app.feature.home -import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.droidknights.app.core.domain.sponsor.usecase.api.GetSponsorsUseCase -import com.droidknights.app.core.router.api.Navigator -import com.droidknights.app.feature.contributor.api.RouteContributor +import com.droidknights.app.core.ui.BaseViewModel import com.droidknights.app.feature.home.model.SponsorsUiState -import com.droidknights.app.feature.session.api.RouteSession import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.collections.immutable.toPersistentList -import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow -import kotlinx.coroutines.flow.asSharedFlow import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.stateIn -import kotlinx.coroutines.launch import javax.inject.Inject @HiltViewModel class HomeViewModel @Inject constructor( - getSponsorsUseCase: GetSponsorsUseCase, - private val navigator: Navigator, -) : ViewModel() { - - private val _errorFlow = MutableSharedFlow() - val errorFlow get() = _errorFlow.asSharedFlow() + getSponsorsUseCase: GetSponsorsUseCase +) : BaseViewModel() { val sponsorsUiState: StateFlow = flow { emit(getSponsorsUseCase()) } @@ -46,16 +36,4 @@ class HomeViewModel @Inject constructor( started = SharingStarted.WhileSubscribed(5_000), initialValue = SponsorsUiState.Loading, ) - - fun navigateSession() = viewModelScope.launch { - navigator.navigate(RouteSession()) - } - - fun navigateContributor() = viewModelScope.launch { - navigator.navigate(RouteContributor) - } - - fun navigateOrganizationSponsor(url: String) = viewModelScope.launch { - navigator.navigateWeb(url) - } } From 1c66255fbf9e85cc1dedc277846c93b286218d7b Mon Sep 17 00:00:00 2001 From: sysong Date: Fri, 22 Aug 2025 14:39:07 +0900 Subject: [PATCH 13/17] =?UTF-8?q?(TEST)[#554]=20HomeViewModelTest.kt=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/feature/home/HomeViewModelTest.kt | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/feature/home/src/test/java/com/droidknights/app/feature/home/HomeViewModelTest.kt b/feature/home/src/test/java/com/droidknights/app/feature/home/HomeViewModelTest.kt index 78c2afcf2..7d8009742 100644 --- a/feature/home/src/test/java/com/droidknights/app/feature/home/HomeViewModelTest.kt +++ b/feature/home/src/test/java/com/droidknights/app/feature/home/HomeViewModelTest.kt @@ -30,7 +30,9 @@ internal class HomeViewModelTest { fun `후원사 리스트가 비어있다면 후원사 데이터를 확인할 수 없다`() = runTest { // given coEvery { getSponsorsUseCase() } returns emptyList() - viewModel = HomeViewModel(getSponsorsUseCase, navigator) + viewModel = HomeViewModel(getSponsorsUseCase).also { + it.injectNavigator(navigator) + } // when & then viewModel.sponsorsUiState.test { @@ -43,7 +45,9 @@ internal class HomeViewModelTest { fun `후원사 리스트가 존재한다면 후원사 데이터를 확인할 수 있다`() = runTest { // given coEvery { getSponsorsUseCase() } returns fakeSponsors - viewModel = HomeViewModel(getSponsorsUseCase, navigator) + viewModel = HomeViewModel(getSponsorsUseCase).also { + it.injectNavigator(navigator) + } // when & then viewModel.sponsorsUiState.test { @@ -56,10 +60,12 @@ internal class HomeViewModelTest { fun `navigate(RouteSession)가 호출될 때 navigator에게 위임한다`() = runTest { // given coEvery { navigator.navigate(RouteSession()) } just Runs - viewModel = HomeViewModel(getSponsorsUseCase, navigator) + viewModel = HomeViewModel(getSponsorsUseCase).also { + it.injectNavigator(navigator) + } // when - viewModel.navigateSession() + viewModel.navigateTo(RouteSession()) // then coVerify(exactly = 1) { navigator.navigate(RouteSession()) } @@ -69,10 +75,12 @@ internal class HomeViewModelTest { fun `navigate(RouteContributor)가 호출될 때 navigator에게 위임한다`() = runTest { // given coEvery { navigator.navigate(RouteContributor) } just Runs - viewModel = HomeViewModel(getSponsorsUseCase, navigator) + viewModel = HomeViewModel(getSponsorsUseCase).also { + it.injectNavigator(navigator) + } // when - viewModel.navigateContributor() + viewModel.navigateTo(RouteContributor) // then coVerify(exactly = 1) { navigator.navigate(RouteContributor) } From 08cb42b3f04844e50b5d2c7113aa5d190a161673 Mon Sep 17 00:00:00 2001 From: sysong Date: Fri, 22 Aug 2025 14:40:50 +0900 Subject: [PATCH 14/17] =?UTF-8?q?(REFACTOR)[#554]=20ContributorViewModel.k?= =?UTF-8?q?t=EC=97=90=20BaseViewModel.kt=20=EC=83=81=EC=86=8D=20=EC=B2=98?= =?UTF-8?q?=EB=A6=AC=20=ED=9B=84=20=EC=BD=94=EB=93=9C=20=EC=82=AD=EC=A0=9C?= =?UTF-8?q?.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../feature/contributor/ContributorViewModel.kt | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/feature/contributor/src/main/java/com/droidknights/app/feature/contributor/ContributorViewModel.kt b/feature/contributor/src/main/java/com/droidknights/app/feature/contributor/ContributorViewModel.kt index b909a9849..d8a3dc887 100644 --- a/feature/contributor/src/main/java/com/droidknights/app/feature/contributor/ContributorViewModel.kt +++ b/feature/contributor/src/main/java/com/droidknights/app/feature/contributor/ContributorViewModel.kt @@ -1,9 +1,8 @@ package com.droidknights.app.feature.contributor -import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.droidknights.app.core.domain.contributor.usecase.api.GetContributorsUseCase -import com.droidknights.app.core.router.api.Navigator +import com.droidknights.app.core.ui.BaseViewModel import com.droidknights.app.feature.contributor.model.ContributorsUiState import com.droidknights.app.feature.contributor.model.convert.toContributorsUiState import dagger.hilt.android.lifecycle.HiltViewModel @@ -19,12 +18,8 @@ import javax.inject.Inject @HiltViewModel class ContributorViewModel @Inject constructor( - getContributorsUseCase: GetContributorsUseCase, - private val navigator: Navigator, -) : ViewModel() { - - private val _errorFlow = MutableSharedFlow() - val errorFlow = _errorFlow.asSharedFlow() + getContributorsUseCase: GetContributorsUseCase +) : BaseViewModel() { val uiState: StateFlow by lazy { getContributorsUseCase() @@ -40,8 +35,4 @@ class ContributorViewModel @Inject constructor( initialValue = ContributorsUiState.Loading ) } - - fun navigateBack() = viewModelScope.launch { - navigator.navigateBack() - } } From 980f8fa7343ab88d876b3197805f618ffa49690c Mon Sep 17 00:00:00 2001 From: sysong Date: Fri, 22 Aug 2025 14:41:04 +0900 Subject: [PATCH 15/17] =?UTF-8?q?(TEST)[#554]=20ContributorViewModelTest.k?= =?UTF-8?q?t=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/feature/contributor/ContributorViewModelTest.kt | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/feature/contributor/src/test/java/com/droidknights/app/feature/contributor/ContributorViewModelTest.kt b/feature/contributor/src/test/java/com/droidknights/app/feature/contributor/ContributorViewModelTest.kt index 57da87843..3eb48f623 100644 --- a/feature/contributor/src/test/java/com/droidknights/app/feature/contributor/ContributorViewModelTest.kt +++ b/feature/contributor/src/test/java/com/droidknights/app/feature/contributor/ContributorViewModelTest.kt @@ -31,7 +31,9 @@ internal class ContributorViewModelTest { fun `컨트리뷰터 데이터를 확인할 수 있다`() = runTest { // given coEvery { getContributorsUseCase() } returns flowOf(fakeContributors) - viewModel = ContributorViewModel(getContributorsUseCase, navigator) + viewModel = ContributorViewModel(getContributorsUseCase).also { + it.injectNavigator(navigator) + } // when & then viewModel.uiState.test { @@ -44,7 +46,9 @@ internal class ContributorViewModelTest { fun `navigateBack이 호출될 때 navigator에게 위임한다`() = runTest { // suspend 함수 호출에 대한 stub coEvery { navigator.navigateBack() } just Runs - viewModel = ContributorViewModel(getContributorsUseCase, navigator) + viewModel = ContributorViewModel(getContributorsUseCase).also { + it.injectNavigator(navigator) + } // when viewModel.navigateBack() From 4f0277bbb2c031e164059a7a7bb06655ce39bb49 Mon Sep 17 00:00:00 2001 From: sysong Date: Fri, 22 Aug 2025 16:44:31 +0900 Subject: [PATCH 16/17] =?UTF-8?q?(STYLE)[#554]=20detekt=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../droidknights/app/core/ui/BaseViewModel.kt | 61 ++++++++++--------- 1 file changed, 32 insertions(+), 29 deletions(-) diff --git a/core/ui/src/main/java/com/droidknights/app/core/ui/BaseViewModel.kt b/core/ui/src/main/java/com/droidknights/app/core/ui/BaseViewModel.kt index be2cf2b34..e1ae257d4 100644 --- a/core/ui/src/main/java/com/droidknights/app/core/ui/BaseViewModel.kt +++ b/core/ui/src/main/java/com/droidknights/app/core/ui/BaseViewModel.kt @@ -12,32 +12,35 @@ import kotlinx.coroutines.launch import javax.inject.Inject @HiltViewModel -open class BaseViewModel @Inject constructor(): ViewModel() { - - protected val _errorFlow = MutableSharedFlow() - val errorFlow = _errorFlow.asSharedFlow() - - @Inject - lateinit var navigator: Navigator - - @VisibleForTesting - fun injectNavigator(navigator: Navigator) { - this.navigator = navigator - } - - fun navigateBack() = viewModelScope.launch { - navigator.navigateBack() - } - - fun navigateWeb(url: String) = viewModelScope.launch { - navigator.navigateWeb(url) - } - - fun navigateTo( - route: Route, - saveState: Boolean = false, - launchSingleTop: Boolean = false - ) = viewModelScope.launch { - navigator.navigate(route, saveState, launchSingleTop) - } -} \ No newline at end of file +open class BaseViewModel + @Inject + constructor() : ViewModel() { + protected val _errorFlow = MutableSharedFlow() + val errorFlow = _errorFlow.asSharedFlow() + + @Inject + lateinit var navigator: Navigator + + @VisibleForTesting + fun injectNavigator(navigator: Navigator) { + this.navigator = navigator + } + + fun navigateBack() = + viewModelScope.launch { + navigator.navigateBack() + } + + fun navigateWeb(url: String) = + viewModelScope.launch { + navigator.navigateWeb(url) + } + + fun navigateTo( + route: Route, + saveState: Boolean = false, + launchSingleTop: Boolean = false, + ) = viewModelScope.launch { + navigator.navigate(route, saveState, launchSingleTop) + } + } From 533abc78c60f86de0db4046599b0d6e62951e70d Mon Sep 17 00:00:00 2001 From: sysong Date: Fri, 22 Aug 2025 16:59:40 +0900 Subject: [PATCH 17/17] =?UTF-8?q?(STYLE)[#554]=20detekt=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9=EC=9D=84=20=EC=9C=84=ED=95=9C=20=EB=B0=B1=ED=82=B9=20?= =?UTF-8?q?=ED=94=84=EB=A1=9C=ED=8D=BC=ED=8B=B0=20=EB=84=A4=EC=9D=B4?= =?UTF-8?q?=EB=B0=8D=20=EB=B3=80=EA=B2=BD(=5FerrorFlow=20->=20internalFlow?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../droidknights/app/core/ui/BaseViewModel.kt | 46 +++++++++---------- .../app/feature/bookmark/BookmarkViewModel.kt | 4 +- .../contributor/ContributorViewModel.kt | 5 +- .../app/feature/home/HomeViewModel.kt | 2 +- .../app/feature/main/MainViewModel.kt | 1 - .../session/list/SessionListViewModel.kt | 2 +- 6 files changed, 26 insertions(+), 34 deletions(-) diff --git a/core/ui/src/main/java/com/droidknights/app/core/ui/BaseViewModel.kt b/core/ui/src/main/java/com/droidknights/app/core/ui/BaseViewModel.kt index e1ae257d4..a224ecea0 100644 --- a/core/ui/src/main/java/com/droidknights/app/core/ui/BaseViewModel.kt +++ b/core/ui/src/main/java/com/droidknights/app/core/ui/BaseViewModel.kt @@ -12,35 +12,31 @@ import kotlinx.coroutines.launch import javax.inject.Inject @HiltViewModel -open class BaseViewModel - @Inject - constructor() : ViewModel() { - protected val _errorFlow = MutableSharedFlow() - val errorFlow = _errorFlow.asSharedFlow() +open class BaseViewModel @Inject constructor() : ViewModel() { + protected val internalErrorFlow = MutableSharedFlow() + val errorFlow = internalErrorFlow.asSharedFlow() - @Inject - lateinit var navigator: Navigator + @Inject + lateinit var navigator: Navigator - @VisibleForTesting - fun injectNavigator(navigator: Navigator) { - this.navigator = navigator - } + @VisibleForTesting + fun injectNavigator(navigator: Navigator) { + this.navigator = navigator + } - fun navigateBack() = - viewModelScope.launch { - navigator.navigateBack() - } + fun navigateBack() = viewModelScope.launch { + navigator.navigateBack() + } - fun navigateWeb(url: String) = - viewModelScope.launch { - navigator.navigateWeb(url) - } + fun navigateWeb(url: String) = viewModelScope.launch { + navigator.navigateWeb(url) + } - fun navigateTo( - route: Route, - saveState: Boolean = false, - launchSingleTop: Boolean = false, - ) = viewModelScope.launch { + fun navigateTo( + route: Route, + saveState: Boolean = false, + launchSingleTop: Boolean = false + ) = viewModelScope.launch { navigator.navigate(route, saveState, launchSingleTop) - } } +} diff --git a/feature/bookmark/src/main/java/com/droidknights/app/feature/bookmark/BookmarkViewModel.kt b/feature/bookmark/src/main/java/com/droidknights/app/feature/bookmark/BookmarkViewModel.kt index d9303d1fa..b14d65a0a 100644 --- a/feature/bookmark/src/main/java/com/droidknights/app/feature/bookmark/BookmarkViewModel.kt +++ b/feature/bookmark/src/main/java/com/droidknights/app/feature/bookmark/BookmarkViewModel.kt @@ -67,7 +67,7 @@ class BookmarkViewModel @Inject constructor( } } }.catch { throwable -> - _errorFlow.emit(throwable) + internalErrorFlow.emit(throwable) }.collect { _bookmarkUiState.value = it } } } @@ -116,7 +116,7 @@ class BookmarkViewModel @Inject constructor( state.copy(selectedSessionIds = persistentSetOf()) } }.catch { throwable -> - _errorFlow.emit(throwable) + internalErrorFlow.emit(throwable) }.launchIn(viewModelScope) } diff --git a/feature/contributor/src/main/java/com/droidknights/app/feature/contributor/ContributorViewModel.kt b/feature/contributor/src/main/java/com/droidknights/app/feature/contributor/ContributorViewModel.kt index d8a3dc887..e61bb41d7 100644 --- a/feature/contributor/src/main/java/com/droidknights/app/feature/contributor/ContributorViewModel.kt +++ b/feature/contributor/src/main/java/com/droidknights/app/feature/contributor/ContributorViewModel.kt @@ -6,14 +6,11 @@ import com.droidknights.app.core.ui.BaseViewModel import com.droidknights.app.feature.contributor.model.ContributorsUiState import com.droidknights.app.feature.contributor.model.convert.toContributorsUiState import dagger.hilt.android.lifecycle.HiltViewModel -import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow -import kotlinx.coroutines.flow.asSharedFlow import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.stateIn -import kotlinx.coroutines.launch import javax.inject.Inject @HiltViewModel @@ -27,7 +24,7 @@ class ContributorViewModel @Inject constructor( it.toContributorsUiState() } .catch { throwable -> - _errorFlow.emit(throwable) + internalErrorFlow.emit(throwable) } .stateIn( scope = viewModelScope, diff --git a/feature/home/src/main/java/com/droidknights/app/feature/home/HomeViewModel.kt b/feature/home/src/main/java/com/droidknights/app/feature/home/HomeViewModel.kt index 11af60e4b..49a0528e6 100644 --- a/feature/home/src/main/java/com/droidknights/app/feature/home/HomeViewModel.kt +++ b/feature/home/src/main/java/com/droidknights/app/feature/home/HomeViewModel.kt @@ -29,7 +29,7 @@ class HomeViewModel @Inject constructor( } } .catch { throwable -> - _errorFlow.emit(throwable) + internalErrorFlow.emit(throwable) } .stateIn( scope = viewModelScope, diff --git a/feature/main/src/main/java/com/droidknights/app/feature/main/MainViewModel.kt b/feature/main/src/main/java/com/droidknights/app/feature/main/MainViewModel.kt index aece43aba..4ea6c9cb8 100644 --- a/feature/main/src/main/java/com/droidknights/app/feature/main/MainViewModel.kt +++ b/feature/main/src/main/java/com/droidknights/app/feature/main/MainViewModel.kt @@ -11,5 +11,4 @@ internal class MainViewModel @Inject constructor( ) : BaseViewModel() { val isDarkTheme = settingsRepository.flowIsDarkTheme() - } diff --git a/feature/session/src/main/java/com/droidknights/app/feature/session/list/SessionListViewModel.kt b/feature/session/src/main/java/com/droidknights/app/feature/session/list/SessionListViewModel.kt index 5d429e5ab..b7d20829a 100644 --- a/feature/session/src/main/java/com/droidknights/app/feature/session/list/SessionListViewModel.kt +++ b/feature/session/src/main/java/com/droidknights/app/feature/session/list/SessionListViewModel.kt @@ -40,7 +40,7 @@ class SessionListViewModel @Inject constructor( ) } .catch { throwable -> - _errorFlow.emit(throwable) + internalErrorFlow.emit(throwable) } .onEach { combinedUiState -> _uiState.value = combinedUiState