included Sparkle
This commit is contained in:
@@ -12,6 +12,7 @@ struct MainView: View {
|
||||
private static let serverOrderKeyStatic = "serverOrder"
|
||||
private static let storedServersKeyStatic = "storedServers"
|
||||
|
||||
@EnvironmentObject private var updateViewModel: UpdateViewModel
|
||||
@State var showAddServerSheet: Bool = false
|
||||
@State private var serverBeingEdited: Server?
|
||||
@State private var serverToDelete: Server?
|
||||
@@ -30,9 +31,9 @@ struct MainView: View {
|
||||
@State private var selectedServerID: UUID?
|
||||
|
||||
var body: some View {
|
||||
|
||||
NavigationSplitView {
|
||||
List(selection: $selectedServerID) {
|
||||
var mainContent: some View {
|
||||
NavigationSplitView {
|
||||
List(selection: $selectedServerID) {
|
||||
ForEach(servers) { server in
|
||||
HStack {
|
||||
Image(systemName: "dot.circle.fill")
|
||||
@@ -61,6 +62,19 @@ struct MainView: View {
|
||||
}
|
||||
.help("Add Host")
|
||||
}
|
||||
ToolbarItem {
|
||||
Button {
|
||||
updateViewModel.checkForUpdates(userInitiated: true)
|
||||
} label: {
|
||||
if updateViewModel.isChecking {
|
||||
ProgressView()
|
||||
.scaleEffect(0.6)
|
||||
} else {
|
||||
Image(systemName: "square.and.arrow.down")
|
||||
}
|
||||
}
|
||||
.help("Check for Updates")
|
||||
}
|
||||
}
|
||||
.navigationTitle("Servers")
|
||||
.onChange(of: selectedServerID) {
|
||||
@@ -76,7 +90,9 @@ struct MainView: View {
|
||||
} else {
|
||||
ContentUnavailableView("No Server Selected", systemImage: "server.rack")
|
||||
}
|
||||
}
|
||||
}
|
||||
return mainContent
|
||||
.sheet(isPresented: $showAddServerSheet) {
|
||||
ServerFormView(
|
||||
mode: .add,
|
||||
@@ -128,9 +144,26 @@ struct MainView: View {
|
||||
pingTimer = Timer.scheduledTimer(withTimeInterval: 10.0, repeats: true) { _ in
|
||||
pingAllServers()
|
||||
}
|
||||
updateViewModel.startAutomaticCheckIfNeeded()
|
||||
}
|
||||
.frame(minWidth: 800, minHeight: 450)
|
||||
|
||||
.alert(item: availableReleaseBinding) { release in
|
||||
Alert(
|
||||
title: Text("Update Available"),
|
||||
message: Text("iKeyMon \(release.versionString) is available."),
|
||||
primaryButton: .default(Text("Download")) {
|
||||
updateViewModel.downloadLatest()
|
||||
},
|
||||
secondaryButton: .cancel(Text("Later"))
|
||||
)
|
||||
}
|
||||
.alert(item: statusAlertBinding) { alert in
|
||||
Alert(
|
||||
title: Text(alert.title),
|
||||
message: Text(alert.message),
|
||||
dismissButton: .default(Text("OK"))
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
private func fetchServerInfo(for id: UUID) {
|
||||
@@ -257,8 +290,23 @@ struct MainView: View {
|
||||
return []
|
||||
}
|
||||
}
|
||||
|
||||
private var availableReleaseBinding: Binding<ReleaseInfo?> {
|
||||
Binding(
|
||||
get: { updateViewModel.availableRelease },
|
||||
set: { updateViewModel.availableRelease = $0 }
|
||||
)
|
||||
}
|
||||
|
||||
private var statusAlertBinding: Binding<UpdateViewModel.StatusAlert?> {
|
||||
Binding(
|
||||
get: { updateViewModel.statusAlert },
|
||||
set: { updateViewModel.statusAlert = $0 }
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
#Preview {
|
||||
MainView()
|
||||
.environmentObject(UpdateViewModel())
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user