Skip to content

Commit 384d44c

Browse files
committed
Fix creating default tab
1 parent 803789d commit 384d44c

File tree

2 files changed

+126
-115
lines changed

2 files changed

+126
-115
lines changed
Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
import ChatGPTChatTab
2+
import ChatService
3+
import ChatTab
4+
import Foundation
5+
import PromptToCodeService
6+
import SuggestionModel
7+
import SuggestionWidget
8+
import XcodeInspector
9+
10+
#if canImport(ProChatTabs)
11+
import ProChatTabs
12+
13+
enum ChatTabFactory {
14+
static var chatTabBuilderCollection: [ChatTabBuilderCollection] {
15+
func folderIfNeeded(
16+
_ builders: [any ChatTabBuilder],
17+
title: String
18+
) -> ChatTabBuilderCollection? {
19+
if builders.count > 1 {
20+
return .folder(title: title, kinds: builders.map(ChatTabKind.init))
21+
}
22+
if let first = builders.first { return .kind(ChatTabKind(first)) }
23+
return nil
24+
}
25+
26+
let collection = [
27+
folderIfNeeded(ChatGPTChatTab.chatBuilders(), title: ChatGPTChatTab.name),
28+
folderIfNeeded(BrowserChatTab.chatBuilders(externalDependency: .init(
29+
getEditorContent: {
30+
guard let editor = XcodeInspector.shared.focusedEditor else {
31+
return .init(selectedText: "", language: "", fileContent: "")
32+
}
33+
let content = editor.content
34+
return .init(
35+
selectedText: content.selectedContent,
36+
language: languageIdentifierFromFileURL(
37+
XcodeInspector.shared
38+
.activeDocumentURL
39+
)
40+
.rawValue,
41+
fileContent: content.content
42+
)
43+
},
44+
handleCustomCommand: { command, prompt in
45+
switch command.feature {
46+
case let .chatWithSelection(extraSystemPrompt, _, useExtraSystemPrompt):
47+
let service = ChatService()
48+
return try await service.processMessage(
49+
systemPrompt: nil,
50+
extraSystemPrompt: (useExtraSystemPrompt ?? false) ? extraSystemPrompt :
51+
nil,
52+
prompt: prompt
53+
)
54+
case let .customChat(systemPrompt, _):
55+
let service = ChatService()
56+
return try await service.processMessage(
57+
systemPrompt: systemPrompt,
58+
extraSystemPrompt: nil,
59+
prompt: prompt
60+
)
61+
case let .singleRoundDialog(
62+
systemPrompt,
63+
overwriteSystemPrompt,
64+
_,
65+
_
66+
):
67+
let service = ChatService()
68+
return try await service.handleSingleRoundDialogCommand(
69+
systemPrompt: systemPrompt,
70+
overwriteSystemPrompt: overwriteSystemPrompt ?? false,
71+
prompt: prompt
72+
)
73+
case let .promptToCode(extraSystemPrompt, instruction, _, _):
74+
let service = PromptToCodeService(
75+
code: prompt,
76+
selectionRange: .outOfScope,
77+
language: .plaintext,
78+
identSize: 4,
79+
usesTabsForIndentation: true,
80+
projectRootURL: .init(fileURLWithPath: "/"),
81+
fileURL: .init(fileURLWithPath: "/"),
82+
allCode: prompt,
83+
extraSystemPrompt: extraSystemPrompt,
84+
generateDescriptionRequirement: false
85+
)
86+
try await service.modifyCode(prompt: instruction ?? "Modify content.")
87+
return service.code
88+
}
89+
}
90+
)), title: BrowserChatTab.name),
91+
].compactMap { $0 }
92+
93+
return collection
94+
}
95+
}
96+
97+
#else
98+
99+
enum ChatTabFactory {
100+
static var chatTabBuilderCollection: [ChatTabBuilderCollection] {
101+
func folderIfNeeded(
102+
_ builders: [any ChatTabBuilder],
103+
title: String
104+
) -> ChatTabBuilderCollection? {
105+
if builders.count > 1 {
106+
return .folder(title: title, kinds: builders.map(ChatTabKind.init))
107+
}
108+
if let first = builders.first { return .kind(ChatTabKind(first)) }
109+
return nil
110+
}
111+
112+
return [
113+
folderIfNeeded(ChatGPTChatTab.chatBuilders(), title: ChatGPTChatTab.name),
114+
].compactMap { $0 }
115+
}
116+
}
117+
118+
#endif
119+

Core/Sources/Service/GUI/GraphicalUserInterfaceController.swift

Lines changed: 7 additions & 115 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,11 @@
11
import AppKit
22
import ChatGPTChatTab
3-
import ChatService
43
import ChatTab
54
import ComposableArchitecture
65
import Dependencies
76
import Environment
87
import Preferences
9-
import PromptToCodeService
10-
import SuggestionModel
118
import SuggestionWidget
12-
import XcodeInspector
139

