Skip to content

Commit 33257b6

Browse files
committed
Add global chat service
1 parent b5b47a7 commit 33257b6

File tree

3 files changed

+40
-4
lines changed

3 files changed

+40
-4
lines changed

Core/Sources/Preferences/Keys.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,13 @@ public struct UserDefaultPreferenceKeys {
109109
.init()
110110
}
111111

112+
public struct UseGlobalChat: UserDefaultPreferenceKey {
113+
public let defaultValue = false
114+
public let key = "UseGlobalChat"
115+
}
116+
117+
public var useGlobalChat: UseGlobalChat { .init() }
118+
112119
public var disableLazyVStack: FeatureFlags.DisableLazyVStack { .init() }
113120
}
114121

Core/Sources/Service/GUI/WidgetDataSource.swift

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import SuggestionWidget
44

55
final class WidgetDataSource: SuggestionWidgetDataSource {
66
static let shared = WidgetDataSource()
7+
8+
var globalChat: ChatService? = nil
79

810
private init() {}
911

@@ -49,6 +51,19 @@ final class WidgetDataSource: SuggestionWidgetDataSource {
4951
}
5052

5153
func chatForFile(at url: URL) async -> ChatProvider? {
54+
let useGlobalChat = UserDefaults.standard.value(for: \.useGlobalChat)
55+
if useGlobalChat, let globalChat {
56+
return .init(
57+
service: globalChat,
58+
fileURL: url,
59+
onCloseChat: { [weak self] in
60+
Task { @ServiceActor [weak self] in
61+
self?.globalChat = nil
62+
}
63+
}
64+
)
65+
}
66+
5267
for workspace in await workspaces.values {
5368
if let filespace = await workspace.filespaces[url],
5469
let service = await filespace.chatService

Core/Sources/Service/SuggestionCommandHandler/WindowBaseCommandHandler.swift

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -194,8 +194,7 @@ struct WindowBaseCommandHandler: SuggestionCommandHandler {
194194
let codeLanguage = languageIdentifierFromFileURL(fileURL)
195195
guard let selection = editor.selections.last else { return }
196196

197-
let chat = filespace.chatService ?? ChatService(chatGPTService: ChatGPTService())
198-
filespace.chatService = chat
197+
let chat = createChatServiceIfNeeded(filespace: filespace)
199198

200199
await chat.mutateSystemPrompt(
201200
"""
@@ -262,8 +261,7 @@ struct WindowBaseCommandHandler: SuggestionCommandHandler {
262261
"""
263262
}()
264263

265-
let chat = filespace.chatService ?? ChatService(chatGPTService: ChatGPTService())
266-
filespace.chatService = chat
264+
let chat = createChatServiceIfNeeded(filespace: filespace)
267265

268266
await chat.mutateSystemPrompt(prompt)
269267

@@ -282,3 +280,19 @@ struct WindowBaseCommandHandler: SuggestionCommandHandler {
282280
presenter.presentChatGPTConversation(fileURL: fileURL)
283281
}
284282
}
283+
284+
extension SuggestionCommandHandler {
285+
@ServiceActor
286+
func createChatServiceIfNeeded(filespace: Filespace) -> ChatService {
287+
let chat: ChatService
288+
if UserDefaults.shared.value(for: \.useGlobalChat) {
289+
chat = WidgetDataSource.shared.globalChat
290+
?? ChatService(chatGPTService: ChatGPTService())
291+
WidgetDataSource.shared.globalChat = chat
292+
} else {
293+
chat = filespace.chatService ?? ChatService(chatGPTService: ChatGPTService())
294+
filespace.chatService = chat
295+
}
296+
return chat
297+
}
298+
}

0 commit comments

Comments
 (0)