Skip to content

Commit 1925397

Browse files
committed
Support opening references in Xcode
1 parent be2376a commit 1925397

File tree

3 files changed

+33
-7
lines changed

3 files changed

+33
-7
lines changed

Core/Package.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,7 @@ let package = Package(
250250
.product(name: "OpenAIService", package: "Tool"),
251251
.product(name: "Logger", package: "Tool"),
252252
.product(name: "ChatTab", package: "Tool"),
253+
.product(name: "Terminal", package: "Tool"),
253254
.product(name: "MarkdownUI", package: "swift-markdown-ui"),
254255
.product(name: "ComposableArchitecture", package: "swift-composable-architecture"),
255256
]

Core/Sources/ChatGPTChatTab/Chat.swift

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import ComposableArchitecture
33
import Foundation
44
import OpenAIService
55
import Preferences
6+
import Terminal
67

78
public struct DisplayedChatMessage: Equatable {
89
public enum Role: Equatable {
@@ -11,12 +12,12 @@ public struct DisplayedChatMessage: Equatable {
1112
case function
1213
case ignored
1314
}
14-
15+
1516
public struct Reference: Equatable {
1617
public var title: String
1718
public var subtitle: String
1819
public var uri: String
19-
20+
2021
public init(title: String, subtitle: String, uri: String) {
2122
self.title = title
2223
self.subtitle = subtitle
@@ -69,6 +70,7 @@ struct Chat: ReducerProtocol {
6970
case resendMessageButtonTapped(MessageID)
7071
case setAsExtraPromptButtonTapped(MessageID)
7172
case focusOnTextField
73+
case referenceClicked(DisplayedChatMessage.Reference)
7274

7375
case observeChatService
7476
case observeHistoryChange
@@ -96,6 +98,8 @@ struct Chat: ReducerProtocol {
9698
case observeExtraSystemPromptChange(UUID)
9799
case observeDefaultScopesChange(UUID)
98100
}
101+
102+
@Dependency(\.openURL) var openURL
99103

100104
var body: some ReducerProtocol<State, Action> {
101105
BindingReducer()
@@ -153,7 +157,26 @@ struct Chat: ReducerProtocol {
153157
return .run { _ in
154158
await service.setMessageAsExtraPrompt(id: id)
155159
}
156-
160+
161+
case let .referenceClicked(reference):
162+
let fileURL = URL(fileURLWithPath: reference.uri)
163+
return .run { _ in
164+
if FileManager.default.fileExists(atPath: fileURL.path) {
165+
let terminal = Terminal()
166+
do {
167+
_ = try await terminal.runCommand(
168+
"/bin/bash",
169+
arguments: ["-c", "xed -l 0 \"\(reference.uri)\""],
170+
environment: [:]
171+
)
172+
} catch {
173+
print(error)
174+
}
175+
} else if let url = URL(string: reference.uri) {
176+
await openURL(url)
177+
}
178+
}
179+
157180
case .focusOnTextField:
158181
state.focusedField = .textField
159182
return .none

Core/Sources/ChatGPTChatTab/Views/BotMessage.swift

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ struct BotMessage: View {
4141
})
4242
.buttonStyle(.plain)
4343
.popover(isPresented: $isReferencesPresented, arrowEdge: .trailing) {
44-
ReferenceList(references: references)
44+
ReferenceList(references: references, chat: chat)
4545
}
4646
}
4747

@@ -96,14 +96,16 @@ struct BotMessage: View {
9696

9797
struct ReferenceList: View {
9898
let references: [DisplayedChatMessage.Reference]
99+
let chat: StoreOf<Chat>
100+
99101
var body: some View {
100102
ScrollView {
101103
VStack(alignment: .leading, spacing: 8) {
102104
ForEach(0..<references.endIndex, id: \.self) { index in
103105
let reference = references[index]
104-
106+
105107
Button(action: {
106-
print("")
108+
chat.send(.referenceClicked(reference))
107109
}) {
108110
HStack(spacing: 8) {
109111
Text(reference.title)
@@ -186,6 +188,6 @@ struct ReferenceList: View {
186188
subtitle: "/Core/Sources/ChatGPTChatTab/Views/BotMessage.swift:100",
187189
uri: "https://google.com"
188190
),
189-
])
191+
], chat: .init(initialState: .init(), reducer: Chat(service: .init())))
190192
}
191193

0 commit comments

Comments
 (0)