@@ -5,15 +5,22 @@ import { Icon } from "@opencode-ai/ui/icon"
55import { useLanguage } from "@/context/language"
66import { usePlatform } from "@/context/platform"
77import { SettingsGeneralV2 } from "./general"
8+ import { SettingsAppearanceV2 } from "./appearance"
89import { SettingsKeybinds } from "../settings-keybinds"
10+ import { SettingsNotificationsV2 } from "./notifications"
911import { SettingsProvidersV2 } from "./providers"
1012import { SettingsModelsV2 } from "./models"
11- import "./settings-v2.css"
1213import { SettingsServersV2 } from "./servers"
1314import { SettingsWorkspacesV2 } from "./workspaces"
15+ import { SettingsProjectsV2 } from "./projects"
16+ import { SettingsExtensionsV2 } from "./extensions"
17+ import { SettingsServerScope } from "../settings-server-picker"
1418import { useDialog } from "@opencode-ai/ui/context/dialog"
19+ import { useLayout } from "@/context/layout"
1520import { useTabs } from "@/context/tabs"
1621import { useServerSync } from "@/context/server-sync"
22+ import { useGlobal } from "@/context/global"
23+ import "./settings-v2.css"
1724
1825export const DialogSettings : Component < {
1926 sessionID ?: string
@@ -22,16 +29,21 @@ export const DialogSettings: Component<{
2229 const language = useLanguage ( )
2330 const platform = usePlatform ( )
2431 const dialog = useDialog ( )
32+ const layout = useLayout ( )
2533 const tabs = useTabs ( )
2634 const serverSync = useServerSync ( )
35+ const global = useGlobal ( )
2736 const [ tab , setTab ] = createSignal ( props . defaultValue ?? "general" )
2837 const directory = createMemo ( ( ) => {
29- const active = tabs . active ( )
30- if ( active ?. type === "draft" ) return active . directory
31- if ( active ?. type === "session" ) {
32- const session = serverSync ( ) . session . get ( active . sessionId )
33- if ( session ) return session . directory
38+ const server = global . settings . server . selected ( )
39+ if ( ! server || serverSync ( ) !== global . ensureServerCtx ( server ) . sync ) return
40+ const route = layout . route ( )
41+ if ( route . type === "dir-new-sesssion" ) return route . dir
42+ if ( route . type === "draft" ) {
43+ const draft = tabs . store . find ( ( item ) => item . type === "draft" && item . draftID === route . draftID )
44+ return draft ?. type === "draft" ? draft . directory : undefined
3445 }
46+ if ( route . type === "session" ) return serverSync ( ) . session . get ( route . sessionId ) ?. directory
3547 return undefined
3648 } )
3749
@@ -50,54 +62,73 @@ export const DialogSettings: Component<{
5062 >
5163 < TabsV2 . List >
5264 < div class = "flex flex-col justify-between h-full w-full" >
53- < div class = "flex flex-col gap-3 w-full" >
54- < div class = "flex flex-col gap-3" >
55- < div class = "flex flex-col gap-1.5" >
56- < TabsV2 . SectionTitle > { language . t ( "settings.section.desktop" ) } </ TabsV2 . SectionTitle >
57- < div class = "flex flex-col gap-1.5 w-full" >
58- < TabsV2 . Trigger value = "general" >
59- < Icon name = "sliders" size = "small" />
60- { language . t ( "settings.tab.general" ) }
61- </ TabsV2 . Trigger >
62- < TabsV2 . Trigger value = "shortcuts" >
63- < Icon name = "keyboard" size = "small" />
64- { language . t ( "settings.tab.shortcuts" ) }
65- </ TabsV2 . Trigger >
66- </ div >
67- </ div >
65+ < div class = "flex flex-col gap-4 w-full" >
66+ < div class = "flex flex-col gap-1 w-full" >
67+ < TabsV2 . Trigger value = "general" >
68+ < Icon name = "sliders" />
69+ { language . t ( "settings.tab.preferences" ) }
70+ </ TabsV2 . Trigger >
71+ < TabsV2 . Trigger value = "appearance" >
72+ < Icon name = "appearance" />
73+ { language . t ( "settings.general.section.appearance" ) }
74+ </ TabsV2 . Trigger >
75+ < TabsV2 . Trigger value = "notifications" >
76+ < Icon name = "notifications" />
77+ { language . t ( "settings.tab.notifications" ) }
78+ </ TabsV2 . Trigger >
79+ < TabsV2 . Trigger value = "shortcuts" >
80+ < Icon name = "keyboard" />
81+ { language . t ( "settings.tab.shortcuts" ) }
82+ </ TabsV2 . Trigger >
83+ </ div >
84+
85+ < div class = "flex flex-col gap-1 w-full" >
86+ < TabsV2 . Trigger value = "workspaces" >
87+ < Icon name = "workspace-isolated" />
88+ { language . t ( "settings.tab.workspaces" ) }
89+ </ TabsV2 . Trigger >
90+ < TabsV2 . Trigger value = "servers" >
91+ < Icon name = "server" />
92+ { language . t ( "status.popover.tab.servers" ) }
93+ </ TabsV2 . Trigger >
94+ < TabsV2 . Trigger value = "projects" >
95+ < Icon name = "folder" />
96+ { language . t ( "settings.tab.projects" ) }
97+ </ TabsV2 . Trigger >
98+ </ div >
6899
69- < div class = "flex flex-col gap-1.5" >
70- < TabsV2 . SectionTitle > { language . t ( "settings.section.server" ) } </ TabsV2 . SectionTitle >
71- < div class = "flex flex-col gap-1.5 w-full" >
72- < TabsV2 . Trigger value = "workspaces" >
73- < Icon name = "workspace-isolated" size = "small" />
74- { language . t ( "settings.tab.workspaces" ) }
75- </ TabsV2 . Trigger >
76- < TabsV2 . Trigger value = "servers" >
77- < Icon name = "server" size = "small" />
78- { language . t ( "status.popover.tab.servers" ) }
79- </ TabsV2 . Trigger >
80- < TabsV2 . Trigger value = "providers" >
81- < Icon name = "providers" size = "small" />
82- { language . t ( "settings.providers.title" ) }
83- </ TabsV2 . Trigger >
84- < TabsV2 . Trigger value = "models" >
85- < Icon name = "models" size = "small" />
86- { language . t ( "settings.models.title" ) }
87- </ TabsV2 . Trigger >
88- </ div >
89- </ div >
100+ < div class = "flex flex-col gap-1 w-full" >
101+ < TabsV2 . Trigger value = "providers" >
102+ < Icon name = "providers" />
103+ { language . t ( "settings.providers.title" ) }
104+ </ TabsV2 . Trigger >
105+ < TabsV2 . Trigger value = "models" >
106+ < Icon name = "models" />
107+ { language . t ( "settings.models.title" ) }
108+ </ TabsV2 . Trigger >
109+ < TabsV2 . Trigger value = "extensions" >
110+ < Icon name = "extensions" />
111+ { language . t ( "settings.tab.extensions" ) }
112+ </ TabsV2 . Trigger >
90113 </ div >
91114 </ div >
115+
92116 < div class = "settings-v2-nav-footer" >
93117 < span > { language . t ( "app.name.desktop" ) } </ span >
94118 < span > v{ platform . version } </ span >
95119 </ div >
96120 </ div >
97121 </ TabsV2 . List >
122+
98123 < TabsV2 . Content value = "general" class = "settings-v2-panel" >
99124 < SettingsGeneralV2 sessionID = { props . sessionID } />
100125 </ TabsV2 . Content >
126+ < TabsV2 . Content value = "appearance" class = "settings-v2-panel" >
127+ < SettingsAppearanceV2 />
128+ </ TabsV2 . Content >
129+ < TabsV2 . Content value = "notifications" class = "settings-v2-panel" >
130+ < SettingsNotificationsV2 />
131+ </ TabsV2 . Content >
101132 < TabsV2 . Content value = "shortcuts" class = "settings-v2-panel" >
102133 < SettingsKeybinds v2 />
103134 </ TabsV2 . Content >
@@ -107,12 +138,20 @@ export const DialogSettings: Component<{
107138 < TabsV2 . Content value = "servers" class = "settings-v2-panel" >
108139 < SettingsServersV2 />
109140 </ TabsV2 . Content >
110- < TabsV2 . Content value = "providers" class = "settings-v2-panel" >
111- < SettingsProvidersV2 directory = { directory } onBack = { showProviders } />
112- </ TabsV2 . Content >
113- < TabsV2 . Content value = "models" class = "settings-v2-panel" >
114- < SettingsModelsV2 />
141+ < TabsV2 . Content value = "projects" class = "settings-v2-panel" >
142+ < SettingsProjectsV2 />
115143 </ TabsV2 . Content >
144+ < SettingsServerScope >
145+ < TabsV2 . Content value = "providers" class = "settings-v2-panel" >
146+ < SettingsProvidersV2 directory = { directory } onBack = { showProviders } />
147+ </ TabsV2 . Content >
148+ < TabsV2 . Content value = "models" class = "settings-v2-panel" >
149+ < SettingsModelsV2 />
150+ </ TabsV2 . Content >
151+ < TabsV2 . Content value = "extensions" class = "settings-v2-panel" >
152+ < SettingsExtensionsV2 />
153+ </ TabsV2 . Content >
154+ </ SettingsServerScope >
116155 </ TabsV2 >
117156 </ Dialog >
118157 )
0 commit comments