Let a hidden iCal calendar become visible again

An iCal subscription could be banished but never un-banished. The server has
always sent and accepted sidebar_hidden for subscriptions, but iOS left the
field off ICalSubscription entirely and omitted "ical" from
serverManagedSources, from setCalendarSidebarHidden and from both places that
reconcile the server's flag. So the key went into banishedCalendarKeys and
nothing ever took it out: refreshFromCache filters on that set as well as on
hiddenCalendarKeys, which is why showing the calendar again left its events
invisible and no amount of syncing helped. Closed on all four sides.

The account models are also no longer brittle about absent fields.
HomeAssistantAccount required auth_method, and CalDAVCalendar and
GoogleCalendar required sidebar_hidden, with no custom decoder — one missing
key threw, the `try?` at the call site turned that into an empty list, and the
reconciliation silently did not run, stranding calendars as banished in exactly
the same way. HACalendar already carried a lenient decoder for this reason; the
other three now do too.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-10-19 05:54:05 +02:00
co-authored by Claude Opus 5
parent ab0c64a9e1
commit 9f864617c2
4 changed files with 50 additions and 2 deletions
+4 -2
View File
@@ -287,7 +287,8 @@ class CalendarStore {
async let c = (try? await api.getCalDAVAccounts()) ?? []
async let g = (try? await api.getGoogleAccounts()) ?? []
async let h = (try? await api.getHomeAssistantAccounts()) ?? []
let (caldav, google, ha) = await (c, g, h)
async let i = (try? await api.getICalSubscriptions()) ?? []
let (caldav, google, ha, ical) = await (c, g, h, i)
var b = banishedCalendarKeys
func applyServerHidden(_ source: String, _ id: Int, _ hidden: Bool) {
@@ -297,6 +298,7 @@ class CalendarStore {
for acc in caldav { for cal in acc.calendars ?? [] { applyServerHidden("caldav", cal.id, cal.sidebarHidden) } }
for acc in google { for cal in acc.calendars ?? [] { applyServerHidden("google", cal.id, cal.sidebarHidden) } }
for acc in ha { for cal in acc.calendars ?? [] { applyServerHidden("homeassistant", cal.id, cal.sidebarHidden) } }
for sub in ical { applyServerHidden("ical", sub.id, sub.sidebarHidden) }
guard b != banishedCalendarKeys else { return false }
banishedCalendarKeys = b
@@ -350,7 +352,7 @@ class CalendarStore {
}
/// Sources whose visibility is backed by the server's `sidebar_hidden`.
static let serverManagedSources: Set<String> = ["caldav", "google", "homeassistant"]
static let serverManagedSources: Set<String> = ["caldav", "google", "homeassistant", "ical"]
var userCalendar: Calendar {
var cal = Calendar.current