import RastrilloNative import SwiftUI /// A thin inset bar shown while `origin` is offline. Entering the offline /// state is announced to assistive technologies; leaving it is not. /// /// Pass `summary` once the app's edits are kept in an `Outbox`: the banner /// then says they are saved on this device, which is only true from then on. public struct NativeOfflineBanner: View { private let connectivity: NativeConnectivity private let origin: URL private let message: String @MainActor public init(connectivity: NativeConnectivity? = nil, origin: URL, message: String? = nil) { self.connectivity = connectivity ?? .shared; self.origin = origin self.message = message ?? NativeSyncStrings.kit.offlineWaiting } /// The durable wording, for an app whose changes go through an outbox. @MainActor public init(connectivity: NativeConnectivity? = nil, origin: URL, summary: OutboxSummary, strings: NativeSyncStrings = .kit) { self.init(connectivity: connectivity, origin: origin, message: strings.offlineDurable) } public var body: some View { let offline = connectivity.isOffline(origin) Group { if offline { Label(message, systemImage: "wifi.slash") .font(.callout) .frame(maxWidth: .infinity) .padding(.horizontal, 12).padding(.vertical, 6) .background(.bar) .accessibilityElement(children: .combine) } } .onChange(of: offline) { _, now in if now { AccessibilityNotification.Announcement(message).post() } } } }