Notifications and UI color scheme update
This commit is contained in:
		@@ -7,6 +7,7 @@
 | 
			
		||||
	objects = {
 | 
			
		||||
 | 
			
		||||
/* Begin PBXBuildFile section */
 | 
			
		||||
		C15B60A82A2423760052F712 /* UserNotificationHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = C15B60A72A2423760052F712 /* UserNotificationHandler.swift */; };
 | 
			
		||||
		C15F06A62A20198300C14CD8 /* Soyuz.help in Resources */ = {isa = PBXBuildFile; fileRef = C15F06A42A20171E00C14CD8 /* Soyuz.help */; };
 | 
			
		||||
		E124B9D929941A4D00C0D2D2 /* PrinterConfigView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E124B9D829941A4D00C0D2D2 /* PrinterConfigView.swift */; };
 | 
			
		||||
		E16378B429A491E6002F05E9 /* MoonrakerSocketManagerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = E16378B329A491E6002F05E9 /* MoonrakerSocketManagerTests.swift */; };
 | 
			
		||||
@@ -44,6 +45,7 @@
 | 
			
		||||
/* End PBXContainerItemProxy section */
 | 
			
		||||
 | 
			
		||||
/* Begin PBXFileReference section */
 | 
			
		||||
		C15B60A72A2423760052F712 /* UserNotificationHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserNotificationHandler.swift; sourceTree = "<group>"; };
 | 
			
		||||
		C15F06A42A20171E00C14CD8 /* Soyuz.help */ = {isa = PBXFileReference; lastKnownFileType = wrapper; path = Soyuz.help; sourceTree = "<group>"; };
 | 
			
		||||
		E124B9D72993FE5500C0D2D2 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = "<group>"; };
 | 
			
		||||
		E124B9D829941A4D00C0D2D2 /* PrinterConfigView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrinterConfigView.swift; sourceTree = "<group>"; };
 | 
			
		||||
@@ -172,6 +174,7 @@
 | 
			
		||||
				E180B61C2992D53700425DB0 /* PrinterObjectsQuery.swift */,
 | 
			
		||||
				E180B6212993256E00425DB0 /* MoonrakerSocketManager.swift */,
 | 
			
		||||
				E1A93C6629C932E200BAE750 /* BonjourBrowser.swift */,
 | 
			
		||||
				C15B60A72A2423760052F712 /* UserNotificationHandler.swift */,
 | 
			
		||||
			);
 | 
			
		||||
			path = ViewModels;
 | 
			
		||||
			sourceTree = "<group>";
 | 
			
		||||
@@ -317,6 +320,7 @@
 | 
			
		||||
				E180B5F52992CD9200425DB0 /* KlipperMon.xcdatamodeld in Sources */,
 | 
			
		||||
				E124B9D929941A4D00C0D2D2 /* PrinterConfigView.swift in Sources */,
 | 
			
		||||
				E180B5F22992CD9200425DB0 /* Persistence.swift in Sources */,
 | 
			
		||||
				C15B60A82A2423760052F712 /* UserNotificationHandler.swift in Sources */,
 | 
			
		||||
				E1A93C6729C932E200BAE750 /* BonjourBrowser.swift in Sources */,
 | 
			
		||||
				E180B5E92992CD9100425DB0 /* SoyuzApp.swift in Sources */,
 | 
			
		||||
				E180B6222993256E00425DB0 /* MoonrakerSocketManager.swift in Sources */,
 | 
			
		||||
