using ElectronNET.API.Entities; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Newtonsoft.Json.Serialization; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace ElectronNET.API { /// /// Create OS desktop notifications /// public sealed class Notification { 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.Emit("createNotification", JObject.FromObject(notificationOptions, _jsonSerializer)); } private static void GenerateIDsForDefinedActions(NotificationOptions notificationOptions) { bool isActionDefined = false; if (notificationOptions.OnShow != null) { notificationOptions.ShowID = Guid.NewGuid().ToString(); isActionDefined = true; BridgeConnector.Off("NotificationEventShow"); BridgeConnector.On("NotificationEventShow", (id) => { _notificationOptions.Single(x => x.ShowID == id).OnShow(); }); } if (notificationOptions.OnClick != null) { notificationOptions.ClickID = Guid.NewGuid().ToString(); isActionDefined = true; BridgeConnector.Off("NotificationEventClick"); BridgeConnector.On("NotificationEventClick", (id) => { _notificationOptions.Single(x => x.ClickID == id).OnClick(); }); } if (notificationOptions.OnClose != null) { notificationOptions.CloseID = Guid.NewGuid().ToString(); isActionDefined = true; BridgeConnector.Off("NotificationEventClose"); BridgeConnector.On("NotificationEventClose", (id) => { _notificationOptions.Single(x => x.CloseID == id.ToString()).OnClose(); }); } if (notificationOptions.OnReply != null) { notificationOptions.ReplyID = Guid.NewGuid().ToString(); isActionDefined = true; BridgeConnector.Off("NotificationEventReply"); BridgeConnector.On("NotificationEventReply", (args) => { _notificationOptions.Single(x => x.ReplyID == args[0].ToString()).OnReply(args[1].ToString()); }); } if (notificationOptions.OnAction != null) { notificationOptions.ActionID = Guid.NewGuid().ToString(); isActionDefined = true; BridgeConnector.Off("NotificationEventAction"); BridgeConnector.On("NotificationEventAction", (args) => { _notificationOptions.Single(x => x.ReplyID == args[0].ToString()).OnAction(args[1].ToString()); }); } if (isActionDefined) { _notificationOptions.Add(notificationOptions); } } /// /// Whether or not desktop notifications are supported on the current system. /// /// public Task IsSupportedAsync() { var taskCompletionSource = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); BridgeConnector.On("notificationIsSupportedComplete", (isSupported) => { BridgeConnector.Off("notificationIsSupportedComplete"); taskCompletionSource.SetResult(isSupported); }); BridgeConnector.Emit("notificationIsSupported"); return taskCompletionSource.Task; } private JsonSerializer _jsonSerializer = new JsonSerializer() { ContractResolver = new CamelCasePropertyNamesContractResolver(), NullValueHandling = NullValueHandling.Ignore, DefaultValueHandling = DefaultValueHandling.Ignore }; } }