import CodexBarCoreimport Foundationimport SwiftUI struct JetBrainsProviderImplementation: ProviderImplementation { let id: UsageProvider = .jetbrains @MainActor func settingsSnapshot(context: ProviderSettingsSnapshotContext) -> ProviderSettingsSnapshotContribution? { _ = context return .jetbrains(context.settings.jetbrainsSettingsSnapshot()) } @MainActor func settingsPickers(context: ProviderSettingsContext) -> [ProviderSettingsPickerDescriptor] { let detectedIDEs = JetBrainsIDEDetector.detectInstalledIDEs(includeMissingQuota: true) guard !detectedIDEs.isEmpty else { return [] } var options: [ProviderSettingsPickerOption] = [ ProviderSettingsPickerOption(id: "", title: "Auto-detect"), ] for ide in detectedIDEs { options.append(ProviderSettingsPickerOption(id: ide.basePath, title: ide.displayName)) } return [ ProviderSettingsPickerDescriptor( id: "jetbrains.ide", title: "JetBrains IDE", subtitle: "Select the IDE to monitor", binding: context.stringBinding(\.jetbrainsIDEBasePath), options: options, isVisible: nil, onChange: nil, trailingText: { if context.settings.jetbrainsIDEBasePath.isEmpty { if let latest = JetBrainsIDEDetector.detectLatestIDE() { return latest.displayName } } return nil }), ] } @MainActor func settingsFields(context: ProviderSettingsContext) -> [ProviderSettingsFieldDescriptor] { [ ProviderSettingsFieldDescriptor( id: "jetbrains.customPath", title: "Custom Path", subtitle: "Override auto-detection with a custom IDE base path", kind: .plain, placeholder: "~/Library/Application Support/JetBrains/IntelliJIdea2024.3", binding: context.stringBinding(\.jetbrainsIDEBasePath), actions: [], isVisible: { let detectedIDEs = JetBrainsIDEDetector.detectInstalledIDEs() return detectedIDEs.isEmpty || !context.settings.jetbrainsIDEBasePath.isEmpty }, onActivate: nil), ] } @MainActor func runLoginFlow(context: ProviderLoginContext) async -> Bool { await context.controller.runJetBrainsLoginFlow() return false }}
import CodexBarCore
import Foundation
import SwiftUI
struct JetBrainsProviderImplementation: ProviderImplementation {
let id: UsageProvider = .jetbrains
@MainActor
func settingsSnapshot(context: ProviderSettingsSnapshotContext) -> ProviderSettingsSnapshotContribution? {
_ = context
return .jetbrains(context.settings.jetbrainsSettingsSnapshot())
}
@MainActor
func settingsPickers(context: ProviderSettingsContext) -> [ProviderSettingsPickerDescriptor] {
let detectedIDEs = JetBrainsIDEDetector.detectInstalledIDEs(includeMissingQuota: true)
guard !detectedIDEs.isEmpty else { return [] }
var options: [ProviderSettingsPickerOption] = [
ProviderSettingsPickerOption(id: "", title: "Auto-detect"),
]
for ide in detectedIDEs {
options.append(ProviderSettingsPickerOption(id: ide.basePath, title: ide.displayName))
}
return [
ProviderSettingsPickerDescriptor(
id: "jetbrains.ide",
title: "JetBrains IDE",
subtitle: "Select the IDE to monitor",
binding: context.stringBinding(\.jetbrainsIDEBasePath),
options: options,
isVisible: nil,
onChange: nil,
trailingText: {
if context.settings.jetbrainsIDEBasePath.isEmpty {
if let latest = JetBrainsIDEDetector.detectLatestIDE() {
return latest.displayName
}
}
return nil
}),
]
}
@MainActor
func settingsFields(context: ProviderSettingsContext) -> [ProviderSettingsFieldDescriptor] {
[
ProviderSettingsFieldDescriptor(
id: "jetbrains.customPath",
title: "Custom Path",
subtitle: "Override auto-detection with a custom IDE base path",
kind: .plain,
placeholder: "~/Library/Application Support/JetBrains/IntelliJIdea2024.3",
binding: context.stringBinding(\.jetbrainsIDEBasePath),
actions: [],
isVisible: {
let detectedIDEs = JetBrainsIDEDetector.detectInstalledIDEs()
return detectedIDEs.isEmpty || !context.settings.jetbrainsIDEBasePath.isEmpty
},
onActivate: nil),
]
}
@MainActor
func runLoginFlow(context: ProviderLoginContext) async -> Bool {
await context.controller.runJetBrainsLoginFlow()
return false
}
}