using System.Diagnostics; using AyCode.Core.Enums; using AyCode.Core.Helpers; using AyCode.Core.Interfaces; using AyCode.Services.SignalRs; using TIAM.Services; using TIAMWebApp.Shared.Application.Services; namespace TIAMWebApp.Shared.Application.Utility; [Serializable] [DebuggerDisplay("Count = {Count}")] public class SignalRDataSourceAsync : SignalRDataSource where T : class, IId { public Action>? OnItemChanged; public Action>? OnDataSourceLoaded; public SignalRDataSourceAsync(AcSignalRClientBase signalRClient, SignalRCrudTags signalRCrudTags, Guid? contextId = null, Action>? onDataSourceLoaded = null, bool autoLoadDataSource = false) : base(signalRClient, signalRCrudTags, contextId) { OnDataSourceLoaded = onDataSourceLoaded; if (autoLoadDataSource) LoadDataSourceAsync(); } public void LoadDataSourceAsync(bool clearChangeTracking = true) { if (SignalRCrudTags.GetAllMessageTag == SignalRTags.None) throw new ArgumentException($"_signalRCrudTags.GetAllMessageTag == SignalRTags.None;"); //Monitor.Exit(SyncRoot); //Exception test - J. //Monitor.Enter(SyncRoot); //try //{ // SignalRClient.GetAllAsync>(SignalRCrudTags.GetAllMessageTag, ContextId, response => // { // try // { // if (response.Status == SignalResponseStatus.Error) throw new Exception($"LoadDataSourceAsync; response.Status == SignalResponseStatus.Error"); // if (response.ResponseData == null) throw new NullReferenceException($"response.ResponseData == null"); // Clear(clearChangeTracking); // InnerList.AddRange(response.ResponseData); // } // finally // { // Monitor.Exit(SyncRoot); // } // OnDataSourceLoaded?.Invoke(this); // }).Forget(); //} //catch (Exception) //{ // Monitor.Exit(SyncRoot); // throw; //} } //public T Add(T item, int messageTag) => PostDataToServerAsync(item, messageTag, TrackingState.Add).GetAwaiter().GetResult(); //public Task AddAsync(T item, int messageTag) => PostDataToServerAsync(item, messageTag, TrackingState.Add); //public Task UpdateAsync(T item, int messageTag) => PostDataToServerAsync(item, messageTag, TrackingState.Update); //public Task RemoveAsync(T item, int messageTag) => PostDataToServerAsync(item, messageTag, TrackingState.Remove); //public Task RemoveAsync(Guid id, int messageTag) //{ // var item = _list.FirstOrDefault(x => x.Id == id); // return item == null ? Task.CompletedTask : RemoveAsync(item, messageTag); //} //protected virtual Task PostDataToServerAsync(T item, int messageTag, TrackingState trackingState) //{ // if (messageTag == 0) return Task.CompletedTask; // logger.Info($"{_listLogName} PostDataToServerAsync called; transferId " + item.Id); // if (item.Id.IsNullOrEmpty()) item.Id = Guid.NewGuid(); // _list.UpdateCollection(item, trackingState == TrackingState.Remove); //egyből látszódik a változás a grid-ben, nem csak a callback lefutásakor! felhasználóbarátabb... - J. // await _signalRClient.PostDataAsync(messageTag, item, async repsonse => // { // if (repsonse.Status != SignalResponseStatus.Success || repsonse.ResponseData == null) // { // RefreshDataSourceAsync().Forget(); // return; // } // _list.UpdateCollection(repsonse.ResponseData, trackingState == TrackingState.Remove); // var eventArgs = new ItemChangedEventArgs(repsonse.ResponseData, trackingState); // OnItemChanged.Invoke(eventArgs); // }); // //transfer = await devAdminSignalClient.PostDataAsync(SignalRTags.UpdateTransferAsync, transfer); // return Task.CompletedTask; //} }