using ElectronNET.API.Entities; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace ElectronNET.API { /// /// Create OS desktop notifications /// public sealed class Notification : ApiBase { protected override SocketTaskEventNameTypes SocketTaskEventNameType => SocketTaskEventNameTypes.NoDashUpperFirst; private static Notification _notification; private static object _syncRoot = new object(); internal Notification() { } internal static Notification Instance { get { if (_notification == null) { lock (_syncRoot) { if (_notification == null) { _notification = new Notification(); } } } return _notification; } } private static List _notificationOptions = new List(); /// /// Create OS desktop notifications /// /// public void Show(NotificationOptions notificationOptions) { GenerateIDsForDefinedActions(notificationOptions); BridgeConnector.Socket.Emit("createNotification", notificationOptions); } private static void GenerateIDsForDefinedActions(NotificationOptions notificationOptions) { bool isActionDefined = false; if (notificationOptions.OnShow != null) { notificationOptions.ShowID = Guid.NewGuid().ToString(); isActionDefined = true; BridgeConnector.Socket.Off("NotificationEventShow"); BridgeConnector.Socket.On("NotificationEventShow", (id) => { _notificationOptions.Single(x => x.ShowID == id).OnShow(); }); } if (notificationOptions.OnClick != null) { notificationOptions.ClickID = Guid.NewGuid().ToString(); isActionDefined = true; BridgeConnector.Socket.Off("NotificationEventClick"); BridgeConnector.Socket.On("NotificationEventClick", (id) => { _notificationOptions.Single(x => x.ClickID == id).OnClick(); }); } if (notificationOptions.OnClose != null) { notificationOptions.CloseID = Guid.NewGuid().ToString(); isActionDefined = true; BridgeConnector.Socket.Off("NotificationEventClose"); BridgeConnector.Socket.On("NotificationEventClose", (id) => { _notificationOptions.Single(x => x.CloseID == id).OnClose(); }); } if (notificationOptions.OnReply != null) { notificationOptions.ReplyID = Guid.NewGuid().ToString(); isActionDefined = true; BridgeConnector.Socket.Off("NotificationEventReply"); BridgeConnector.Socket.On("NotificationEventReply", (args) => { _notificationOptions.Single(x => x.ReplyID == args[0]).OnReply(args[1]); }); } if (notificationOptions.OnAction != null) { notificationOptions.ActionID = Guid.NewGuid().ToString(); isActionDefined = true; BridgeConnector.Socket.Off("NotificationEventAction"); BridgeConnector.Socket.On("NotificationEventAction", (args) => { _notificationOptions.Single(x => x.ActionID == args[0]).OnAction(args[1]); }); } if (isActionDefined) { _notificationOptions.Add(notificationOptions); } } /// /// Whether or not desktop notifications are supported on the current system. /// /// public Task IsSupportedAsync() => this.InvokeAsync(); } }