The main fix: CachingOutlineAPIClient.cachedFetch (documentInfo, listCollections, listDocuments, etc.) never actually checked manual Offline Mode — only the write path did. With a real connection still up, turning Offline Mode on did nothing for reads: the sidebar kept fetching live, showing collections/documents beyond what was actually cached. Reads now skip `live` entirely under manual offline mode, same as writes already did — the sidebar and document lists are now genuinely limited to whatever's cached, and only those documents are openable, once the toggle is on. 1 new regression test (54/54). Settings: removed the cache-size readout from Offline & Sync (storage management is Advanced-only now, per the "one place that can touch the cache" design) and added it next to Advanced's Clear All Cache instead, where it was missing. Sidebar: replaced the old passive "Offline — showing cached content" banner for a real dropped connection with an actionable prompt (OfflineConnectionPromptBanner, styled like the existing RemoteChangesBanner) offering to turn Offline Mode on — doesn't change any behavior on its own, same as RemoteChangesBanner never auto- refreshes. The informational banner still shows once Offline Mode is actually on (manually, or via this prompt).
31 lines
1.1 KiB
Swift
31 lines
1.1 KiB
Swift
#if os(macOS)
|
|
import SwiftUI
|
|
|
|
/// Shown in the sidebar when the network is actually down and the user
|
|
/// hasn't turned on Offline Mode themselves yet. Deliberately doesn't change
|
|
/// any fetch behavior on its own — reads still try live and fall back to
|
|
/// cache the normal way (see `CachingOutlineAPIClient`) until the user
|
|
/// actually taps the button here, same as `RemoteChangesBanner` never
|
|
/// auto-refreshes on their behalf either.
|
|
struct OfflineConnectionPromptBanner: View {
|
|
let onEnableOfflineMode: () -> Void
|
|
|
|
var body: some View {
|
|
HStack(spacing: 8) {
|
|
Image(systemName: "wifi.slash")
|
|
.foregroundStyle(.orange)
|
|
Text("No connection")
|
|
.font(.callout)
|
|
Spacer(minLength: 8)
|
|
Button("Turn On Offline Mode", action: onEnableOfflineMode)
|
|
.buttonStyle(.borderedProminent)
|
|
.tint(.orange)
|
|
.controlSize(.small)
|
|
}
|
|
.padding(.horizontal, 12)
|
|
.padding(.vertical, 8)
|
|
.background(Color.orange.opacity(0.12))
|
|
}
|
|
}
|
|
#endif
|