import Foundation import Network // MARK: - NetworkMonitor // Monitors network connectivity. Inject as an environment object for offline UI. @MainActor final class NetworkMonitor: ObservableObject { static let shared = NetworkMonitor() @Published var isConnected: Bool = true @Published var connectionType: NWInterface.InterfaceType? private let monitor = NWPathMonitor() private let queue = DispatchQueue(label: "cc.kalekber.libnovel.v2.network-monitor") init() { monitor.pathUpdateHandler = { [weak self] path in Task { @MainActor [weak self] in self?.isConnected = path.status == .satisfied self?.connectionType = path.availableInterfaces.first?.type } } monitor.start(queue: queue) } deinit { monitor.cancel() } } extension NWInterface.InterfaceType { var displayName: String { switch self { case .wifi: return "Wi-Fi" case .cellular: return "Cellular" case .wiredEthernet: return "Ethernet" case .loopback: return "Loopback" case .other: return "Other" @unknown default: return "Unknown" } } }