@@ -9,6 +9,30 @@ import ProHostApp
99#endif
1010
1111struct 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 " )
0 commit comments