git.iko.soy/opencode-android
on f9ed438 help sign in
97 lines 3.7 kB history raw
1package soy.iko.opencode.ui
3import androidx.compose.runtime.Composable
4import androidx.compose.runtime.getValue
5import androidx.navigation.NavType
6import androidx.navigation.compose.NavHost
7import androidx.navigation.compose.composable
8import androidx.navigation.compose.rememberNavController
9import androidx.navigation.navArgument
10import androidx.lifecycle.compose.collectAsStateWithLifecycle
11import soy.iko.opencode.di.AppContainer
12import soy.iko.opencode.ui.chat.ChatScreen
13import soy.iko.opencode.ui.file.FileBrowserScreen
14import soy.iko.opencode.ui.file.FileViewScreen
15import soy.iko.opencode.ui.server.ServerEditScreen
16import soy.iko.opencode.ui.server.ServerListScreen
17import soy.iko.opencode.ui.session.SessionListScreen
18import soy.iko.opencode.ui.settings.SettingsScreen
20@Composable
21fun OpencodeApp(container: AppContainer) {
22 val navController = rememberNavController()
23 val active by container.activeConnection.collectAsStateWithLifecycle()
25 NavHost(navController = navController, startDestination = Routes.SERVERS) {
27 composable(Routes.SERVERS) {
28 ServerListScreen(
29 container = container,
30 onConnected = { navController.navigate(Routes.SESSIONS) },
31 onAddProfile = { navController.navigate(Routes.serverEdit()) },
32 onEditProfile = { id -> navController.navigate(Routes.serverEdit(id)) },
33 )
34 }
36 composable(
37 route = "${Routes.SERVER_EDIT}?id={id}",
38 arguments = listOf(navArgument("id") { type = NavType.StringType; nullable = true; defaultValue = null }),
39 ) { entry ->
40 ServerEditScreen(
41 container = container,
42 profileId = entry.arguments?.getString("id"),
43 onDone = { navController.popBackStack() },
44 )
45 }
47 composable(Routes.SESSIONS) {
48 SessionListScreen(
49 container = container,
50 onOpenSession = { id -> navController.navigate(Routes.chat(id)) },
51 onDisconnect = {
52 container.disconnect()
53 navController.popBackStack(Routes.SERVERS, inclusive = false)
54 },
55 onOpenFiles = { navController.navigate(Routes.FILES) },
56 onOpenSettings = { navController.navigate(Routes.SETTINGS) },
57 )
58 }
60 composable(
61 route = "${Routes.CHAT}/{sessionId}",
62 arguments = listOf(navArgument("sessionId") { type = NavType.StringType }),
63 ) { entry ->
64 ChatScreen(
65 container = container,
66 sessionId = entry.arguments?.getString("sessionId").orEmpty(),
67 onBack = { navController.popBackStack() },
68 )
69 }
71 composable(Routes.FILES) {
72 FileBrowserScreen(
73 container = container,
74 onOpenFile = { path -> navController.navigate(Routes.fileView(path)) },
75 onBack = { navController.popBackStack() },
76 )
77 }
79 composable(
80 route = "${Routes.FILE_VIEW}?path={path}",
81 arguments = listOf(navArgument("path") { type = NavType.StringType; defaultValue = "" }),
82 ) { entry ->
83 FileViewScreen(
84 container = container,
85 path = entry.arguments?.getString("path").orEmpty(),
86 onBack = { navController.popBackStack() },
87 )
88 }
90 composable(Routes.SETTINGS) {
91 SettingsScreen(
92 container = container,
93 onBack = { navController.popBackStack() },
94 )
95 }
96 }