Add tests for PrinterRequestManager , remove singleton implementation in favor of view constructor arguments
This commit is contained in:
		@@ -9,7 +9,7 @@ import SwiftUI
 | 
			
		||||
import Network
 | 
			
		||||
 | 
			
		||||
struct PrinterConfigView: View {
 | 
			
		||||
    @ObservedObject var printerManager = PrinterRequestManager.shared
 | 
			
		||||
    @ObservedObject var printerManager: PrinterRequestManager
 | 
			
		||||
    
 | 
			
		||||
    var body: some View {
 | 
			
		||||
        VStack {
 | 
			
		||||
@@ -52,8 +52,10 @@ struct PrinterConfigView: View {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct PrinterConfigView_Previews: PreviewProvider {
 | 
			
		||||
    @State static var printerManager = PrinterRequestManager()
 | 
			
		||||
    
 | 
			
		||||
    static var previews: some View {
 | 
			
		||||
        PrinterConfigView()
 | 
			
		||||
        PrinterConfigView(printerManager: printerManager)
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -7,6 +7,7 @@
 | 
			
		||||
 | 
			
		||||
import Foundation
 | 
			
		||||
import Network
 | 
			
		||||
import AppKit
 | 
			
		||||
import Starscream
 | 
			
		||||
 | 
			
		||||
// MARK: Bonjour Protocol
 | 
			
		||||
@@ -17,13 +18,22 @@ protocol NetworkDiscoveryEngine {
 | 
			
		||||
    func setStateUpdateHandler(_ handler: @escaping ((NWBrowser.State) -> Void))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//protocol NDEResult {
 | 
			
		||||
//    var endpoint: NWEndpoint { get }
 | 
			
		||||
//    var interface: [NWInterface] { get }
 | 
			
		||||
//    var metadata: NWBrowser.Result.Metadata { get }
 | 
			
		||||
//}
 | 
			
		||||
 | 
			
		||||
extension NWBrowser: NetworkDiscoveryEngine {
 | 
			
		||||
//class NDEngine: NetworkDiscoveryEngine,
 | 
			
		||||
    func startScan(queue: DispatchQueue) {
 | 
			
		||||
        start(queue: queue)
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    func setBrowseResultsChangedHandler(_ handler: @escaping ((Set<NWBrowser.Result>, Set<NWBrowser.Result.Change>) -> Void)) {
 | 
			
		||||
        self.browseResultsChangedHandler = handler
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    func setStateUpdateHandler(_ handler: @escaping ((State) -> Void)) {
 | 
			
		||||
        self.stateUpdateHandler = handler
 | 
			
		||||
    }
 | 
			
		||||
@@ -50,8 +60,6 @@ struct JsonRpcRequest: Codable {
 | 
			
		||||
class PrinterRequestManager: ObservableObject, WebSocketDelegate {
 | 
			
		||||
    let WEBSOCKET_TIMEOUT_INTERVAL: TimeInterval = 60.0
 | 
			
		||||
    
 | 
			
		||||
    static let shared = PrinterRequestManager()
 | 
			
		||||
    
 | 
			
		||||
    // Debug stuff
 | 
			
		||||
    let startDate = Date()
 | 
			
		||||
    let startDateString: String
 | 
			
		||||
@@ -96,8 +104,6 @@ class PrinterRequestManager: ObservableObject, WebSocketDelegate {
 | 
			
		||||
    var socket: WebSocket?
 | 
			
		||||
    var lastPingDate = Date()
 | 
			
		||||
    
 | 
			
		||||
    // TODO: Set this up to actually reconnect
 | 
			
		||||
    
 | 
			
		||||
    // Parse a JSON-RPC query-response message
 | 
			
		||||
    func parse_response(_ response: jsonRpcResponse) {
 | 
			
		||||
        state = response.result.status.print_stats?.state ?? ""
 | 
			
		||||
@@ -124,7 +130,7 @@ class PrinterRequestManager: ObservableObject, WebSocketDelegate {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    private init(browser: NetworkDiscoveryEngine = NWBrowser(for: .bonjourWithTXTRecord(type: "_moonraker._tcp", domain: "local."), using: .tcp)) {
 | 
			
		||||
    init(browser: NetworkDiscoveryEngine = NWBrowser(for: .bonjourWithTXTRecord(type: "_moonraker._tcp", domain: "local."), using: .tcp)) {
 | 
			
		||||
        state = ""
 | 
			
		||||
        progress = 0.0
 | 
			
		||||
        extruderTemperature = 0.0
 | 
			
		||||
@@ -167,6 +173,38 @@ class PrinterRequestManager: ObservableObject, WebSocketDelegate {
 | 
			
		||||
        })
 | 
			
		||||
        // Start up the bonjour browser, get results and process them in the update handler
 | 
			
		||||
        nwBrowser.startScan(queue: DispatchQueue.main)
 | 
			
		||||
        
 | 
			
		||||
        // Screen sleep functionality
 | 
			
		||||
//        NSWorkspace.shared.notificationCenter.addObserver(self, selector: #selector(screenDidSleep(_:)), name: NSWorkspace.screensDidSleepNotification, object: nil)
 | 
			
		||||
//        NSWorkspace.shared.notificationCenter.addObserver(self, selector: #selector(screenDidWake(_:)), name: NSWorkspace.screensDidWakeNotification, object: nil)
 | 
			
		||||
        let center = NSWorkspace.shared.notificationCenter;
 | 
			
		||||
        let mainQueue = OperationQueue.main
 | 
			
		||||
        
 | 
			
		||||
        center.addObserver(forName: NSWorkspace.screensDidWakeNotification, object: nil, queue: mainQueue) { notification in
 | 
			
		||||
            self.screenChangedSleepState(notification)
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        center.addObserver(forName: NSWorkspace.screensDidSleepNotification, object: nil, queue: mainQueue) { notification in
 | 
			
		||||
            self.screenChangedSleepState(notification)
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    func screenChangedSleepState(_ notification: Notification) {
 | 
			
		||||
        switch(notification.name) {
 | 
			
		||||
        case NSWorkspace.screensDidSleepNotification:
 | 
			
		||||
            socket?.disconnect()
 | 
			
		||||
        case NSWorkspace.screensDidWakeNotification:
 | 
			
		||||
            self.openWebsocket()
 | 
			
		||||
        default:
 | 
			
		||||
            return
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    func screenDidWake(_ notification: Notification) {
 | 
			
		||||
        print("Screen woke: \(notification.name)")
 | 
			
		||||
        if socket != nil {
 | 
			
		||||
            self.openWebsocket()
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    // Called from the UI with an endpoint.
 | 
			
		||||
 
 | 
			
		||||
@@ -13,6 +13,8 @@ struct SoyuzApp: App {
 | 
			
		||||
    
 | 
			
		||||
    @State var currentIcon = "move.3d"
 | 
			
		||||
    
 | 
			
		||||
    @ObservedObject var printerManager = PrinterRequestManager()
 | 
			
		||||
    
 | 
			
		||||
    var body: some Scene {
 | 
			
		||||
//        WindowGroup(id: "floating-stats") {
 | 
			
		||||
//            KlipperMonMenuBarExtraView(currentMenuBarIcon: $currentIcon)
 | 
			
		||||
@@ -20,13 +22,13 @@ struct SoyuzApp: App {
 | 
			
		||||
//        }
 | 
			
		||||
        
 | 
			
		||||
        WindowGroup("Configuration", id: "soyuz_cfg", content: {
 | 
			
		||||
            PrinterConfigView()
 | 
			
		||||
            PrinterConfigView(printerManager: printerManager)
 | 
			
		||||
                //.frame(minWidth: 300, maxWidth: 600, minHeight: 60, maxHeight: 100)
 | 
			
		||||
        })
 | 
			
		||||
        .windowResizability(.contentSize)
 | 
			
		||||
        
 | 
			
		||||
        MenuBarExtra("Soyuz", systemImage: currentIcon) {
 | 
			
		||||
            SoyuzMenuBarExtraView(currentMenuBarIcon: $currentIcon)
 | 
			
		||||
            SoyuzMenuBarExtraView(printerManager: printerManager, currentMenuBarIcon: $currentIcon)
 | 
			
		||||
                .padding([.top, .leading, .trailing], 8)
 | 
			
		||||
                .padding([.bottom], 6)
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -15,7 +15,7 @@ struct SoyuzMenuBarExtraView: View {
 | 
			
		||||
    
 | 
			
		||||
    @Environment(\.openWindow) var openWindow
 | 
			
		||||
    
 | 
			
		||||
    @ObservedObject var printerManager = PrinterRequestManager.shared
 | 
			
		||||
    @ObservedObject var printerManager: PrinterRequestManager
 | 
			
		||||
    
 | 
			
		||||
    @State var printPercentage: Double = 0
 | 
			
		||||
    
 | 
			
		||||
@@ -100,8 +100,10 @@ struct SoyuzMenuBarExtraView: View {
 | 
			
		||||
 | 
			
		||||
struct KlipperMonMenuBarExtraView_Previews: PreviewProvider {
 | 
			
		||||
    @State static var currentMenuBarIcon = "move.3d"
 | 
			
		||||
    @State static var printerManager = PrinterRequestManager()
 | 
			
		||||
    
 | 
			
		||||
    static var previews: some View {
 | 
			
		||||
        SoyuzMenuBarExtraView(currentMenuBarIcon: $currentMenuBarIcon)
 | 
			
		||||
        SoyuzMenuBarExtraView(printerManager: printerManager, currentMenuBarIcon: $currentMenuBarIcon)
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user