From 32ec745c77303b0a1666581775d331ebc8ed6587 Mon Sep 17 00:00:00 2001 From: Patrick Fic Date: Fri, 24 Jul 2020 11:14:51 -0700 Subject: [PATCH] Added new notification nuget. Added auto regenerate JWT token on error. --- BodyshopUploader/App.xaml | 8 +-- BodyshopUploader/BodyshopPartner.csproj | 7 +++ BodyshopUploader/Utils/GraphQL.cs | 12 ++++- BodyshopUploader/Utils/JobProcessingQueue.cs | 29 ++++++----- BodyshopUploader/Utils/Notifications.cs | 32 ++++++++++++ BodyshopUploader/Utils/QuickBooksInterop.cs | 51 ++++++++++++-------- BodyshopUploader/ViewModels/MainViewModel.cs | 30 +++++++----- BodyshopUploader/packages.config | 2 + 8 files changed, 123 insertions(+), 48 deletions(-) create mode 100644 BodyshopUploader/Utils/Notifications.cs diff --git a/BodyshopUploader/App.xaml b/BodyshopUploader/App.xaml index b9ae366..c14eee4 100644 --- a/BodyshopUploader/App.xaml +++ b/BodyshopUploader/App.xaml @@ -3,15 +3,17 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:BodyshopPartner" ShutdownMode="OnExplicitShutdown" + xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes" Exit="Application_Exit" StartupUri="Views\Login.xaml"> - + + - - diff --git a/BodyshopUploader/BodyshopPartner.csproj b/BodyshopUploader/BodyshopPartner.csproj index 0f52710..89fafad 100644 --- a/BodyshopUploader/BodyshopPartner.csproj +++ b/BodyshopUploader/BodyshopPartner.csproj @@ -314,6 +314,12 @@ True True + + ..\packages\ToastNotifications.2.5.1\lib\net40\ToastNotifications.dll + + + ..\packages\ToastNotifications.Messages.2.5.1\lib\net40\ToastNotifications.Messages.dll + @@ -359,6 +365,7 @@ + diff --git a/BodyshopUploader/Utils/GraphQL.cs b/BodyshopUploader/Utils/GraphQL.cs index 8803ab8..2363818 100644 --- a/BodyshopUploader/Utils/GraphQL.cs +++ b/BodyshopUploader/Utils/GraphQL.cs @@ -34,8 +34,18 @@ namespace BodyshopPartner.Utils else { string exceptionString = ""; + bool jwtExpired = false; logger.Error("Error executing query."); - Array.ForEach(graphQLResponse.Errors, x => { logger.Error(x.Message); exceptionString = exceptionString + x + ";"; }); + Array.ForEach(graphQLResponse.Errors, x => + { + logger.Error(x.Message); + if (x.Message.Contains("JWTExpired")) + { + jwtExpired = true; + }; + exceptionString = exceptionString + x + ";"; + }); + if (jwtExpired) await Utils.Auth.Refresh(); ; logger.Error("---------------------"); throw new Exception(exceptionString); } diff --git a/BodyshopUploader/Utils/JobProcessingQueue.cs b/BodyshopUploader/Utils/JobProcessingQueue.cs index 5cf188d..4b6812d 100644 --- a/BodyshopUploader/Utils/JobProcessingQueue.cs +++ b/BodyshopUploader/Utils/JobProcessingQueue.cs @@ -10,6 +10,7 @@ using BodyshopPartner.Models; using BodyshopPartner.Utils.Growls; using GraphQL.Common.Request; using Newtonsoft.Json.Linq; +using ToastNotifications.Messages; namespace BodyshopPartner.Utils { @@ -159,12 +160,14 @@ namespace BodyshopPartner.Utils logger.Trace("Job insert succesful. Show notification"); App.Current.Dispatcher.Invoke(() => { - Growler.AddNotification(new Notification() - { - Title = Properties.Resources.Msg_NewJobUploaded, - Subtitle = item.Job?.ownr_fn?.Value + " " + item.Job?.ownr_ln?.Value + " | " + item.Job?.clm_no?.Value, - //Message = item.Job?.vehicle?.data?.v_model_yr?.Value + " " + item.Job?.vehicle?.data?.v_make_desc?.Value + " " + item.Job?.vehicle?.data?.v_model_desc?.Value - }); + string msg = Properties.Resources.Msg_NewJobUploaded + " " + item.Job?.ownr_fn?.Value + " " + item.Job?.ownr_ln?.Value + " | " + item.Job?.clm_no?.Value; + Utils.Notifications.notifier.ShowSuccess(msg); + //Growler.AddNotification(new Notification() + //{ + // Title = Properties.Resources.Msg_NewJobUploaded, + // Subtitle = item.Job?.ownr_fn?.Value + " " + item.Job?.ownr_ln?.Value + " | " + item.Job?.clm_no?.Value, + // //Message = item.Job?.vehicle?.data?.v_model_yr?.Value + " " + item.Job?.vehicle?.data?.v_make_desc?.Value + " " + item.Job?.vehicle?.data?.v_model_desc?.Value + //}); }); } @@ -174,12 +177,14 @@ namespace BodyshopPartner.Utils //Succesful upsert App.Current.Dispatcher.Invoke(() => { - Growler.AddNotification(new Notification() - { - Title = Properties.Resources.Msg_NewJobUploadError, - Subtitle = item.Job?.ownr_fn?.Value + " " + item.Job?.ownr_ln?.Value, - Message = Ex.Message - }); ; + string msg = Properties.Resources.Msg_NewJobUploadError + " " + item.Job?.ownr_fn?.Value + " " + item.Job?.ownr_ln?.Value + Ex.Message; + Notifications.notifier.ShowError(msg); + //Growler.AddNotification(new Notification() + //{ + // Title = Properties.Resources.Msg_NewJobUploadError, + // Subtitle = item.Job?.ownr_fn?.Value + " " + item.Job?.ownr_ln?.Value, + // Message = Ex.Message + //}); ; }); } _jobs.Dequeue(); diff --git a/BodyshopUploader/Utils/Notifications.cs b/BodyshopUploader/Utils/Notifications.cs new file mode 100644 index 0000000..e4b58d8 --- /dev/null +++ b/BodyshopUploader/Utils/Notifications.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using ToastNotifications; +using ToastNotifications.Lifetime; +using ToastNotifications.Position; +using ToastNotifications.Messages; +using System.Windows; + +namespace BodyshopPartner.Utils +{ + public static class Notifications + { + public static Notifier notifier = new Notifier(cfg => + { + cfg.PositionProvider = new PrimaryScreenPositionProvider( + corner: Corner.BottomRight, + offsetX: 10, + offsetY: 10); + /* * */ + + cfg.LifetimeSupervisor = new TimeAndCountBasedLifetimeSupervisor( + notificationLifetime: TimeSpan.FromSeconds(3), + maximumNotificationCount: MaximumNotificationCount.FromCount(5)); + + cfg.Dispatcher = Application.Current.Dispatcher; + }); + + } +} diff --git a/BodyshopUploader/Utils/QuickBooksInterop.cs b/BodyshopUploader/Utils/QuickBooksInterop.cs index 66f702f..d408ade 100644 --- a/BodyshopUploader/Utils/QuickBooksInterop.cs +++ b/BodyshopUploader/Utils/QuickBooksInterop.cs @@ -9,6 +9,7 @@ using System.Xml.Linq; using BodyshopPartner.Utils.Growls; using Interop.QBFC13; using Interop.QBXMLRP2; +using ToastNotifications.Messages; namespace BodyshopPartner.Utils { @@ -26,7 +27,7 @@ namespace BodyshopPartner.Utils public static void ConnectToQuickBooks() { - if(String.IsNullOrWhiteSpace(Properties.Settings.Default.QuickBooksFilePath) || !File.Exists(Properties.Settings.Default.QuickBooksFilePath)) + if (String.IsNullOrWhiteSpace(Properties.Settings.Default.QuickBooksFilePath) || !File.Exists(Properties.Settings.Default.QuickBooksFilePath)) { throw new Exception("The QuickBooks file specified does not exist."); } @@ -35,12 +36,15 @@ namespace BodyshopPartner.Utils logger.Debug("Attempting to connect to QuickBooks..."); App.Current.Dispatcher.Invoke(() => { - Growler.AddNotification(new Notification() - { - Id = new Random().Next(), - Title = Properties.Resources.Msg_QbConnection_Title, - Message = Properties.Resources.Msg_QbConnection_Msg - }); + string msg = Properties.Resources.Msg_QbConnection_Title + " " + Properties.Resources.Msg_QbConnection_Msg; + + Notifications.notifier.ShowInformation(msg); + //Growler.AddNotification(new Notification() + //{ + // Id = new Random().Next(), + // Title = Properties.Resources.Msg_QbConnection_Title, + // Message = Properties.Resources.Msg_QbConnection_Msg + //}); }); rp = new RequestProcessor2Class(); @@ -52,18 +56,21 @@ namespace BodyshopPartner.Utils App.Current.Dispatcher.Invoke(() => { - Growler.AddNotification(new Notification() - { - Id = new Random().Next(), - Title = Properties.Resources.Msg_QbConnected_Title, - Message = Properties.Resources.Msg_QbConnected_Msg - }); + string msg = Properties.Resources.Msg_QbConnected_Title + " " + Properties.Resources.Msg_QbConnected_Msg; + + Notifications.notifier.ShowInformation(msg); + //Growler.AddNotification(new Notification() + //{ + // Id = new Random().Next(), + // Title = Properties.Resources.Msg_QbConnected_Title, + // Message = Properties.Resources.Msg_QbConnected_Msg + //}); }); } catch (Exception ex) { logger.Error(ex); - if(ex.Message.Contains("80040154 Class not registered")) + if (ex.Message.Contains("80040154 Class not registered")) { logger.Error("QuickBooks Request Processor not registered. Is QuickBooks installed on this computer?"); throw new Exception("QuickBooks Request Processor not registered. Is QuickBooks installed on this computer?"); @@ -83,12 +90,16 @@ namespace BodyshopPartner.Utils rp.CloseConnection(); App.Current.Dispatcher.Invoke(() => { - Growler.AddNotification(new Notification() - { - Id = new Random().Next(), - Title = Properties.Resources.Msg_QbDisconnection_Title, - Message = Properties.Resources.Msg_QbDisconnection_Msg - }); + string msg = Properties.Resources.Msg_QbDisconnection_Title + " " + Properties.Resources.Msg_QbDisconnection_Msg; + + Notifications.notifier.ShowSuccess(msg); + + //Growler.AddNotification(new Notification() + //{ + // Id = new Random().Next(), + // Title = Properties.Resources.Msg_QbDisconnection_Title, + // Message = Properties.Resources.Msg_QbDisconnection_Msg + //}); }); logger.Debug("Disconnected from QuickBooks successfully."); } diff --git a/BodyshopUploader/ViewModels/MainViewModel.cs b/BodyshopUploader/ViewModels/MainViewModel.cs index 455626f..ec91092 100644 --- a/BodyshopUploader/ViewModels/MainViewModel.cs +++ b/BodyshopUploader/ViewModels/MainViewModel.cs @@ -13,6 +13,7 @@ using System.Text; using System.Threading.Tasks; using System.Windows; using Firebase.Auth; +using ToastNotifications.Messages; namespace BodyshopPartner.ViewModels { @@ -20,6 +21,9 @@ namespace BodyshopPartner.ViewModels { private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger(); + + /* * */ + public MainViewModel() { logger.Trace("Main VM constructed."); @@ -76,10 +80,8 @@ namespace BodyshopPartner.ViewModels LoadBodyshopData().Wait(); ; _callingThread.ReportProgress(80); - - Utils.HTTPServer.InitHttpServer(AddHttpStatus); - logger.Debug("VM Init Complete"); + Task.Run(() => Utils.HTTPServer.InitHttpServer(AddHttpStatus)); _callingThread.ReportProgress(100); } @@ -106,7 +108,7 @@ namespace BodyshopPartner.ViewModels { logger.Debug("Adding folder {0} to monitoring paths.", dialog.SelectedPath); MonitoringPaths.Add(new Models.Monitor() { FilePath = dialog.SelectedPath }); - Properties.Settings.Default.MonitoringPaths = MonitoringPaths.Select(x => x.FilePath).ToList(); ; + Properties.Settings.Default.MonitoringPaths = MonitoringPaths.Select(x => x.FilePath).ToList(); Properties.Settings.Default.Save(); } } @@ -226,14 +228,18 @@ namespace BodyshopPartner.ViewModels private FirebaseAuthLink al = BodyshopPartner.Utils.Auth.authlink; public async Task TestGql() { - Notification _n = new Notification() - { - Id = new Random().Next(), - Title = "This is a title", - Subtitle = "Subtitle", - Message = "Somethin" - }; - Growler.AddNotification(_n); + + Utils.Notifications.notifier.ShowInformation("The message"); + + + //Notification _n = new Notification() + //{ + // Id = new Random().Next(), + // Title = "This is a title", + // Subtitle = "Subtitle", + // Message = "Somethin" + //}; + //Growler.AddNotification(_n); Console.WriteLine(al.FirebaseToken); FirebaseAuthLink t = await al.GetFreshAuthAsync(); diff --git a/BodyshopUploader/packages.config b/BodyshopUploader/packages.config index 684a8a2..dd91103 100644 --- a/BodyshopUploader/packages.config +++ b/BodyshopUploader/packages.config @@ -70,4 +70,6 @@ + + \ No newline at end of file