mirror of
https://github.com/vitorpamplona/amethyst.git
synced 2026-10-06 03:38:23 +00:00
The "Enable OS notifications" button still fails on macOS even after
e9475dd0 + the auto-enable follow-up, and the failure mode gives the
user nothing to act on:
1. Nucleus's requestAuthorization callback carries the OS error string
(UNErrorDomain), but the dispatcher discarded it ({ granted, _ -> })
and mapped every non-grant to PermissionState.Denied. The settings UI
then showed "Enable in System Settings → Notifications → Amethyst" —
a dead end when macOS refused the request outright ("Notifications
are not allowed for this application"), because a refused app never
gets a System Settings entry.
2. On recent macOS the permission prompt is an auto-dismissing banner.
If the user misses it, UNUserNotificationCenter may never invoke the
completion handler, leaving requestPermission()'s
suspendCancellableCoroutine parked forever and the UI stuck on
"Requesting…".
Fixes:
- requestPermission() now captures the OS error string and exposes it
via NotificationDispatcher.lastRequestError (new interface property,
null-defaulted so other implementations are unaffected).
- The request is wrapped in withTimeoutOrNull(90s); on timeout the
coroutine returns, the spinner clears, and lastRequestError tells the
user to watch for the banner and retry.
- The Denied branch of NotificationSettingsScreen gains an "Ask again"
button (re-request re-surfaces the banner) and both branches render
the raw OS error when one is present.
- sendMac() now uses Nucleus's add(request, callback) overload and
reports SendResult.Failed with the OS error instead of unconditionally
returning Delivered for a request the notification center may have
rejected. Timeout without an ack still counts as delivered (the
request was queued).
Reproduced the hang + the silent-error path on macOS 26.4 with a
minimal Nucleus harness: first requestAuthorization call from a
freshly-installed bundle never fired its callback (30s timeout),
subsequent calls returned granted=false with "Notifications are not
allowed for this application" — neither observable from the Amethyst
UI before this change.