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, false) { OnDataSourceLoaded = onDataSourceLoaded; if (autoLoadDataSource) LoadDataSourceAsync(); } public void LoadDataSourceAsync() { 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(); 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, DataChangeMode.Add).GetAwaiter().GetResult(); //public Task AddAsync(T item, int messageTag) => PostDataToServerAsync(item, messageTag, DataChangeMode.Add); //public Task UpdateAsync(T item, int messageTag) => PostDataToServerAsync(item, messageTag, DataChangeMode.Update); //public Task RemoveAsync(T item, int messageTag) => PostDataToServerAsync(item, messageTag, DataChangeMode.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, DataChangeMode dataChangeMode) //{ // 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, dataChangeMode == DataChangeMode.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, dataChangeMode == DataChangeMode.Remove); // var eventArgs = new ItemChangedEventArgs(repsonse.ResponseData, dataChangeMode); // OnItemChanged.Invoke(eventArgs); // }); // //transfer = await devAdminSignalClient.PostDataAsync(SignalRTags.UpdateTransferAsync, transfer); // return Task.CompletedTask; //} public class ItemChangedEventArgs where T : IId { internal ItemChangedEventArgs(T item, DataChangeMode dataChangeMode) { Item = item; DataChangeMode = dataChangeMode; } public T Item { get; } public DataChangeMode DataChangeMode { get; } } }