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:
co-authored by
Claude Opus 5
parent
ab0c64a9e1
commit
9f864617c2
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user