macos: Sparkle notFound acknowledgement should only be called on dismiss (#9126)

This was causing the "no update found" message to never really appear in
the real world.
This commit is contained in:
Mitchell Hashimoto
2025-10-10 09:30:12 -07:00
committed by GitHub
parent 2bf9c777d7
commit 207eccffda
5 changed files with 19 additions and 9 deletions

View File

@@ -73,12 +73,10 @@ class UpdateDriver: NSObject, SPUUserDriver {
func showUpdateNotFoundWithError(_ error: any Error,
acknowledgement: @escaping () -> Void) {
viewModel.state = .notFound
viewModel.state = .notFound(.init(acknowledgement: acknowledgement))
if !hasUnobtrusiveTarget {
standard.showUpdateNotFoundWithError(error, acknowledgement: acknowledgement)
} else {
acknowledgement()
}
}

View File

@@ -23,11 +23,12 @@ struct UpdatePill: View {
.transition(.opacity.combined(with: .scale(scale: 0.95)))
.onChange(of: model.state) { newState in
resetTask?.cancel()
if case .notFound = newState {
if case .notFound(let notFound) = newState {
resetTask = Task { [weak model] in
try? await Task.sleep(for: .seconds(5))
guard !Task.isCancelled, case .notFound? = model?.state else { return }
model?.state = .idle
notFound.acknowledgement()
}
} else {
resetTask = nil
@@ -40,8 +41,9 @@ struct UpdatePill: View {
@ViewBuilder
private var pillButton: some View {
Button(action: {
if case .notFound = model.state {
if case .notFound(let notFound) = model.state {
model.state = .idle
notFound.acknowledgement()
} else {
showPopover.toggle()
}

View File

@@ -41,8 +41,8 @@ struct UpdatePopoverView: View {
case .installing:
InstallingView()
case .notFound:
NotFoundView(dismiss: dismiss)
case .notFound(let notFound):
NotFoundView(notFound: notFound, dismiss: dismiss)
case .error(let error):
UpdateErrorView(error: error, dismiss: dismiss)
@@ -331,6 +331,7 @@ fileprivate struct InstallingView: View {
}
fileprivate struct NotFoundView: View {
let notFound: UpdateState.NotFound
let dismiss: DismissAction
var body: some View {
@@ -348,6 +349,7 @@ fileprivate struct NotFoundView: View {
HStack {
Spacer()
Button("OK") {
notFound.acknowledgement()
dismiss()
}
.keyboardShortcut(.defaultAction)

View File

@@ -72,7 +72,9 @@ enum UpdateSimulator {
}))
DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
viewModel.state = .notFound
viewModel.state = .notFound(.init(acknowledgement: {
// Acknowledgement called when dismissed
}))
DispatchQueue.main.asyncAfter(deadline: .now() + 3.0) {
viewModel.state = .idle

View File

@@ -135,7 +135,7 @@ enum UpdateState: Equatable {
case permissionRequest(PermissionRequest)
case checking(Checking)
case updateAvailable(UpdateAvailable)
case notFound
case notFound(NotFound)
case error(Error)
case downloading(Downloading)
case extracting(Extracting)
@@ -157,6 +157,8 @@ enum UpdateState: Equatable {
downloading.cancel()
case .readyToInstall(let ready):
ready.reply(.dismiss)
case .notFound(let notFound):
notFound.acknowledgement()
case .error(let err):
err.dismiss()
default:
@@ -191,6 +193,10 @@ enum UpdateState: Equatable {
}
}
struct NotFound {
let acknowledgement: () -> Void
}
struct PermissionRequest {
let request: SPUUpdatePermissionRequest
let reply: @Sendable (SUUpdatePermissionResponse) -> Void