Skip to content

Commit abf2dff

Browse files
committed
Fix that ChatProvider is recreated and cause UI blinks
1 parent af3ab69 commit abf2dff

File tree

4 files changed

+22
-5
lines changed

4 files changed

+22
-5
lines changed

Core/Sources/Service/GUI/WidgetDataSource.swift

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,16 @@ final class WidgetDataSource {
88

99
var globalChat: ChatService?
1010
var chats = [URL: ChatService]()
11+
var globalChatProvider: ChatProvider?
12+
var chatProviders = [URL: ChatProvider]()
1113

1214
private init() {}
1315

1416
@discardableResult
1517
func createChatIfNeeded(for url: URL) -> ChatService {
1618
let useGlobalChat = UserDefaults.shared.value(for: \.useGlobalChat)
1719
let chat: ChatService
20+
1821
if useGlobalChat {
1922
chat = globalChat ?? ChatService(chatGPTService: ChatGPTService())
2023
globalChat = chat
@@ -77,8 +80,10 @@ extension WidgetDataSource: SuggestionWidgetDataSource {
7780
onCloseChat: { [weak self] in
7881
if UserDefaults.shared.value(for: \.useGlobalChat) {
7982
self?.globalChat = nil
83+
self?.globalChatProvider = nil
8084
} else {
8185
self?.chats[url] = nil
86+
self?.chatProviders[url] = nil
8287
}
8388
let presenter = PresentInWindowSuggestionPresenter()
8489
presenter.closeChatRoom(fileURL: url)
@@ -94,12 +99,20 @@ extension WidgetDataSource: SuggestionWidgetDataSource {
9499
}
95100

96101
if useGlobalChat {
97-
if let globalChat {
98-
return buildChatProvider(globalChat)
102+
if let globalChatProvider {
103+
return globalChatProvider
104+
} else if let globalChat {
105+
let new = buildChatProvider(globalChat)
106+
self.globalChatProvider = new
107+
return new
99108
}
100109
} else {
101-
if let service = chats[url] {
102-
return buildChatProvider(service)
110+
if let provider = chatProviders[url] {
111+
return provider
112+
} else if let service = chats[url] {
113+
let new = buildChatProvider(service)
114+
self.chatProviders[url] = new
115+
return new
103116
}
104117
}
105118

Core/Sources/Service/ScheduledCleaner.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ public final class ScheduledCleaner {
1515
for (url, filespace) in filespaces {
1616
if filespace.isExpired {
1717
WidgetDataSource.shared.chats[url] = nil
18+
WidgetDataSource.shared.chatProviders[url] = nil
1819
}
1920
}
2021
// cleanup workspace

Core/Sources/SuggestionWidget/ChatProvider.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import Foundation
22
import SwiftUI
33

44
public final class ChatProvider: ObservableObject {
5+
let id = UUID()
56
@Published public var history: [ChatMessage] = []
67
@Published public var isReceivingMessage = false
78
public var onMessageSend: (String) -> Void

Core/Sources/SuggestionWidget/SuggestionWidgetController.swift

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -444,7 +444,9 @@ extension SuggestionWidgetController {
444444
}
445445

446446
if let chat = await dataSource?.chatForFile(at: fileURL) {
447-
suggestionPanelViewModel.chat = chat
447+
if suggestionPanelViewModel.chat?.id != chat.id {
448+
suggestionPanelViewModel.chat = chat
449+
}
448450
} else {
449451
suggestionPanelViewModel.chat = nil
450452
}

0 commit comments

Comments
 (0)