@@ -2,25 +2,31 @@ import { useDialog } from "@tui/ui/dialog"
22import { DialogSelect } from "@tui/ui/dialog-select"
33import { useRoute } from "@tui/context/route"
44import { useSync } from "@tui/context/sync"
5- import { createMemo , createSignal , createResource , onMount , Show } from "solid-js"
5+ import { createMemo , createResource , createSignal , onMount } from "solid-js"
66import { Locale } from "@/util/locale"
7+ import { useProject } from "@tui/context/project"
78import { useKeybind } from "../context/keybind"
89import { useTheme } from "../context/theme"
910import { useSDK } from "../context/sdk"
11+ import { Flag } from "@/flag/flag"
1012import { DialogSessionRename } from "./dialog-session-rename"
11- import { useKV } from "../context/kv "
13+ import { Keybind } from "@/util/keybind "
1214import { createDebouncedSignal } from "../util/signal"
15+ import { useToast } from "../ui/toast"
16+ import { DialogWorkspaceCreate , openWorkspaceSession } from "./dialog-workspace-create"
1317import { Spinner } from "./spinner"
1418
19+ type WorkspaceStatus = "connected" | "connecting" | "disconnected" | "error"
20+
1521export function DialogSessionList ( ) {
1622 const dialog = useDialog ( )
1723 const route = useRoute ( )
1824 const sync = useSync ( )
25+ const project = useProject ( )
1926 const keybind = useKeybind ( )
2027 const { theme } = useTheme ( )
2128 const sdk = useSDK ( )
22- const kv = useKV ( )
23-
29+ const toast = useToast ( )
2430 const [ toDelete , setToDelete ] = createSignal < string > ( )
2531 const [ search , setSearch ] = createDebouncedSignal ( "" , 150 )
2632
@@ -31,15 +37,68 @@ export function DialogSessionList() {
3137 } )
3238
3339 const currentSessionID = createMemo ( ( ) => ( route . data . type === "session" ? route . data . sessionID : undefined ) )
34-
3540 const sessions = createMemo ( ( ) => searchResults ( ) ?? sync . data . session )
3641
42+ function createWorkspace ( ) {
43+ dialog . replace ( ( ) => (
44+ < DialogWorkspaceCreate
45+ onSelect = { ( workspaceID ) =>
46+ openWorkspaceSession ( {
47+ dialog,
48+ route,
49+ sdk,
50+ sync,
51+ toast,
52+ workspaceID,
53+ } )
54+ }
55+ />
56+ ) )
57+ }
58+
3759 const options = createMemo ( ( ) => {
3860 const today = new Date ( ) . toDateString ( )
3961 return sessions ( )
4062 . filter ( ( x ) => x . parentID === undefined )
4163 . toSorted ( ( a , b ) => b . time . updated - a . time . updated )
4264 . map ( ( x ) => {
65+ const workspace = x . workspaceID ? project . workspace . get ( x . workspaceID ) : undefined
66+
67+ let workspaceStatus : WorkspaceStatus | null = null
68+ if ( x . workspaceID ) {
69+ workspaceStatus = project . workspace . status ( x . workspaceID ) || "error"
70+ }
71+
72+ let footer = ""
73+ if ( Flag . OPENCODE_EXPERIMENTAL_WORKSPACES ) {
74+ if ( x . workspaceID ) {
75+ let desc = "unknown"
76+ if ( workspace ) {
77+ desc = `${ workspace . type } : ${ workspace . name } `
78+ }
79+
80+ footer = (
81+ < >
82+ { desc } { " " }
83+ < span
84+ style = { {
85+ fg :
86+ workspaceStatus === "error"
87+ ? theme . error
88+ : workspaceStatus === "disconnected"
89+ ? theme . textMuted
90+ : theme . success ,
91+ } }
92+ >
93+ ■
94+ </ span >
95+ </ >
96+ )
97+ }
98+ } else {
99+ footer = Locale . time ( x . time . updated )
100+ }
101+
43102 const date = new Date ( x . time . updated )
44103 let category = date . toDateString ( )
45104 if ( category === today ) {
@@ -53,7 +112,7 @@ export function DialogSessionList() {
53112 bg : isDeleting ? theme . error : undefined ,
54113 value : x . id ,
55114 category,
56- footer : Locale . time ( x . time . updated ) ,
115+ footer,
57116 gutter : isWorking ? < Spinner /> : undefined ,
58117 }
59118 } )
@@ -102,6 +161,15 @@ export function DialogSessionList() {
102161 dialog . replace ( ( ) => < DialogSessionRename session = { option . value } /> )
103162 } ,
104163 } ,
164+ {
165+ keybind : Keybind . parse ( "ctrl+w" ) [ 0 ] ,
166+ title : "new workspace" ,
167+ side : "right" ,
168+ disabled : ! Flag . OPENCODE_EXPERIMENTAL_WORKSPACES ,
169+ onTrigger : ( ) => {
170+ createWorkspace ( )
171+ } ,
172+ } ,
105173 ] }
106174 />
107175 )
0 commit comments