From 75ae0385292be9ccfe34a51ee760cf4b96a0035f Mon Sep 17 00:00:00 2001 From: Scarriffle Date: Tue, 20 Oct 2026 21:46:48 +0200 Subject: [PATCH] Reload after saving the way the manual button already does MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Saving ran loadEvents(force: true), which skips the isCached check but leaves the existing cache in place. The manual reload button clears the cache first, and that is the one that reliably shows a newly created Home Assistant event. Rather than keep reasoning about why bypassing the cache is not enough, saving now takes the path that demonstrably works — the only difference between the two was invalidateCache(). reloadVisible had no callers left and is gone. Co-Authored-By: Claude Opus 5 --- .../UserInterfaceState.xcuserstate | Bin 0 -> 10733 bytes .../xcschemes/xcschememanagement.plist | 6 +++--- .../Views/Calendar/CalendarHostView.swift | 11 +++-------- 3 files changed, 6 insertions(+), 11 deletions(-) create mode 100644 ios/Calendarr iOS.xcodeproj/project.xcworkspace/xcuserdata/scarriffle.xcuserdatad/UserInterfaceState.xcuserstate diff --git a/ios/Calendarr iOS.xcodeproj/project.xcworkspace/xcuserdata/scarriffle.xcuserdatad/UserInterfaceState.xcuserstate b/ios/Calendarr iOS.xcodeproj/project.xcworkspace/xcuserdata/scarriffle.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..5c63243c832111194425c280fa78f78b7ef98673 GIT binary patch literal 10733 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 DE)#g4 literal 0 HcmV?d00001 diff --git a/ios/Calendarr iOS.xcodeproj/xcuserdata/scarriffle.xcuserdatad/xcschemes/xcschememanagement.plist b/ios/Calendarr iOS.xcodeproj/xcuserdata/scarriffle.xcuserdatad/xcschemes/xcschememanagement.plist index d6bd252..468f6f8 100644 --- a/ios/Calendarr iOS.xcodeproj/xcuserdata/scarriffle.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/ios/Calendarr iOS.xcodeproj/xcuserdata/scarriffle.xcuserdatad/xcschemes/xcschememanagement.plist @@ -17,12 +17,12 @@ CalendarrWatch.xcscheme_^#shared#^_ orderHint - 2 + 1 CalendarrWatchComplications.xcscheme_^#shared#^_ orderHint - 3 + 2 CalendarrWatchExtension.xcscheme_^#shared#^_ @@ -32,7 +32,7 @@ CalendarrWidgets.xcscheme_^#shared#^_ orderHint - 4 + 3 SuppressBuildableAutocreation diff --git a/ios/Calendarr iOS/Views/Calendar/CalendarHostView.swift b/ios/Calendarr iOS/Views/Calendar/CalendarHostView.swift index 6b11164..44d78ee 100644 --- a/ios/Calendarr iOS/Views/Calendar/CalendarHostView.swift +++ b/ios/Calendarr iOS/Views/Calendar/CalendarHostView.swift @@ -464,7 +464,9 @@ struct CalendarHostView: View { showNewBirthday: $showNewBirthday, api: api, reload: { await onNavigate() }, - reloadForce: { await reloadVisible(force: true) }) + // Same path as the manual reload button, which is the + // one that demonstrably shows a new Home Assistant event. + reloadForce: { await forceReload() }) } // MARK: – Loading logic @@ -525,13 +527,6 @@ struct CalendarHostView: View { await store.loadEvents(api: api, start: s, end: e) } - /// Re-fetch the visible range. With `force` it bypasses the cache so a just - /// created/edited event shows up immediately (the server is authoritative). - private func reloadVisible(force: Bool) async { - let (s, e) = store.rangeForCurrentView() - await store.loadEvents(api: api, start: s, end: e, force: force) - } - /// Called when cacheMonths setting changes – clear cache and re-prefetch. private func recache() async { store.invalidateCache()