Skip to content

Commit a5ef3b6

Browse files
authored
🔨 Migrate navigation to event-driven architecture (#3238)
1 parent d564047 commit a5ef3b6

28 files changed

+180
-154
lines changed

app/src/commonMain/kotlin/com/crosspaste/paste/PasteMenuService.kt

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,10 @@
11
package com.crosspaste.paste
22

3-
import androidx.navigation.NavController
4-
53
interface PasteMenuService {
64

75
fun copyPasteData(pasteData: PasteData)
86

97
fun openPasteData(
10-
navController: NavController,
118
pasteData: PasteData,
129
index: Int = 0,
1310
)

app/src/commonMain/kotlin/com/crosspaste/ui/LocalComposition.kt

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,8 @@ package com.crosspaste.ui
22

33
import androidx.compose.runtime.staticCompositionLocalOf
44
import androidx.navigation.NavHostController
5-
import com.crosspaste.app.ExitMode
65

7-
internal val LocalExitApplication =
8-
staticCompositionLocalOf<(ExitMode) -> Unit> {
9-
error("CompositionLocal ExitApplication not present")
10-
}
11-
12-
internal val LocalNavHostController =
6+
val LocalNavHostController =
137
staticCompositionLocalOf<NavHostController> {
148
error("CompositionLocal NavController not present")
159
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.crosspaste.ui
2+
3+
sealed class NavigationEvent {
4+
data class Navigate(
5+
val route: Route,
6+
) : NavigationEvent()
7+
8+
data class NavigateAndClearStack(
9+
val route: Route,
10+
) : NavigationEvent()
11+
12+
object NavigateUp : NavigationEvent()
13+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.crosspaste.ui
2+
3+
import androidx.navigation.NavHostController
4+
5+
interface NavigationManager {
6+
7+
fun navigate(route: Route)
8+
9+
fun navigateAndClearStack(route: Route)
10+
11+
fun navigateUp()
12+
13+
fun navigateAction(
14+
event: NavigationEvent,
15+
navController: NavHostController,
16+
)
17+
}

app/src/commonMain/kotlin/com/crosspaste/ui/Route.kt

Lines changed: 1 addition & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
package com.crosspaste.ui
22

3-
import androidx.navigation.NavDestination
4-
import androidx.navigation.NavDestination.Companion.hasRoute
53
import androidx.navigation.NavType
64
import androidx.savedstate.SavedState
75
import androidx.savedstate.read
@@ -12,8 +10,7 @@ import com.crosspaste.utils.getJsonUtils
1210
import kotlinx.serialization.KSerializer
1311
import kotlinx.serialization.Serializable
1412

15-
@Serializable
16-
sealed interface Route {
13+
interface Route {
1714
val name: String
1815
}
1916

@@ -104,23 +101,6 @@ object ShortcutKeys : Route {
104101
override val name: String = NAME
105102
}
106103

107-
fun getRouteName(dest: NavDestination): String? =
108-
when {
109-
dest.hasRoute<Pasteboard>() -> Pasteboard.NAME
110-
dest.hasRoute<Devices>() -> Devices.NAME
111-
dest.hasRoute<DeviceDetail>() -> DeviceDetail.NAME
112-
dest.hasRoute<Settings>() -> Settings.NAME
113-
dest.hasRoute<QrCode>() -> QrCode.NAME
114-
dest.hasRoute<Import>() -> Import.NAME
115-
dest.hasRoute<Export>() -> Export.NAME
116-
dest.hasRoute<ShortcutKeys>() -> ShortcutKeys.NAME
117-
dest.hasRoute<About>() -> About.NAME
118-
dest.hasRoute<Recommend>() -> Recommend.NAME
119-
dest.hasRoute<NearbyDeviceDetail>() -> NearbyDeviceDetail.NAME
120-
dest.hasRoute<PasteTextEdit>() -> PasteTextEdit.NAME
121-
else -> null
122-
}
123-
124104
class JsonNavType<T : Any>(
125105
private val serializer: KSerializer<T>,
126106
isNullableAllowed: Boolean = false,

app/src/commonMain/kotlin/com/crosspaste/ui/ScreenProvider.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package com.crosspaste.ui
22

33
import androidx.compose.runtime.Composable
44

5-
interface ScreenProvider {
5+
interface ScreenProvider : NavigationManager {
66

77
@Composable
88
fun screen()

app/src/commonMain/kotlin/com/crosspaste/ui/base/UISupport.kt

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package com.crosspaste.ui.base
22

3-
import androidx.navigation.NavController
43
import com.crosspaste.paste.PasteData
54
import okio.Path
65

@@ -27,15 +26,11 @@ interface UISupport {
2726

2827
fun openImage(imagePath: Path)
2928

30-
fun openText(
31-
navController: NavController,
32-
pasteData: PasteData,
33-
)
29+
fun openText(pasteData: PasteData)
3430

3531
fun openRtf(pasteData: PasteData)
3632

3733
fun openPasteData(
38-
navController: NavController,
3934
pasteData: PasteData,
4035
index: Int = 0,
4136
)

app/src/desktopMain/kotlin/com/crosspaste/DesktopModule.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,7 @@ import com.crosspaste.task.SyncPasteTaskExecutor
188188
import com.crosspaste.task.TaskExecutor
189189
import com.crosspaste.ui.DesktopFontManager
190190
import com.crosspaste.ui.DesktopScreenProvider
191+
import com.crosspaste.ui.NavigationManager
191192
import com.crosspaste.ui.ScreenProvider
192193
import com.crosspaste.ui.base.DesktopExpandViewProvider
193194
import com.crosspaste.ui.base.DesktopIconStyle
@@ -512,7 +513,8 @@ class DesktopModule(
512513
single<GlobalCopywriter> { DesktopGlobalCopywriter(get(), lazy { get() }, get()) }
513514
single<GlobalListener> { DesktopGlobalListener(get(), get(), get(), get()) }
514515
single<IconStyle> { DesktopIconStyle(get()) }
515-
single<MenuHelper> { MenuHelper(get(), get(), get(), get()) }
516+
single<MenuHelper> { MenuHelper(get(), get(), get(), get(), get()) }
517+
single<NavigationManager> { get<DesktopScreenProvider>() }
516518
single<NativeKeyListener> { get<DesktopShortcutKeysListener>() }
517519
single<NativeMouseListener> { get<DesktopAppSize>() }
518520
single<NotificationManager> { DesktopNotificationManager(get(), get(), get(), get(), get()) }
@@ -533,7 +535,7 @@ class DesktopModule(
533535
single<ThemeDetector> { DesktopThemeDetector(get()) }
534536
single<ToastManager> { ToastManager() }
535537
single<TokenCache> { TokenCache }
536-
single<UISupport> { DesktopUISupport(get(), get(), get(), get(), get(), get(), get()) }
538+
single<UISupport> { DesktopUISupport(get(), get(), get(), get(), get(), get(), get(), get()) }
537539
}
538540

539541
// ViewModelModule.kt

app/src/desktopMain/kotlin/com/crosspaste/paste/DesktopPasteMenuService.kt

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package com.crosspaste.paste
22

33
import androidx.compose.foundation.ContextMenuItem
4-
import androidx.navigation.NavController
54
import com.crosspaste.app.AppWindowManager
65
import com.crosspaste.app.DesktopAppWindowManager
76
import com.crosspaste.db.paste.PasteDao
@@ -83,11 +82,10 @@ class DesktopPasteMenuService(
8382
}
8483

8584
override fun openPasteData(
86-
navController: NavController,
8785
pasteData: PasteData,
8886
index: Int,
8987
) {
90-
uiSupport.openPasteData(navController, pasteData, index)
88+
uiSupport.openPasteData(pasteData, index)
9189
val pasteType = pasteData.getType()
9290
if (!pasteType.isText() && !pasteType.isColor()) {
9391
desktopAppWindowManager.hideMainWindow()
@@ -134,7 +132,6 @@ class DesktopPasteMenuService(
134132
}
135133

136134
fun fileMenuItemsProvider(
137-
navController: NavController,
138135
pasteData: PasteData,
139136
pasteItem: PasteItem,
140137
index: Int = 0,
@@ -148,22 +145,19 @@ class DesktopPasteMenuService(
148145
)
149146
},
150147
ContextMenuItem(copywriter.getText("open")) {
151-
openPasteData(navController, pasteData, index)
148+
openPasteData(pasteData, index)
152149
},
153150
)
154151
}
155152

156-
fun pasteMenuItemsProvider(
157-
navController: NavController,
158-
pasteData: PasteData,
159-
): () -> List<ContextMenuItem> =
153+
fun pasteMenuItemsProvider(pasteData: PasteData): () -> List<ContextMenuItem> =
160154
{
161155
listOf(
162156
ContextMenuItem(copywriter.getText("copy")) {
163157
copyPasteData(pasteData)
164158
},
165159
ContextMenuItem(copywriter.getText("open")) {
166-
openPasteData(navController, pasteData)
160+
openPasteData(pasteData)
167161
},
168162
ContextMenuItem(copywriter.getText("delete")) {
169163
deletePasteData(pasteData)
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.crosspaste.ui
2+
3+
import androidx.compose.runtime.staticCompositionLocalOf
4+
import com.crosspaste.app.ExitMode
5+
6+
internal val LocalExitApplication =
7+
staticCompositionLocalOf<(ExitMode) -> Unit> {
8+
error("CompositionLocal ExitApplication not present")
9+
}

0 commit comments

Comments
 (0)