@@ -477,17 +481,19 @@
 | 
			
		||||
			buildSettings = {
 | 
			
		||||
				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
 | 
			
		||||
				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
 | 
			
		||||
				ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES;
 | 
			
		||||
				CODE_SIGN_ENTITLEMENTS = Soyuz/Soyuz.entitlements;
 | 
			
		||||
				"CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development";
 | 
			
		||||
				CODE_SIGN_STYLE = Automatic;
 | 
			
		||||
				COMBINE_HIDPI_IMAGES = YES;
 | 
			
		||||
				CURRENT_PROJECT_VERSION = 1;
 | 
			
		||||
				CURRENT_PROJECT_VERSION = 6;
 | 
			
		||||
				DEVELOPMENT_ASSET_PATHS = "Soyuz/Preview\\ Content";
 | 
			
		||||
				DEVELOPMENT_TEAM = W9ASV855X5;
 | 
			
		||||
				ENABLE_HARDENED_RUNTIME = YES;
 | 
			
		||||
				ENABLE_PREVIEWS = YES;
 | 
			
		||||
				GENERATE_INFOPLIST_FILE = YES;
 | 
			
		||||
				INFOPLIST_FILE = Soyuz/Info.plist;
 | 
			
		||||
				INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities";
 | 
			
		||||
				INFOPLIST_KEY_LSUIElement = NO;
 | 
			
		||||
				INFOPLIST_KEY_NSHumanReadableCopyright = "";
 | 
			
		||||
				LD_RUNPATH_SEARCH_PATHS = (
 | 
			
		||||
@@ -507,17 +513,19 @@
 | 
			
		||||
			buildSettings = {
 | 
			
		||||
				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
 | 
			
		||||
				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
 | 
			
		||||
				ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES;
 | 
			
		||||
				CODE_SIGN_ENTITLEMENTS = Soyuz/Soyuz.entitlements;
 | 
			
		||||
				"CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development";
 | 
			
		||||
				CODE_SIGN_STYLE = Automatic;
 | 
			
		||||
				COMBINE_HIDPI_IMAGES = YES;
 | 
			
		||||
				CURRENT_PROJECT_VERSION = 1;
 | 
			
		||||
				CURRENT_PROJECT_VERSION = 6;
 | 
			
		||||
				DEVELOPMENT_ASSET_PATHS = "Soyuz/Preview\\ Content";
 | 
			
		||||
				DEVELOPMENT_TEAM = W9ASV855X5;
 | 
			
		||||
				ENABLE_HARDENED_RUNTIME = YES;
 | 
			
		||||
				ENABLE_PREVIEWS = YES;
 | 
			
		||||
				GENERATE_INFOPLIST_FILE = YES;
 | 
			
		||||
				INFOPLIST_FILE = Soyuz/Info.plist;
 | 
			
		||||
				INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities";
 | 
			
		||||
				INFOPLIST_KEY_LSUIElement = NO;
 | 
			
		||||
				INFOPLIST_KEY_NSHumanReadableCopyright = "";
 | 
			
		||||
				LD_RUNPATH_SEARCH_PATHS = (
 | 
			
		||||
 
 | 
			
		||||
@@ -10,5 +10,23 @@
 | 
			
		||||
			<integer>0</integer>
 | 
			
		||||
		</dict>
 | 
			
		||||
	</dict>
 | 
			
		||||
	<key>SuppressBuildableAutocreation</key>
 | 
			
		||||
	<dict>
 | 
			
		||||
		<key>E180B5E42992CD9100425DB0</key>
 | 
			
		||||
		<dict>
 | 
			
		||||
			<key>primary</key>
 | 
			
		||||
			<true/>
 | 
			
		||||
		</dict>
 | 
			
		||||
		<key>E180B5FA2992CD9300425DB0</key>
 | 
			
		||||
		<dict>
 | 
			
		||||
			<key>primary</key>
 | 
			
		||||
			<true/>
 | 
			
		||||
		</dict>
 | 
			
		||||
		<key>E180B6042992CD9300425DB0</key>
 | 
			
		||||
		<dict>
 | 
			
		||||
			<key>primary</key>
 | 
			
		||||
			<true/>
 | 
			
		||||
		</dict>
 | 
			
		||||
	</dict>
 | 
			
		||||
</dict>
 | 
			
		||||
</plist>
 | 
			
		||||
 
 | 
			
		||||
@@ -2,6 +2,8 @@
 | 
			
		||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
 | 
			
		||||
<plist version="1.0">
 | 
			
		||||
<dict>
 | 
			
		||||
	<key>ITSAppUsesNonExemptEncryption</key>
 | 
			
		||||
	<false/>
 | 
			
		||||
	<key>CFBundleHelpBookFolder</key>
 | 
			
		||||
	<string>Soyuz.help</string>
 | 
			
		||||
	<key>CFBundleHelpBookName</key>
 | 
			
		||||
 
 | 
			
		||||
@@ -29,6 +29,8 @@ class MoonrakerSocketManager: ObservableObject, WebSocketDelegate {
 | 
			
		||||
    @Published var connection: NWConnection?
 | 
			
		||||
    @Published var friendlyHostname: String = ""
 | 
			
		||||
    
 | 
			
		||||
    var notification = UserNotificationHandler.shared
 | 
			
		||||
    
 | 
			
		||||
    private var socket: WebSocket?
 | 
			
		||||
    private var lastPingDate = Date()
 | 
			
		||||
    private var starscreamEngine: Engine
 | 
			
		||||
@@ -67,11 +69,11 @@ class MoonrakerSocketManager: ObservableObject, WebSocketDelegate {
 | 
			
		||||
            print("\(key): \(value)")
 | 
			
		||||
        })
 | 
			
		||||
        
 | 
			
		||||
//        if isConnected == true {
 | 
			
		||||
//            connection?.cancel()
 | 
			
		||||
//            socket?.disconnect()
 | 
			
		||||
//        }
 | 
			
		||||
//
 | 
			
		||||
        //        if isConnected == true {
 | 
			
		||||
        //            connection?.cancel()
 | 
			
		||||
        //            socket?.disconnect()
 | 
			
		||||
        //        }
 | 
			
		||||
        //
 | 
			
		||||
        if connection == nil {
 | 
			
		||||
            connection = NWConnection(to: endpoint, using: .tcp)
 | 
			
		||||
        }
 | 
			
		||||
@@ -95,7 +97,7 @@ class MoonrakerSocketManager: ObservableObject, WebSocketDelegate {
 | 
			
		||||
                    connection?.cancel()
 | 
			
		||||
                    
 | 
			
		||||
                    DispatchQueue.main.async {
 | 
			
		||||
                        friendlyHostname = endpoint.toFriendlyString()
 | 
			
		||||
                        self.friendlyHostname = endpoint.toFriendlyString()
 | 
			
		||||
                        self.socketHost = sanitizedHost
 | 
			
		||||
                        self.socketPort = "\(port)"
 | 
			
		||||
                        self.openWebsocket()
 | 
			
		||||
@@ -221,16 +223,22 @@ class MoonrakerSocketManager: ObservableObject, WebSocketDelegate {
 | 
			
		||||
    // Parse a JSON-RPC query-response message
 | 
			
		||||
    func parse_response(_ response: jsonRpcResponse) {
 | 
			
		||||
        state = response.result.status.print_stats?.state ?? ""
 | 
			
		||||
        
 | 
			
		||||
        
 | 
			
		||||
        progress = response.result.status.virtual_sdcard?.progress ?? 0.0
 | 
			
		||||
        extruderTemperature = response.result.status.extruder?.temperature ?? 0.0
 | 
			
		||||
        bedTemperature = response.result.status.heater_bed?.temperature ?? 0.0
 | 
			
		||||
        
 | 
			
		||||
        print(response)
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    // Parse a JSON-RPC update message
 | 
			
		||||
    func parse_update(_ update: jsonRpcUpdate) {
 | 
			
		||||
        if let newState = update.params.status?.print_stats?.state {
 | 
			
		||||
            print("Printer state: \(newState)")
 | 
			
		||||
            // Issue a notification when state changes from printing to complete
 | 
			
		||||
            // TODO: Handle this better
 | 
			
		||||
            if newState == "complete" && state == "printing" {
 | 
			
		||||
                notification.sendNotification(.printComplete)
 | 
			
		||||
            }
 | 
			
		||||
            state = newState
 | 
			
		||||
        }
 | 
			
		||||
        if let newProgress = update.params.status?.virtual_sdcard?.progress  {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										42
									
								
								Soyuz/ViewModels/UserNotificationHandler.swift
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								Soyuz/ViewModels/UserNotificationHandler.swift
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,42 @@
 | 
			
		||||
//
 | 
			
		||||
//  UserNotificationProtocol.swift
 | 
			
		||||
//  Soyuz
 | 
			
		||||
//
 | 
			
		||||
//  Created by Madeline Pace on 5/28/23.
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
import UserNotifications
 | 
			
		||||
 | 
			
		||||
class UserNotificationHandler {
 | 
			
		||||
    static var shared = UserNotificationHandler()
 | 
			
		||||
    
 | 
			
		||||
    private var center = UNUserNotificationCenter.current()
 | 
			
		||||
    
 | 
			
		||||
    enum NotificationType {
 | 
			
		||||
        case printComplete
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    private init() {
 | 
			
		||||
        center.requestAuthorization(options: [.alert, .sound, .badge, .provisional]) { granted, error in
 | 
			
		||||
            if let error = error {
 | 
			
		||||
                print("Error requesting authorization: \(error)")
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    func sendNotification(_ type: NotificationType) {
 | 
			
		||||
        print("Sending notification.")
 | 
			
		||||
        // Build notification request
 | 
			
		||||
        let content = UNMutableNotificationContent()
 | 
			
		||||
        // TODO: Replace this with localized strings
 | 
			
		||||
        content.title = "Print Complete! 🎉"
 | 
			
		||||
        let request = UNNotificationRequest(identifier: "Print Finished", content: content, trigger: nil)
 | 
			
		||||
        
 | 
			
		||||
        // Dispatch notification to system
 | 
			
		||||
        center.add(request) { (error: Error?) in
 | 
			
		||||
            if let theError = error {
 | 
			
		||||
                print("Error: \(theError)")
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -6,6 +6,7 @@
 | 
			
		||||
//
 | 
			
		||||
 | 
			
		||||
import SwiftUI
 | 
			
		||||
import UserNotifications
 | 
			
		||||
import AppKit
 | 
			
		||||
import Network
 | 
			
		||||
 | 
			
		||||
@@ -21,6 +22,7 @@ struct SoyuzMenuBarExtraView: View {
 | 
			
		||||
    @State var printPercentage: Double = 0
 | 
			
		||||
    
 | 
			
		||||
    @Binding var currentMenuBarIcon: String
 | 
			
		||||
    var notification = UserNotificationHandler.shared
 | 
			
		||||
    
 | 
			
		||||
    @State var hotendHotTemp: Bool = false
 | 
			
		||||
    @State var bedHotTemp: Bool = false
 | 
			
		||||
@@ -53,7 +55,7 @@ struct SoyuzMenuBarExtraView: View {
 | 
			
		||||
                        // Hot-end temperature
 | 
			
		||||
                        HStack {
 | 
			
		||||
                            Image(systemName: "flame")
 | 
			
		||||
                                .foregroundColor( printerManager.extruderTemperature > DANGERTEMP ? .red : .white )
 | 
			
		||||
                                .foregroundColor( printerManager.extruderTemperature > DANGERTEMP ? .red : Color(nsColor: .labelColor))
 | 
			
		||||
                                .opacity( printerManager.extruderTemperature > DANGERTEMP ? 1.0 : 0.3 )
 | 
			
		||||
                            Text("Hotend")
 | 
			
		||||
                                .font(.headline)
 | 
			
		||||
@@ -63,7 +65,7 @@ struct SoyuzMenuBarExtraView: View {
 | 
			
		||||
                        // Bed temperature
 | 
			
		||||
                        HStack {
 | 
			
		||||
                            Image(systemName: "flame")
 | 
			
		||||
                                .foregroundColor( printerManager.bedTemperature > DANGERTEMP ? .red : .white )
 | 
			
		||||
                                .foregroundColor( printerManager.bedTemperature > DANGERTEMP ? .red : Color(nsColor: .labelColor) )
 | 
			
		||||
                                .opacity( printerManager.bedTemperature > DANGERTEMP ? 1.0 : 0.3 )
 | 
			
		||||
                            Text("Plate")
 | 
			
		||||
                                .font(.headline)
 | 
			
		||||
@@ -79,12 +81,18 @@ struct SoyuzMenuBarExtraView: View {
 | 
			
		||||
        // Footer information
 | 
			
		||||
        HStack {
 | 
			
		||||
            Button {
 | 
			
		||||
                print("Button pressed")
 | 
			
		||||
                openWindow(id: "soyuz_cfg")
 | 
			
		||||
            } label: {
 | 
			
		||||
                Text("Printers")
 | 
			
		||||
                    .foregroundColor(Color("ButtonForegroundColor"))
 | 
			
		||||
            }
 | 
			
		||||
            /* Debugging Stuff */
 | 
			
		||||
            Button {
 | 
			
		||||
                notification.sendNotification(.printComplete)
 | 
			
		||||
            } label: {
 | 
			
		||||
                Text("Notify")
 | 
			
		||||
            }
 | 
			
		||||
            /* Debugging Stuff */
 | 
			
		||||
            Spacer()
 | 
			
		||||
            if(printerManager.isConnected) {
 | 
			
		||||
                Image(systemName: "network")
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user