Files
Brewer/Brewer/InstalledView.swift
2024-07-10 11:40:17 +02:00

107 lines
2.2 KiB
Swift

//
// InstalledView.swift
// Brewer
//
// Created by Cédric MAS on 09/07/2024.
//
import SwiftUI
struct InstalledView: View {
@State private var brew = Homebrew()
var body: some View {
VStack {
if brew.isLoading {
ProgressView("Loading...")
} else if let data = brew.data {
List {
if !data.casks.isEmpty {
Section {
ForEach(data.casks, id: \.fullToken) { cask in
NavigationLink {
CaskDetailView(
cask: cask, brewListing: brew)
} label: {
HStack {
Text(cask.name.first ?? cask.fullToken)
Spacer()
if cask.outdated {
UpdateButton(name: cask.fullToken)
} else {
Text(cask.version)
}
}
.contextMenu {
UninstallButton(
name: cask.fullToken,
brewListing: brew)
}
}
}
} header: {
HStack {
Text("Casks")
Spacer()
Text("\(data.casks.count) installed")
}
}
}
if !data.formulae.isEmpty {
Section {
ForEach(data.formulae, id: \.fullName) { formulae in
HStack {
Text(formulae.fullName)
Spacer()
if formulae.outdated {
UpdateButton(name: formulae.fullName)
} else {
Text(formulae.versions.stable)
}
}
.contextMenu {
UninstallButton(
name: formulae.fullName,
brewListing: brew)
}
}
} header: {
HStack {
Text("Formulae")
Spacer()
Text("\(data.formulae.count) installed")
}
}
}
}
.listStyle(.inset(alternatesRowBackgrounds: true))
let areOutdated =
data.casks.filter(\.outdated).count
+ data.formulae.filter(\.outdated).count
let _ = UserDefaults.standard.set(
!(areOutdated > 0), forKey: "isUpToDate")
if areOutdated > 0 {
Button {
} label: {
Label(
"Update all",
systemImage: "arrow.counterclockwise.circle.fill")
}
.buttonStyle(.borderedProminent)
.tint(.orange)
}
} else if let error = brew.errorMessage {
Text(error)
.foregroundStyle(.red)
}
}.task {
brew.getInstalled()
}
}
}
#Preview {
InstalledView()
}