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
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) {
29 container = container,
30 onConnected = { navController.navigate(Routes.SESSIONS) },
31 onAddProfile = { navController.navigate(Routes.serverEdit()) },
32 onEditProfile = { id -> navController.navigate(Routes.serverEdit(id)) },
37 route = "${Routes.SERVER_EDIT}?id={id}",
38 arguments = listOf(navArgument("id") { type = NavType.StringType; nullable = true; defaultValue = null }),
41 container = container,
42 profileId = entry.arguments?.getString("id"),
43 onDone = { navController.popBackStack() },
47 composable(Routes.SESSIONS) {
49 container = container,
50 onOpenSession = { id -> navController.navigate(Routes.chat(id)) },
52 container.disconnect()
53 navController.popBackStack(Routes.SERVERS, inclusive = false)
55 onOpenFiles = { navController.navigate(Routes.FILES) },
56 onOpenSettings = { navController.navigate(Routes.SETTINGS) },
61 route = "${Routes.CHAT}/{sessionId}",
62 arguments = listOf(navArgument("sessionId") { type = NavType.StringType }),
65 container = container,
66 sessionId = entry.arguments?.getString("sessionId").orEmpty(),
67 onBack = { navController.popBackStack() },
71 composable(Routes.FILES) {
73 container = container,
74 onOpenFile = { path -> navController.navigate(Routes.fileView(path)) },
75 onBack = { navController.popBackStack() },
80 route = "${Routes.FILE_VIEW}?path={path}",
81 arguments = listOf(navArgument("path") { type = NavType.StringType; defaultValue = "" }),
84 container = container,
85 path = entry.arguments?.getString("path").orEmpty(),
86 onBack = { navController.popBackStack() },
90 composable(Routes.SETTINGS) {
92 container = container,
93 onBack = { navController.popBackStack() },
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list