ViewModelBase.cs 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Collections.ObjectModel;
  4. using System.Linq;
  5. using System.Threading;
  6. using System.Threading.Tasks;
  7. using Comal.Classes;
  8. using CommunityToolkit.Mvvm.ComponentModel;
  9. using CommunityToolkit.Mvvm.Input;
  10. using DialogHostAvalonia;
  11. using InABox.Configuration;
  12. using InABox.Rpc;
  13. using PRS.Avalonia.Components;
  14. using PRS.Avalonia;
  15. namespace PRS.Avalonia;
  16. public abstract partial class ViewModelBase : ObservableObject
  17. {
  18. public ViewModelBase()
  19. {
  20. }
  21. private static DataAccessLayer? _dataAccessLayer;
  22. public DataAccessLayer DataAccess
  23. {
  24. get
  25. {
  26. if (_dataAccessLayer == null)
  27. {
  28. _dataAccessLayer = new DataAccessLayer();
  29. _dataAccessLayer.Connected += (s, e) => Connected();
  30. _dataAccessLayer.Disconnected += (s, e) => Disconnected();
  31. }
  32. _dataAccessLayer ??= new DataAccessLayer();
  33. return _dataAccessLayer;
  34. }
  35. }
  36. private static RepositoryLayer? _repositories;
  37. public RepositoryLayer Repositories
  38. {
  39. get
  40. {
  41. _repositories ??= new RepositoryLayer(DataAccess);
  42. return _repositories;
  43. }
  44. }
  45. private void Connected()
  46. {
  47. }
  48. private void Validated()
  49. {
  50. Repositories.Me.Refresh(true);
  51. }
  52. private void Disconnected()
  53. {
  54. }
  55. [RelayCommand]
  56. private void BackButtonPressed()
  57. {
  58. if (OnBackButtonPressed())
  59. Navigation.Back();
  60. }
  61. protected virtual bool OnBackButtonPressed()
  62. {
  63. return true;
  64. }
  65. private CancellationTokenSource _cts =
  66. new CancellationTokenSource( );
  67. public void Activate()
  68. {
  69. OnActivated();
  70. var token = _cts.Token;
  71. Task refreshtask = Task.Run(
  72. async () =>
  73. {
  74. var result = await Refresh();
  75. while (result != TimeSpan.Zero)
  76. {
  77. if ( token.IsCancellationRequested )
  78. break;
  79. await Task.Delay(result);
  80. if (!token.IsCancellationRequested )
  81. result = await Refresh();
  82. }
  83. },
  84. token
  85. );
  86. }
  87. protected virtual void OnActivated()
  88. {
  89. }
  90. protected async Task<TimeSpan> Refresh()
  91. {
  92. return await OnRefresh();
  93. }
  94. protected virtual async Task<TimeSpan> OnRefresh()
  95. {
  96. return TimeSpan.FromSeconds(30);
  97. }
  98. public void Deactivate()
  99. {
  100. _cts.Cancel( );
  101. _cts.Dispose( );
  102. _cts = new CancellationTokenSource( );
  103. OnDeactivated();
  104. }
  105. protected virtual void OnDeactivated()
  106. {
  107. }
  108. [ObservableProperty]
  109. private ObservableCollection<PRSAvaloniaMenuItem> _primaryMenu = new();
  110. [ObservableProperty]
  111. private ObservableCollection<PRSAvaloniaMenuItem> _secondaryMenu = new();
  112. [ObservableProperty]
  113. private bool _backButtonVisible = true;
  114. [ObservableProperty]
  115. private bool _reverseTransition;
  116. private static Dictionary<String, MobileDatabaseSettings>? _databaseSettings;
  117. public static Dictionary<String, MobileDatabaseSettings> DatabaseSettings
  118. {
  119. get
  120. {
  121. if (_databaseSettings == null)
  122. LoadDatabaseSettings();
  123. return _databaseSettings;
  124. }
  125. }
  126. private static MobileDatabaseSettings? _currentDatabase;
  127. public static MobileDatabaseSettings CurrentDatabase
  128. {
  129. get
  130. {
  131. if (_currentDatabase == null)
  132. LoadDatabaseSettings();
  133. return DatabaseSettings.Any(x => x.Value.IsDefault)
  134. ? DatabaseSettings.FirstOrDefault(x => x.Value.IsDefault).Value
  135. : DatabaseSettings.First().Value;
  136. }
  137. }
  138. public static string CurrentDatabaseName => DatabaseSettings.Any(x => x.Value.IsDefault)
  139. ? DatabaseSettings.FirstOrDefault(x => x.Value.IsDefault).Key
  140. : DatabaseSettings.First().Key;
  141. public static bool IsSharedDevice =>
  142. string.IsNullOrWhiteSpace(CurrentDatabase.UserID)
  143. || string.IsNullOrWhiteSpace(CurrentDatabase.Password);
  144. public static void SaveDatabaseSettings()
  145. {
  146. var config = new LocalConfiguration<MobileDatabaseSettings>();
  147. var old = config.LoadAll();
  148. foreach(var key in old.Keys)
  149. {
  150. if (!DatabaseSettings.ContainsKey(key))
  151. {
  152. new LocalConfiguration<MobileDatabaseSettings>(key).Delete();
  153. }
  154. }
  155. config.SaveAll(DatabaseSettings);
  156. }
  157. public static void LoadDatabaseSettings()
  158. {
  159. _databaseSettings = new LocalConfiguration<MobileDatabaseSettings>().LoadAll();
  160. // Migrate from Old Database Settings (if present)
  161. if (!_databaseSettings.Any())
  162. {
  163. var oldsettings = new LocalConfiguration<DatabaseSettings>().LoadAll();
  164. foreach (var key in oldsettings.Keys)
  165. {
  166. if (oldsettings[key].URLs?.Any() == true)
  167. {
  168. var newsetting = new MobileDatabaseSettings()
  169. {
  170. URLs = oldsettings[key].URLs,
  171. UserID = oldsettings[key].UserID,
  172. Password = oldsettings[key].Password,
  173. IsDefault = String.IsNullOrWhiteSpace(key),
  174. CacheID = Guid.NewGuid()
  175. };
  176. _databaseSettings[String.IsNullOrWhiteSpace(key) ? "Default Profile" : key] = newsetting;
  177. }
  178. new LocalConfiguration<MobileDatabaseSettings>().SaveAll(_databaseSettings);
  179. new LocalConfiguration<DatabaseSettings>().Delete();
  180. }
  181. }
  182. // Contruct Defaults if required
  183. if (!_databaseSettings.Any())
  184. {
  185. _currentDatabase = new MobileDatabaseSettings();
  186. _currentDatabase.URLs = new String[]
  187. {
  188. "demo.prsdigital.com.au:8033",
  189. "demo2.prsdigital.com.au:8033",
  190. };
  191. _currentDatabase.UserID = "GUEST";
  192. _currentDatabase.Password = "guest";
  193. _currentDatabase.IsDefault = true;
  194. _currentDatabase.CacheID = Guid.NewGuid();
  195. _databaseSettings["Demo Database"] = _currentDatabase;
  196. new LocalConfiguration<MobileDatabaseSettings>().SaveAll(_databaseSettings);
  197. }
  198. // Retrieve the Default (or the first, if there is no default)
  199. _currentDatabase = _databaseSettings.Any(x => x.Value.IsDefault)
  200. ? _databaseSettings.FirstOrDefault(x => x.Value.IsDefault).Value
  201. : _databaseSettings.First().Value;
  202. if (_currentDatabase.CacheID == Guid.Empty)
  203. {
  204. _currentDatabase.CacheID = Guid.NewGuid();
  205. new LocalConfiguration<MobileDatabaseSettings>().SaveAll(_databaseSettings);
  206. }
  207. }
  208. }