1410
struct GUI: ReducerProtocol {
1511
struct State: Equatable {
@@ -41,7 +37,13 @@ struct GUI: ReducerProtocol {
4137
Reduce { _, action in
4238
switch action {
4339
case let .createNewTapButtonClicked(kind):
44-
guard let builder = kind?.builder, builder.buildable else { return .none }
40+
guard let builder = kind?.builder else {
41+
let chatTap = ChatGPTChatTab()
42+
return .run { send in
43+
await send(.appendAndSelectTab(chatTap))
44+
}
45+
}
46+
guard builder.buildable else { return .none }
4547
let chatTap = builder.build()
4648
return .run { send in
4749
await send(.appendAndSelectTab(chatTap))
@@ -166,113 +168,3 @@ public final class GraphicalUserInterfaceController {
166168
}
167169
}
168170

169-
#if canImport(ProChatTabs)
170-
import ProChatTabs
171-
172-
enum ChatTabFactory {
173-
static var chatTabBuilderCollection: [ChatTabBuilderCollection] {
174-
func folderIfNeeded(
175-
_ builders: [any ChatTabBuilder],
176-
title: String
177-
) -> ChatTabBuilderCollection? {
178-
if builders.count > 1 {
179-
return .folder(title: title, kinds: builders.map(ChatTabKind.init))
180-
}
181-
if let first = builders.first { return .kind(ChatTabKind(first)) }
182-
return nil
183-
}
184-
185-
let collection = [
186-
folderIfNeeded(ChatGPTChatTab.chatBuilders(), title: ChatGPTChatTab.name),
187-
folderIfNeeded(BrowserChatTab.chatBuilders(externalDependency: .init(
188-
getEditorContent: {
189-
guard let editor = XcodeInspector.shared.focusedEditor else {
190-
return .init(selectedText: "", language: "", fileContent: "")
191-
}
192-
let content = editor.content
193-
return .init(
194-
selectedText: content.selectedContent,
195-
language: languageIdentifierFromFileURL(
196-
XcodeInspector.shared
197-
.activeDocumentURL
198-
)
199-
.rawValue,
200-
fileContent: content.content
201-
)
202-
},
203-
handleCustomCommand: { command, prompt in
204-
switch command.feature {
205-
case let .chatWithSelection(extraSystemPrompt, _, useExtraSystemPrompt):
206-
let service = ChatService()
207-
return try await service.processMessage(
208-
systemPrompt: nil,
209-
extraSystemPrompt: (useExtraSystemPrompt ?? false) ? extraSystemPrompt :
210-
nil,
211-
prompt: prompt
212-
)
213-
case let .customChat(systemPrompt, _):
214-
let service = ChatService()
215-
return try await service.processMessage(
216-
systemPrompt: systemPrompt,
217-
extraSystemPrompt: nil,
218-
prompt: prompt
219-
)
220-
case let .singleRoundDialog(
221-
systemPrompt,
222-
overwriteSystemPrompt,
223-
_,
224-
_
225-
):
226-
let service = ChatService()
227-
return try await service.handleSingleRoundDialogCommand(
228-
systemPrompt: systemPrompt,
229-
overwriteSystemPrompt: overwriteSystemPrompt ?? false,
230-
prompt: prompt
231-
)
232-
case let .promptToCode(extraSystemPrompt, instruction, _, _):
233-
let service = PromptToCodeService(
234-
code: prompt,
235-
selectionRange: .outOfScope,
236-
language: .plaintext,
237-
identSize: 4,
238-
usesTabsForIndentation: true,
239-
projectRootURL: .init(fileURLWithPath: "/"),
240-
fileURL: .init(fileURLWithPath: "/"),
241-
allCode: prompt,
242-
extraSystemPrompt: extraSystemPrompt,
243-
generateDescriptionRequirement: false
244-
)
245-
try await service.modifyCode(prompt: instruction ?? "Modify content.")
246-
return service.code
247-
}
248-
}
249-
)), title: BrowserChatTab.name),
250-
].compactMap { $0 }
251-
252-
return collection
253-
}
254-
}
255-
256-
#else
257-
258-
enum ChatTabFactory {
259-
static var chatTabBuilderCollection: [ChatTabBuilderCollection] {
260-
func folderIfNeeded(
261-
_ builders: [any ChatTabBuilder],
262-
title: String
263-
) -> ChatTabBuilderCollection? {
264-
if builders.count > 1 {
265-
return .folder(title: title, kinds: builders.map(ChatTabKind.init))
266-
}
267-
if let first = builders.first { return .kind(ChatTabKind(first)) }
268-
return nil
269-
}
270-
271-
return [
272-
folderIfNeeded(ChatGPTChatTab.chatBuilders(), title: ChatGPTChatTab.name),
273-
].compactMap { $0 }
274-
}
275-
}
276-
277-
#endif
278-

0 commit comments

Comments
 (0)