|
1 | 1 | import SwiftUI |
2 | 2 | import Persist |
3 | 3 | import ConversationServiceProvider |
| 4 | +import GitHubCopilotService |
| 5 | +import Combine |
4 | 6 |
|
5 | 7 | public extension Notification.Name { |
6 | 8 | static let gitHubCopilotChatModeDidChange = Notification |
7 | 9 | .Name("com.github.CopilotForXcode.ChatModeDidChange") |
8 | 10 | } |
9 | 11 |
|
| 12 | +public enum ChatMode: String { |
| 13 | + case Ask = "Ask" |
| 14 | + case Agent = "Agent" |
| 15 | +} |
| 16 | + |
10 | 17 | public struct ChatModePicker: View { |
11 | 18 | @Binding var chatMode: String |
12 | 19 | @Environment(\.colorScheme) var colorScheme |
| 20 | + @State var isAgentModeFFEnabled: Bool |
| 21 | + @State private var cancellables = Set<AnyCancellable>() |
13 | 22 | var onScopeChange: (PromptTemplateScope) -> Void |
14 | 23 |
|
15 | 24 | public init(chatMode: Binding<String>, onScopeChange: @escaping (PromptTemplateScope) -> Void = { _ in }) { |
16 | 25 | self._chatMode = chatMode |
17 | 26 | self.onScopeChange = onScopeChange |
| 27 | + self.isAgentModeFFEnabled = FeatureFlagNotifierImpl.shared.featureFlags.agent_mode != false |
| 28 | + } |
| 29 | + |
| 30 | + private func setChatMode(mode: ChatMode) { |
| 31 | + chatMode = mode.rawValue |
| 32 | + AppState.shared.setSelectedChatMode(mode.rawValue) |
| 33 | + onScopeChange(mode == .Ask ? .chatPanel : .agentPanel) |
| 34 | + NotificationCenter.default.post( |
| 35 | + name: .gitHubCopilotChatModeDidChange, |
| 36 | + object: nil |
| 37 | + ) |
| 38 | + } |
| 39 | + |
| 40 | + private func subscribeToFeatureFlagsDidChangeEvent() { |
| 41 | + FeatureFlagNotifierImpl.shared.featureFlagsDidChange.sink(receiveValue: { (featureFlags) in |
| 42 | + isAgentModeFFEnabled = featureFlags.agent_mode ?? true |
| 43 | + }) |
| 44 | + .store(in: &cancellables) |
18 | 45 | } |
19 | 46 |
|
20 | 47 | public var body: some View { |
21 | | - HStack(spacing: -1) { |
22 | | - ModeButton( |
23 | | - title: "Ask", |
24 | | - isSelected: chatMode == "Ask", |
25 | | - activeBackground: colorScheme == .dark ? Color.white.opacity(0.25) : Color.white, |
26 | | - activeTextColor: Color.primary, |
27 | | - inactiveTextColor: Color.primary.opacity(0.5), |
28 | | - action: { |
29 | | - chatMode = "Ask" |
30 | | - AppState.shared.setSelectedChatMode("Ask") |
31 | | - onScopeChange(.chatPanel) |
32 | | - NotificationCenter.default.post( |
33 | | - name: .gitHubCopilotChatModeDidChange, |
34 | | - object: nil |
| 48 | + VStack { |
| 49 | + if isAgentModeFFEnabled { |
| 50 | + HStack(spacing: -1) { |
| 51 | + ModeButton( |
| 52 | + title: "Ask", |
| 53 | + isSelected: chatMode == "Ask", |
| 54 | + activeBackground: colorScheme == .dark ? Color.white.opacity(0.25) : Color.white, |
| 55 | + activeTextColor: Color.primary, |
| 56 | + inactiveTextColor: Color.primary.opacity(0.5), |
| 57 | + action: { |
| 58 | + setChatMode(mode: .Ask) |
| 59 | + } |
35 | 60 | ) |
36 | | - } |
37 | | - ) |
38 | | - |
39 | | - ModeButton( |
40 | | - title: "Agent", |
41 | | - isSelected: chatMode == "Agent", |
42 | | - activeBackground: Color.blue, |
43 | | - activeTextColor: Color.white, |
44 | | - inactiveTextColor: Color.primary.opacity(0.5), |
45 | | - action: { |
46 | | - chatMode = "Agent" |
47 | | - AppState.shared.setSelectedChatMode("Agent") |
48 | | - onScopeChange(.agentPanel) |
49 | | - NotificationCenter.default.post( |
50 | | - name: .gitHubCopilotChatModeDidChange, |
51 | | - object: nil |
| 61 | + |
| 62 | + ModeButton( |
| 63 | + title: "Agent", |
| 64 | + isSelected: chatMode == "Agent", |
| 65 | + activeBackground: Color.blue, |
| 66 | + activeTextColor: Color.white, |
| 67 | + inactiveTextColor: Color.primary.opacity(0.5), |
| 68 | + action: { |
| 69 | + setChatMode(mode: .Agent) |
| 70 | + } |
52 | 71 | ) |
53 | 72 | } |
54 | | - ) |
| 73 | + .padding(1) |
| 74 | + .frame(height: 20, alignment: .topLeading) |
| 75 | + .background(.primary.opacity(0.1)) |
| 76 | + .cornerRadius(5) |
| 77 | + .padding(4) |
| 78 | + .help("Set Mode") |
| 79 | + } else { |
| 80 | + EmptyView() |
| 81 | + } |
| 82 | + } |
| 83 | + .task { |
| 84 | + subscribeToFeatureFlagsDidChangeEvent() |
| 85 | + if !isAgentModeFFEnabled { |
| 86 | + setChatMode(mode: .Ask) |
| 87 | + } |
| 88 | + } |
| 89 | + .onChange(of: isAgentModeFFEnabled) { newAgentModeFFEnabled in |
| 90 | + if !newAgentModeFFEnabled { |
| 91 | + setChatMode(mode: .Ask) |
| 92 | + } |
55 | 93 | } |
56 | | - .padding(1) |
57 | | - .frame(height: 20, alignment: .topLeading) |
58 | | - .background(.primary.opacity(0.1)) |
59 | | - .cornerRadius(5) |
60 | | - .padding(4) |
61 | | - .help("Set Mode") |
62 | 94 | } |
63 | 95 | } |
0 commit comments