Skip to content

Commit 84a9dc3

Browse files
committed
Move chat services to WidgetDataSource
1 parent 33257b6 commit 84a9dc3

File tree

4 files changed

+42
-52
lines changed

4 files changed

+42
-52
lines changed

Core/Sources/Service/GUI/WidgetDataSource.swift

Lines changed: 30 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,31 @@
11
import ChatService
22
import Foundation
3+
import OpenAIService
34
import SuggestionWidget
45

5-
final class WidgetDataSource: SuggestionWidgetDataSource {
6+
final class WidgetDataSource {
67
static let shared = WidgetDataSource()
7-
8-
var globalChat: ChatService? = nil
8+
9+
var globalChat: ChatService?
10+
var chats = [URL: ChatService]()
911

1012
private init() {}
1113

14+
func createChatIfNeeded(for url: URL) -> ChatService {
15+
let useGlobalChat = UserDefaults.standard.value(for: \.useGlobalChat)
16+
let chat: ChatService
17+
if useGlobalChat {
18+
chat = globalChat ?? ChatService(chatGPTService: ChatGPTService())
19+
globalChat = chat
20+
} else {
21+
chat = chats[url] ?? ChatService(chatGPTService: ChatGPTService())
22+
chats[url] = chat
23+
}
24+
return chat
25+
}
26+
}
27+
28+
extension WidgetDataSource: SuggestionWidgetDataSource {
1229
func suggestionForFile(at url: URL) async -> SuggestionProvider? {
1330
for workspace in await workspaces.values {
1431
if let filespace = await workspace.filespaces[url],
@@ -63,30 +80,17 @@ final class WidgetDataSource: SuggestionWidgetDataSource {
6380
}
6481
)
6582
}
66-
67-
for workspace in await workspaces.values {
68-
if let filespace = await workspace.filespaces[url],
69-
let service = await filespace.chatService
70-
{
71-
return .init(
72-
service: service,
73-
fileURL: url,
74-
onCloseChat: { [weak filespace] in
75-
Task { @ServiceActor [weak filespace] in
76-
filespace?.chatService = nil
77-
}
78-
}
79-
)
80-
}
81-
}
82-
return nil
83-
}
8483

85-
func chatServiceForFile(at url: URL) async -> ChatService? {
86-
for workspace in await workspaces.values {
87-
if let filespace = await workspace.filespaces[url] {
88-
return await filespace.chatService
89-
}
84+
if let service = chats[url] {
85+
return .init(
86+
service: service,
87+
fileURL: url,
88+
onCloseChat: { [weak self] in
89+
Task { @ServiceActor [weak self] in
90+
self?.chats[url] = nil
91+
}
92+
}
93+
)
9094
}
9195
return nil
9296
}

Core/Sources/Service/ScheduledCleaner.swift

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,23 @@ import Foundation
22

33
public final class ScheduledCleaner {
44
public init() {
5-
// Occasionally cleanup workspaces.
5+
// occasionally cleanup workspaces.
66
Task { @ServiceActor in
77
while !Task.isCancelled {
88
try await Task.sleep(nanoseconds: 8 * 60 * 60 * 1_000_000_000)
99
for (url, workspace) in workspaces {
1010
if workspace.isExpired {
1111
workspaces[url] = nil
1212
} else {
13-
workspaces[url]?.cleanUp()
13+
// cleanup chats for unused files
14+
let filespaces = workspace.filespaces
15+
for (url, filespace) in filespaces {
16+
if filespace.isExpired {
17+
WidgetDataSource.shared.chats[url] = nil
18+
}
19+
}
20+
// cleanup workspace
21+
workspace.cleanUp()
1422
}
1523
}
1624
}

Core/Sources/Service/SuggestionCommandHandler/WindowBaseCommandHandler.swift

Lines changed: 2 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -188,13 +188,11 @@ struct WindowBaseCommandHandler: SuggestionCommandHandler {
188188
defer { presenter.markAsProcessing(false) }
189189

190190
let fileURL = try await Environment.fetchCurrentFileURL()
191-
let (_, filespace) = try await Workspace
192-
.fetchOrCreateWorkspaceIfNeeded(fileURL: fileURL)
193191
let language = UserDefaults.shared.value(for: \.chatGPTLanguage)
194192
let codeLanguage = languageIdentifierFromFileURL(fileURL)
195193
guard let selection = editor.selections.last else { return }
196194

197-
let chat = createChatServiceIfNeeded(filespace: filespace)
195+
let chat = WidgetDataSource.shared.createChatIfNeeded(for: fileURL)
198196

199197
await chat.mutateSystemPrompt(
200198
"""
@@ -234,8 +232,6 @@ struct WindowBaseCommandHandler: SuggestionCommandHandler {
234232
defer { presenter.markAsProcessing(false) }
235233

236234
let fileURL = try await Environment.fetchCurrentFileURL()
237-
let (_, filespace) = try await Workspace
238-
.fetchOrCreateWorkspaceIfNeeded(fileURL: fileURL)
239235
let language = UserDefaults.shared.value(for: \.chatGPTLanguage)
240236
let codeLanguage = languageIdentifierFromFileURL(fileURL)
241237

@@ -261,7 +257,7 @@ struct WindowBaseCommandHandler: SuggestionCommandHandler {
261257
"""
262258
}()
263259

264-
let chat = createChatServiceIfNeeded(filespace: filespace)
260+
let chat = WidgetDataSource.shared.createChatIfNeeded(for: fileURL)
265261

266262
await chat.mutateSystemPrompt(prompt)
267263

@@ -280,19 +276,3 @@ struct WindowBaseCommandHandler: SuggestionCommandHandler {
280276
presenter.presentChatGPTConversation(fileURL: fileURL)
281277
}
282278
}
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-
}

Core/Sources/Service/Workspace.swift

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,6 @@ final class Filespace {
3939
Environment.now().timeIntervalSince(lastSuggestionUpdateTime) > 60 * 60 * 8
4040
}
4141

42-
var chatService: ChatService? = nil
43-
4442
init(fileURL: URL) {
4543
self.fileURL = fileURL
4644
}

0 commit comments

Comments
 (0)