@@ -151,10 +151,21 @@ struct GUI: ReducerProtocol {
151151 }
152152 }
153153
154- case . suggestionWidget( . chatPanel( . chatTab( _ , . tabContentUpdated) ) ) :
154+ case let . suggestionWidget( . chatPanel( . chatTab( id , . tabContentUpdated) ) ) :
155155 #if canImport(ChatTabPersistent)
156+ // when a tab is updated, persist it.
156157 return . run { send in
157- await send ( . persistent( . persistChatTabs) )
158+ await send ( . persistent( . chatTabUpdated( id: id) ) )
159+ }
160+ #else
161+ return . none
162+ #endif
163+
164+ case let . suggestionWidget( . chatPanel( . closeTabButtonClicked( id) ) ) :
165+ #if canImport(ChatTabPersistent)
166+ // when a tab is closed, remove it from persistence.
167+ return . run { send in
168+ await send ( . persistent( . chatTabClosed( id: id) ) )
158169 }
159170 #else
160171 return . none
@@ -193,6 +204,10 @@ public final class GraphicalUserInterfaceController {
193204 dependencies. suggestionWidgetUserDefaultsObservers = . init( )
194205 dependencies. chatTabPool = chatTabPool
195206 dependencies. chatTabBuilderCollection = ChatTabFactory . chatTabBuilderCollection
207+
208+ #if canImport(ChatTabPersistent) && canImport(ProChatTab)
209+ dependencies. restoreChatTabInPool = chatTabPool. restore
210+ #endif
196211 }
197212 let store = StoreOf < GUI > (
198213 initialState: . init( ) ,
@@ -276,5 +291,37 @@ extension ChatTabPool {
276291 setTab ( chatTap)
277292 return ( chatTap, info)
278293 }
294+
295+ #if canImport(ChatTabPersistent) && canImport(ProChatTab)
296+ @MainActor
297+ func restore(
298+ _ data: ChatTabPersistent . RestorableTabData
299+ ) async throws -> ( any ChatTab , ChatTabInfo ) ? {
300+ let info = ChatTabInfo ( id: data. id, title: " " )
301+ switch data. name {
302+ case ChatGPTChatTab . name:
303+ guard let builder = try ? await ChatGPTChatTab . restore (
304+ from: data. data,
305+ externalDependency: ( )
306+ ) else { break }
307+ return createTab ( from: builder)
308+ case BrowserChatTab . name:
309+ guard let builder = try ? await BrowserChatTab . restore (
310+ from: data. data,
311+ externalDependency: ( )
312+ ) else { break }
313+ return createTab ( from: builder)
314+ default :
315+ break
316+ }
317+
318+ guard let builder = try ? await EmptyChatTab . restore (
319+ from: data. data, externalDependency: ( )
320+ ) else {
321+ return nil
322+ }
323+ return createTab ( for: builder)
324+ }
325+ #endif
279326}
280327
0 commit comments