141 lines · 4.1 KB · Swift
RawDownload
import CodexBarCoreimport Foundationimport SwiftUI /// Settings UI context passed to provider implementations.////// Providers use this to:/// - bind to `SettingsStore` values/// - read current provider state from `UsageStore`/// - surface transient status text (e.g. "Importing cookies…")/// - request a shared confirmation alert (no provider-specific UI)@MainActorstruct ProviderSettingsContext {    let provider: UsageProvider    let settings: SettingsStore    let store: UsageStore     let boolBinding: (ReferenceWritableKeyPath<SettingsStore, Bool>) -> Binding<Bool>    let stringBinding: (ReferenceWritableKeyPath<SettingsStore, String>) -> Binding<String>     let statusText: (String) -> String?    let setStatusText: (String, String?) -> Void     let lastAppActiveRunAt: (String) -> Date?    let setLastAppActiveRunAt: (String, Date?) -> Void     let requestConfirmation: (ProviderSettingsConfirmation) -> Void} /// Shared confirmation alert descriptor.////// Providers can request confirmations (e.g. permission prompts) without supplying custom UI.@MainActorstruct ProviderSettingsConfirmation {    let title: String    let message: String    let confirmTitle: String    let onConfirm: () -> Void} /// Shared toggle descriptor rendered in the Providers settings pane.@MainActorstruct ProviderSettingsToggleDescriptor: Identifiable {    let id: String    let title: String    let subtitle: String    let binding: Binding<Bool>     /// Optional short status text shown under the toggle when enabled.    let statusText: (() -> String?)?     /// Optional actions shown under the toggle when enabled.    let actions: [ProviderSettingsActionDescriptor]     /// Optional runtime visibility gate.    let isVisible: (() -> Bool)?     /// Called whenever the toggle changes.    let onChange: ((_ enabled: Bool) async -> Void)?     /// Called when the app becomes active (used for "retry after permission grant" flows).    let onAppDidBecomeActive: (() async -> Void)?     /// Called when the view appears while the toggle is enabled.    let onAppearWhenEnabled: (() async -> Void)?} /// Shared text field descriptor rendered in the Providers settings pane.@MainActorstruct ProviderSettingsFieldDescriptor: Identifiable {    enum Kind {        case plain        case secure    }     let id: String    let title: String    let subtitle: String    let kind: Kind    let placeholder: String?    let binding: Binding<String>    let actions: [ProviderSettingsActionDescriptor]    let isVisible: (() -> Bool)?    let onActivate: (() -> Void)?} /// Shared picker descriptor rendered in the Providers settings pane.@MainActorstruct ProviderSettingsPickerDescriptor: Identifiable {    let id: String    let title: String    let subtitle: String    let dynamicSubtitle: (() -> String?)?    let binding: Binding<String>    let options: [ProviderSettingsPickerOption]    let isVisible: (() -> Bool)?    let onChange: ((_ selection: String) async -> Void)?    let trailingText: (() -> String?)?     init(        id: String,        title: String,        subtitle: String,        dynamicSubtitle: (() -> String?)? = nil,        binding: Binding<String>,        options: [ProviderSettingsPickerOption],        isVisible: (() -> Bool)?,        onChange: ((_ selection: String) async -> Void)?,        trailingText: (() -> String?)? = nil)    {        self.id = id        self.title = title        self.subtitle = subtitle        self.dynamicSubtitle = dynamicSubtitle        self.binding = binding        self.options = options        self.isVisible = isVisible        self.onChange = onChange        self.trailingText = trailingText    }} struct ProviderSettingsPickerOption: Identifiable {    let id: String    let title: String} /// Shared action descriptor rendered under a settings toggle.@MainActorstruct ProviderSettingsActionDescriptor: Identifiable {    enum Style {        case bordered        case link    }     let id: String    let title: String    let style: Style    let isVisible: (() -> Bool)?    let perform: () async -> Void}