MCPcopy Create free account
hub / github.com/altic-dev/FluidVoice / SearchableModelPicker

Struct SearchableModelPicker

Sources/Fluid/UI/SearchableModelPicker.swift:11–207  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

9import SwiftUI
10
11struct SearchableModelPicker: View {
12 @Environment(\.theme) private var theme
13 let models: [String]
14 @Binding var selectedModel: String
15 var onRefresh: (() async -> Void)?
16 var isRefreshing: Bool = false
17 var refreshEnabled: Bool = true
18 var selectionEnabled: Bool = true
19 let controlWidth: CGFloat
20 let controlHeight: CGFloat?
21
22 init(
23 models: [String],
24 selectedModel: Binding<String>,
25 onRefresh: (() async -> Void)? = nil,
26 isRefreshing: Bool = false,
27 refreshEnabled: Bool = true,
28 selectionEnabled: Bool = true,
29 controlWidth: CGFloat = 180,
30 controlHeight: CGFloat? = nil
31 ) {
32 self.models = models
33 self._selectedModel = selectedModel
34 self.onRefresh = onRefresh
35 self.isRefreshing = isRefreshing
36 self.refreshEnabled = refreshEnabled
37 self.selectionEnabled = selectionEnabled
38 self.controlWidth = controlWidth
39 self.controlHeight = controlHeight
40 }
41
42 @State private var searchText = ""
43 @State private var isShowingPopover = false
44
45 private var refreshButtonSize: CGFloat {
46 self.controlHeight ?? 24
47 }
48
49 private var pickerControlWidth: CGFloat? {
50 guard self.onRefresh != nil, self.controlHeight != nil else {
51 return self.controlWidth
52 }
53 return max(self.controlWidth - self.refreshButtonSize - 8, 80)
54 }
55
56 private var filteredModels: [String] {
57 if self.searchText.isEmpty {
58 return self.models
59 }
60 return self.models.filter { $0.localizedCaseInsensitiveContains(self.searchText) }
61 }
62
63 var body: some View {
64 HStack(spacing: 8) {
65 // Model button that opens popover
66 Button(action: { self.isShowingPopover.toggle() }) {
67 HStack(spacing: 6) {
68 Text(self.selectedModel.isEmpty ? "Select Model" : self.selectedModel)

Tested by

no test coverage detected