All checks were successful
CI / Scraper / Lint (push) Successful in 10s
CI / Scraper / Test (push) Successful in 14s
Release / Scraper / Test (push) Successful in 18s
CI / Scraper / Lint (pull_request) Successful in 18s
Release / UI / Build (push) Successful in 23s
CI / Scraper / Test (pull_request) Successful in 15s
CI / UI / Build (pull_request) Successful in 32s
Release / Scraper / Docker (push) Successful in 55s
CI / Scraper / Docker Push (pull_request) Has been skipped
CI / UI / Docker Push (pull_request) Has been skipped
CI / Scraper / Docker Push (push) Successful in 1m5s
Release / UI / Docker (push) Successful in 1m12s
iOS CI / Build (push) Successful in 4m18s
iOS CI / Build (pull_request) Successful in 4m25s
iOS CI / Test (push) Successful in 8m11s
iOS CI / Test (pull_request) Successful in 8m21s
44 lines
1.2 KiB
Swift
44 lines
1.2 KiB
Swift
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"
|
|
}
|
|
}
|
|
}
|