Skip to content

Commit 128d040

Browse files
committed
Fix suggestion provider picker
1 parent 4a69aac commit 128d040

2 files changed

Lines changed: 72 additions & 17 deletions

File tree

Core/Sources/HostApp/FeatureSettings/SuggestionSettingsView.swift

Lines changed: 71 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,30 @@ import ProHostApp
99
#endif
1010

1111
struct SuggestionSettingsView: View {
12+
struct SuggestionFeatureProviderOption: Identifiable, Hashable {
13+
var id: String {
14+
(builtInProvider?.rawValue).map(String.init) ?? bundleIdentifier ?? "n/A"
15+
}
16+
17+
var name: String
18+
var builtInProvider: BuiltInSuggestionFeatureProvider?
19+
var bundleIdentifier: String?
20+
21+
func hash(into hasher: inout Hasher) {
22+
id.hash(into: &hasher)
23+
}
24+
25+
init(
26+
name: String,
27+
builtInProvider: BuiltInSuggestionFeatureProvider? = nil,
28+
bundleIdentifier: String? = nil
29+
) {
30+
self.name = name
31+
self.builtInProvider = builtInProvider
32+
self.bundleIdentifier = bundleIdentifier
33+
}
34+
}
35+
1236
final class Settings: ObservableObject {
1337
@AppStorage(\.realtimeSuggestionToggle)
1438
var realtimeSuggestionToggle
@@ -36,7 +60,8 @@ struct SuggestionSettingsView: View {
3660
var refreshExtensionSuggestionFeatureProvidersTask: Task<Void, Never>?
3761

3862
@MainActor
39-
@Published var extensionSuggestionFeatureProviders = [ExtensionSuggestionFeatureProvider]()
63+
@Published
64+
var extensionSuggestionFeatureProviderOptions = [SuggestionFeatureProviderOption]()
4065

4166
init() {
4267
Task { @MainActor in
@@ -54,21 +79,17 @@ struct SuggestionSettingsView: View {
5479
}
5580
}
5681

57-
struct ExtensionSuggestionFeatureProvider: Identifiable {
58-
var id: String { bundleIdentifier }
59-
var name: String
60-
var bundleIdentifier: String
61-
}
62-
6382
@MainActor
6483
func refreshExtensionSuggestionFeatureProviders() {
6584
guard let service = try? getService() else { return }
6685
Task { @MainActor in
6786
let services = try await service
6887
.send(requestBody: ExtensionServiceRequests.GetExtensionSuggestionServices())
69-
extensionSuggestionFeatureProviders = services.map {
88+
extensionSuggestionFeatureProviderOptions = services.map {
7089
.init(name: $0.name, bundleIdentifier: $0.bundleIdentifier)
7190
}
91+
print(services.map(\.bundleIdentifier))
92+
print(suggestionFeatureProvider)
7293
}
7394
}
7495
}
@@ -92,21 +113,55 @@ struct SuggestionSettingsView: View {
92113
Text("Presentation")
93114
}
94115

95-
Picker(selection: $settings.suggestionFeatureProvider) {
116+
Picker(selection: Binding(get: {
117+
switch settings.suggestionFeatureProvider {
118+
case let .builtIn(provider):
119+
return SuggestionFeatureProviderOption(
120+
name: "",
121+
builtInProvider: provider
122+
)
123+
case let .extension(name, identifier):
124+
return SuggestionFeatureProviderOption(
125+
name: name,
126+
bundleIdentifier: identifier
127+
)
128+
}
129+
}, set: { (option: SuggestionFeatureProviderOption) in
130+
if let provider = option.builtInProvider {
131+
settings.suggestionFeatureProvider = .builtIn(provider)
132+
} else {
133+
settings.suggestionFeatureProvider = .extension(
134+
name: option.name,
135+
bundleIdentifier: option.bundleIdentifier ?? ""
136+
)
137+
}
138+
})) {
96139
ForEach(BuiltInSuggestionFeatureProvider.allCases, id: \.rawValue) {
97140
switch $0 {
98141
case .gitHubCopilot:
99-
Text("GitHub Copilot").tag(SuggestionFeatureProvider.builtIn($0))
142+
Text("GitHub Copilot")
143+
.tag(SuggestionFeatureProviderOption(name: "", builtInProvider: $0))
100144
case .codeium:
101-
Text("Codeium").tag(SuggestionFeatureProvider.builtIn($0))
145+
Text("Codeium")
146+
.tag(SuggestionFeatureProviderOption(name: "", builtInProvider: $0))
102147
}
103148
}
104149

105-
ForEach(settings.extensionSuggestionFeatureProviders, id: \.id) {
106-
Text($0.name).tag(SuggestionFeatureProvider.extension(
107-
name: $0.name,
108-
bundleIdentifier: $0.bundleIdentifier
109-
))
150+
ForEach(settings.extensionSuggestionFeatureProviderOptions, id: \.self) { item in
151+
Text(item.name).tag(item)
152+
}
153+
154+
if case let .extension(name, identifier) = settings.suggestionFeatureProvider {
155+
if !settings.extensionSuggestionFeatureProviderOptions.contains(where: {
156+
$0.bundleIdentifier == identifier
157+
}) {
158+
Text("\(name) (Not Found)").tag(
159+
SuggestionFeatureProviderOption(
160+
name: name,
161+
bundleIdentifier: identifier
162+
)
163+
)
164+
}
110165
}
111166
} label: {
112167
Text("Feature Provider")

Pro

Submodule Pro updated from 359d59c to 4bade8f

0 commit comments

Comments
 (0)