- HTTPClient: replace isRefreshing bool with shared Task to safely
coalesce concurrent 401 refresh attempts; surface JSON serialization
error instead of silently dropping request body
- AuthService.logout: always clear Keychain tokens via defer, even when
refresh token is absent, preventing stale access token
- NotificationsAPIService: remove updateAppBadge (UIKit call moved to
@MainActor NotificationsViewModel); drop unused UIKit import
- NotificationsViewModel: guard startPolling() against duplicate tasks;
update badge directly on @MainActor instead of hopping to actor
- VerifyEmailView: replace Timer (never invalidated) with async Task
cancelled in .onDisappear
- NotificationsView: use Text(date, style: .relative) — auto-updates
without custom formatter; remove duplicate Date extension
- SettingsView: handle logoutAll errors explicitly with alert instead of
silently proceeding with local logout
- MaydayLiveActivity/Info.plist: add NSExtensionPrincipalClass so the
widget extension is discoverable by the system
- Live Activity widget: replace frozen duration(from:) with
Text(date, style: .timer); replace frozen relativeFormatted with
Text(date, style: .relative); localize status badge to Russian
Co-authored-by: robonen <26167508+robonen@users.noreply.github.com>
- SettingsView: replace broken Toggle+constant with a Button that directly
opens system notification settings (Toggle was bound to .constant(true)
and onChange never fired)
- HTTPClient: append query parameters to URL for GET requests instead of
putting them in the request body (body is ignored for GET)
- PushNotificationService: document why info-severity alerts skip Live Activities
- NotificationsViewModel: document polling page-reset behavior
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>