Skip to content

Commit b355494

Browse files
authored
Merge pull request #536 from taehwandev/2025/compose-multiplatform
(FEAT)[#535] 라우팅 추가
2 parents 7505698 + 62ef33b commit b355494

34 files changed

Lines changed: 297 additions & 59 deletions

File tree

composeApp/build.gradle.kts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@ kotlin {
4646
}
4747
commonMain.dependencies {
4848
implementation(projects.core.designsystem)
49+
implementation(projects.core.router.router)
50+
implementation(projects.core.router.routerApi)
4951

5052
implementation(projects.core.data.dataSession)
5153
implementation(projects.core.data.dataSetting)
@@ -63,9 +65,11 @@ kotlin {
6365
implementation(projects.core.domain.domainSession)
6466
implementation(projects.core.domain.domainContributor)
6567

68+
implementation(projects.feature.home)
6669
implementation(projects.feature.main)
6770
implementation(projects.feature.contributor)
6871
implementation(projects.feature.session)
72+
implementation(projects.feature.sessionApi)
6973
implementation(projects.feature.setting)
7074
implementation(projects.feature.license)
7175
implementation(projects.feature.bookmark)

composeApp/src/commonMain/kotlin/com/droidknights/app/App.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,10 @@ import com.droidknights.app.core.designsystem.theme.KnightsTheme
1515
import com.droidknights.app.core.domain.contributor.di.coreDomainContributorModule
1616
import com.droidknights.app.core.domain.session.di.coreDomainSessionModule
1717
import com.droidknights.app.core.network.di.coreNetworkModule
18+
import com.droidknights.app.core.router.di.coreRouterModule
1819
import com.droidknights.app.feature.bookmark.di.featureBookmarkModule
1920
import com.droidknights.app.feature.contributor.di.featureContributorModule
21+
import com.droidknights.app.feature.home.di.featureHomeModule
2022
import com.droidknights.app.feature.main.MainScreen
2123
import com.droidknights.app.feature.session.di.featureSessionModule
2224
import com.droidknights.app.feature.setting.di.featureSettingModule
@@ -55,6 +57,7 @@ internal val appModule = module {
5557
coreDataSettingModule,
5658
coreDataSessionModule,
5759
coreDataContributorModule,
60+
coreRouterModule,
5861
)
5962

6063
// :core:datastore
@@ -74,6 +77,7 @@ internal val appModule = module {
7477
)
7578
// :feature
7679
includes(
80+
featureHomeModule,
7781
featureSessionModule,
7882
featureSettingModule,
7983
featureContributorModule,

core/navigation/src/commonMain/kotlin/com/droidknights/app/core/navigation/RouteModel.kt

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,6 @@ sealed interface Route {
66
@Serializable
77
data object Contributor : Route
88

9-
@Serializable
10-
data object Session : Route
11-
12-
@Serializable
13-
data class SessionDetail(val sessionId: String) : Route
14-
159
@Serializable
1610
data object License : Route
1711

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
plugins {
2+
alias(libs.plugins.androidLibrary)
3+
id("droidknights.kotlin.multiplatform")
4+
alias(libs.plugins.kotlinxSerialization)
5+
}
6+
7+
kotlin {
8+
sourceSets {
9+
commonMain.dependencies {
10+
implementation(libs.kotlinx.serialization.json)
11+
}
12+
}
13+
}
14+
15+
android.namespace = "com.droidknights.app.core.router.api"
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.droidknights.app.core.router.api
2+
3+
import com.droidknights.app.core.router.api.model.Route
4+
5+
interface Navigator {
6+
7+
suspend fun navigate(route: Route)
8+
9+
suspend fun navigateBack()
10+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
package com.droidknights.app.core.router.api.model
2+
3+
interface Route
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
plugins {
2+
id("droidknights.feature")
3+
}
4+
5+
kotlin {
6+
sourceSets {
7+
commonMain.dependencies {
8+
implementation(libs.kotlinx.serialization.json)
9+
10+
implementation(projects.core.router.routerApi)
11+
}
12+
}
13+
}
14+
15+
android.namespace = "com.droidknights.app.core.router"
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package com.droidknights.app.core.router
2+
3+
import androidx.compose.runtime.Composable
4+
import androidx.compose.runtime.LaunchedEffect
5+
import androidx.lifecycle.Lifecycle
6+
import androidx.lifecycle.compose.LocalLifecycleOwner
7+
import androidx.lifecycle.repeatOnLifecycle
8+
import androidx.navigation.NavHostController
9+
import com.droidknights.app.core.router.internal.viewmodel.RouteSideEffect
10+
import com.droidknights.app.core.router.internal.viewmodel.RouterViewModel
11+
import kotlinx.coroutines.flow.collectLatest
12+
import org.koin.compose.viewmodel.koinViewModel
13+
14+
@Composable
15+
fun LaunchedRouter(
16+
navHostController: NavHostController,
17+
) {
18+
InternalLaunchedRouter(
19+
navHostController = navHostController,
20+
)
21+
}
22+
23+
@Composable
24+
private fun InternalLaunchedRouter(
25+
navHostController: NavHostController,
26+
routerViewModel: RouterViewModel = koinViewModel(),
27+
) {
28+
val lifecycleOwner = LocalLifecycleOwner.current
29+
LaunchedEffect(routerViewModel, lifecycleOwner) {
30+
lifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) {
31+
routerViewModel.sideEffect.collectLatest { sideEffect ->
32+
when (sideEffect) {
33+
is RouteSideEffect.NavigateBack -> {
34+
navHostController.popBackStack()
35+
}
36+
37+
is RouteSideEffect.Navigate -> {
38+
navHostController.navigate(sideEffect.route)
39+
}
40+
}
41+
}
42+
}
43+
}
44+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package com.droidknights.app.core.router.di
2+
3+
import com.droidknights.app.core.router.api.Navigator
4+
import com.droidknights.app.core.router.internal.navigator.InternalNavigator
5+
import com.droidknights.app.core.router.internal.navigator.NavigatorImpl
6+
import com.droidknights.app.core.router.internal.viewmodel.RouterViewModel
7+
import org.koin.core.module.dsl.viewModelOf
8+
import org.koin.dsl.binds
9+
import org.koin.dsl.module
10+
11+
val coreRouterModule = module {
12+
viewModelOf(::RouterViewModel)
13+
single { NavigatorImpl() } binds arrayOf(InternalNavigator::class, Navigator::class)
14+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.droidknights.app.core.router.internal.navigator
2+
3+
import kotlinx.coroutines.channels.Channel
4+
5+
internal interface InternalNavigator {
6+
7+
val channel: Channel<InternalRoute>
8+
}

0 commit comments

Comments
 (0)