Skip to content

Commit 6537ebe

Browse files
committed
[BOOK-124] feat: DelegateNavigator 복원
1 parent 6bdd62b commit 6537ebe

File tree

2 files changed

+76
-3
lines changed

2 files changed

+76
-3
lines changed

feature/main/src/main/kotlin/com/ninecraft/booket/feature/main/screens/BottomNavigationPresenter.kt

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,32 @@
11
package com.ninecraft.booket.feature.main.screens
22

33
import androidx.compose.runtime.Composable
4+
import androidx.compose.runtime.remember
45
import com.ninecraft.booket.feature.main.component.MainTab
56
import com.ninecraft.booket.screens.BottomNavigationScreen
67
import com.ninecraft.booket.screens.HomeScreen
78
import com.slack.circuit.backstack.SaveableBackStack
89
import com.slack.circuit.backstack.rememberSaveableBackStack
910
import com.slack.circuit.codegen.annotations.CircuitInject
1011
import com.slack.circuit.foundation.rememberCircuitNavigator
12+
import com.slack.circuit.runtime.Navigator
1113
import com.slack.circuit.runtime.presenter.Presenter
14+
import dagger.assisted.Assisted
1215
import dagger.assisted.AssistedFactory
1316
import dagger.assisted.AssistedInject
1417
import dagger.hilt.android.components.ActivityRetainedComponent
1518

16-
class BottomNavigationPresenter @AssistedInject constructor() : Presenter<BottomNavigationUiState> {
19+
class BottomNavigationPresenter @AssistedInject constructor(
20+
@Assisted private val rootNavigator: Navigator,
21+
) : Presenter<BottomNavigationUiState> {
1722

1823
@Composable
1924
override fun present(): BottomNavigationUiState {
2025
val childBackStack = rememberSaveableBackStack(root = HomeScreen)
2126
val childNavigator = rememberCircuitNavigator(childBackStack)
27+
val delegateNavigator = remember(childNavigator, rootNavigator) {
28+
DelegateNavigator(childNavigator, rootNavigator)
29+
}
2230

2331
val currentTab = getCurrentTab(childBackStack)
2432

@@ -36,7 +44,7 @@ class BottomNavigationPresenter @AssistedInject constructor() : Presenter<Bottom
3644

3745
return BottomNavigationUiState(
3846
childBackStack = childBackStack,
39-
childNavigator = childNavigator,
47+
childNavigator = delegateNavigator,
4048
currentTab = currentTab,
4149
eventSink = ::handleEvent,
4250
)
@@ -45,7 +53,7 @@ class BottomNavigationPresenter @AssistedInject constructor() : Presenter<Bottom
4553
@CircuitInject(BottomNavigationScreen::class, ActivityRetainedComponent::class)
4654
@AssistedFactory
4755
fun interface Factory {
48-
fun create(): BottomNavigationPresenter
56+
fun create(rootNavigator: Navigator): BottomNavigationPresenter
4957
}
5058
}
5159

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package com.ninecraft.booket.feature.main.screens
2+
3+
import com.ninecraft.booket.feature.main.component.MainTab
4+
import com.slack.circuit.runtime.Navigator
5+
import com.slack.circuit.runtime.screen.PopResult
6+
import com.slack.circuit.runtime.screen.Screen
7+
import kotlinx.collections.immutable.ImmutableList
8+
9+
class DelegateNavigator(
10+
private val childNavigator: Navigator,
11+
private val rootNavigator: Navigator,
12+
) : Navigator {
13+
14+
private val bottomNavigationScreenClasses = MainTab.entries.map { it.screen::class }.toSet()
15+
16+
private fun Screen.isBottomNavigationScreen(): Boolean =
17+
this::class in bottomNavigationScreenClasses
18+
19+
override fun goTo(screen: Screen): Boolean {
20+
return if (screen.isBottomNavigationScreen()) {
21+
childNavigator.goTo(screen)
22+
} else {
23+
rootNavigator.goTo(screen)
24+
}
25+
}
26+
27+
override fun pop(result: PopResult?): Screen? {
28+
val currentScreen = childNavigator.peek()
29+
return if (currentScreen?.isBottomNavigationScreen() == true) {
30+
childNavigator.pop(result)
31+
} else {
32+
rootNavigator.pop(result)
33+
}
34+
}
35+
36+
override fun peek(): Screen? {
37+
val childScreen = childNavigator.peek()
38+
return if (childScreen?.isBottomNavigationScreen() == true) {
39+
childScreen
40+
} else {
41+
rootNavigator.peek()
42+
}
43+
}
44+
45+
override fun resetRoot(
46+
newRoot: Screen,
47+
saveState: Boolean,
48+
restoreState: Boolean,
49+
): ImmutableList<Screen> {
50+
return if (newRoot.isBottomNavigationScreen()) {
51+
childNavigator.resetRoot(newRoot, saveState, restoreState)
52+
} else {
53+
rootNavigator.resetRoot(newRoot, saveState, restoreState)
54+
}
55+
}
56+
57+
override fun peekBackStack(): ImmutableList<Screen> {
58+
val childScreen = childNavigator.peek()
59+
return if (childScreen?.isBottomNavigationScreen() == true) {
60+
childNavigator.peekBackStack()
61+
} else {
62+
rootNavigator.peekBackStack()
63+
}
64+
}
65+
}

0 commit comments

Comments
 (0)