Files
2021-05-31 14:20:54 -07:00

331 lines
11 KiB
C#

using BodyshopPartner.Models;
using BodyshopPartner.Utils.Growls;
using GraphQL.Client;
using GraphQL;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using Firebase.Auth;
using ToastNotifications.Messages;
using Microsoft.Win32;
namespace BodyshopPartner.ViewModels
{
public partial class MainViewModel : BaseViewModel
{
private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
/* * */
public MainViewModel()
{
logger.Trace("Main VM constructed.");
BackgroundWorker bw = new BackgroundWorker();
bw.DoWork += bw_InitVm;
bw.WorkerReportsProgress = true;
bw.ProgressChanged += Bw_ProgressChanged;
bw.RunWorkerCompleted += Bw_RunWorkerCompleted;
bw.RunWorkerAsync();
Growler = new GrowlNotification(this);
Utils.JobProcessingQueue.SetGrowler(Growler);
Utils.QuickBooksInterop.SetGrowler(Growler);
}
private void Bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
((BackgroundWorker)sender).Dispose();
Progress = 0;
}
private void Bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
Progress = e.ProgressPercentage;
}
private void bw_InitVm(object sender, DoWorkEventArgs e)
{
BackgroundWorker _callingThread = sender as BackgroundWorker;
_callingThread.ReportProgress(1);
//Restore list of paths, convert to monitor object.
List<string> listOfPaths = Properties.Settings.Default.MonitoringPaths;
if (listOfPaths == null) listOfPaths = new List<string>();
foreach (var p in listOfPaths)
{
MonitoringPaths.Add(new Models.Monitor() { FilePath = p });
}
MonitoringPaths.CollectionChanged += MonitoringPathsChanged;
_callingThread.ReportProgress(30);
_updateCheckTimer.Elapsed += _updateTimer_Elapsed;
_updateCheckTimer.AutoReset = true;
_updateCheckTimer.Start();
_callingThread.ReportProgress(50);
//Cannot use await.
LoadBodyshopData().Wait(); ;
_callingThread.ReportProgress(80);
logger.Debug("VM Init Complete");
Task.Run(() => Utils.HTTPServer.InitHttpServer(AddHttpStatus));
Task.Run(() => updateCheck());
StartAllFolderMonitors();
Utils.PowerModeEventHandler.InitEventHandler();
_callingThread.ReportProgress(100);
}
private async Task updateCheck()
{
#if (!DEBUG)
if (!Utils.AppMetaData.IsTest)
{
logger.Debug("Checking if updates are available.");
UpdateAvailable = await Utils.UpdateHandler.AreUpdatesAvailable();
if (UpdateAvailable)
{
logger.Debug("Updates are available!");
await Utils.UpdateHandler.UpdateAppEasy((val) => UpdateProgress = val);
}
}
// string msg = "An update to ImEX Online Partner is Available. It will be automatically downloaded and applied.";
// Utils.Notifications.notifier.ShowInformation(msg);
// logger.Debug("Updates are available! Installing.");
// try
// {
// await Utils.UpdateHandler.ApplyUpdates((val) => UpdateProgress = val, (val) => UpdateProgress = val);
// }
// catch (Exception Ex)
// {
// logger.Error("Error while updating." + Ex.ToString());
// }
//}
#endif
}
private async Task InstallUpdates()
{
logger.Debug("Updates are available! Installing.");
try
{
await Utils.UpdateHandler.ApplyUpdates((val) => UpdateProgress = val, (val) => UpdateProgress = val);
}
catch (Exception Ex)
{
logger.Error("Error while updating." + Ex.ToString());
}
}
private async void _updateTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
await updateCheck();
}
private void MonitoringPathsChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
IndeterminateLoading = true;
StopAllFolderMonitors();
StartAllFolderMonitors();
IndeterminateLoading = false;
}
public void AddFolderMonitoringPath()
{
var dialog = new Ookii.Dialogs.Wpf.VistaFolderBrowserDialog();
if (dialog.ShowDialog().GetValueOrDefault())
{
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.Save();
}
}
public void RemoveFolderMonitoringPath(Monitor m)
{
logger.Debug("Removing folder {0} to monitoring paths.", m.FilePath);
m.StopMonitor();
MonitoringPaths.Remove(m);
Properties.Settings.Default.MonitoringPaths = MonitoringPaths.Select(x => x.FilePath).ToList();
Properties.Settings.Default.Save();
}
public void StartAllFolderMonitors()
{
IndeterminateLoading = true;
if (MonitoringPaths.Count > 0)
foreach (var m in MonitoringPaths)
{
m.StopMonitor();
}
foreach (var p in MonitoringPaths)
{
p.StartMonitor();
}
IndeterminateLoading = false;
}
public void RemoveAllFolderMonitors()
{
IndeterminateLoading = true;
if (MonitoringPaths.Count > 0)
foreach (var m in MonitoringPaths.ToList())
{
logger.Debug("Removing folder {0} to monitoring paths.", m.FilePath);
m.StopMonitor();
MonitoringPaths.Remove(m);
}
Properties.Settings.Default.MonitoringPaths = MonitoringPaths.Select(x => x.FilePath).ToList();
Properties.Settings.Default.Save();
IndeterminateLoading = false;
}
public void BrowseForQbFolder()
{
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.ValidateNames = false;
openFileDialog.Multiselect = false;
openFileDialog.Filter = "QuickBooks files (*.qbw)|*.qbw|All files (*.*)|*.*";
openFileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
if (openFileDialog.ShowDialog() == true)
{
Properties.Settings.Default.QuickBooksFilePath = openFileDialog.FileName;
Properties.Settings.Default.Save();
}
}
public void StopAllFolderMonitors()
{
IndeterminateLoading = true;
if (MonitoringPaths.Count > 0)
foreach (var m in MonitoringPaths)
{
m.StopMonitor();
}
IndeterminateLoading = false;
}
public void Logout()
{
Properties.Settings.Default.AuthToken = "";
Properties.Settings.Default.RefreshToken = "";
Properties.Settings.Default.Save();
App.Current.Shutdown();
}
public async Task LoadBodyshopData()
{
var r = new GraphQLRequest
{
Query = @"query QUERY_BODYSHOPS {
bodyshops {
shopname
id
region_config
associations {
id
active
}
}
}"
};
var Data = await Utils.GraphQL.ExecuteQuery(r);
if (Data != null)
{
ShopData = Data.bodyshops.ToObject<ObservableCollection<Bodyshop>>();
}
ActiveShop = ShopData.Where(_ => _.AssociationActive == true).FirstOrDefault();
Utils.AppMetaData.ActiveShopId = ActiveShop?.Id;
Utils.AppMetaData.ShopRegion = ActiveShop?.RegionConfig;
Properties.Settings.Default.LastSelectedShop = ActiveShop.Id ?? null;
Properties.Settings.Default.Save();
}
public async Task SetActiveBodyshop()
{
//IndeterminateLoading = true;
//foreach (var s in ShopData)
//{
// if (s.Id == ActiveShop?.Id) s.AssociationActive = true;
// else s.AssociationActive = false;
// var r = new GraphQLRequest
// {
// Query = @"
// mutation UPDATE_ASSOCIATION($assocId: uuid, $assocActive: Boolean) {
// update_associations(where: {id: {_eq: $assocId}}, _set: {active: $assocActive}) {
// returning {
// id
// active
// }
// }
// }
//",
// Variables = new
// {
// assocId = s.AssociationId,
// assocActive = s.AssociationActive
// }
// };
// await Utils.GraphQL.ExecuteQuery(r);
//}
//Properties.Settings.Default.LastSelectedShop = ActiveShop?.Id;
//Properties.Settings.Default.Save();
//Utils.AppMetaData.ActiveShopId = ActiveShop?.Id;
//Utils.AppMetaData.ShopRegion = ActiveShop?.RegionConfig;
//IndeterminateLoading = false;
}
public void AddHttpStatus(string s)
{
string newLine = $"\n{DateTime.Now.ToString("MM/dd/yy hh:mm:ss tt")}: {s}";
HttpServerLog += newLine;
logger.Trace(newLine);
}
private FirebaseAuthLink al = BodyshopPartner.Utils.Auth.authlink;
public async Task TestGql()
{
Utils.SquirrelAwareHelper.AddHttpExcetion();
}
}
}