using Microsoft.AspNetCore.Components; using SHERPA.BBM.UI.Data; namespace SHERPA.BBM.UI.Components { /// /// Pagina gestione ricerca con deounce basato su timer: /// https://blog.jeremylikness.com/blog/an-easier-blazor-debounce/ /// public partial class SearchMod : IDisposable { #region Public Properties [Parameter] public int DebounceTimer { get; set; } = 200; [Parameter] public string searchVal { get { return lastSearch; } set { lastSearch = value; DisposeTimer(); aTimer = new System.Timers.Timer(DebounceTimer); aTimer.Elapsed += TimerElapsed_TickAsync; aTimer.Enabled = true; aTimer.Start(); } } #endregion Public Properties #region Public Methods public void Dispose() { DisposeTimer(); MService.EA_SearchUpdated -= OnSeachUpdated; MService.HeadChanged -= MService_HeadChanged; } public async void OnSeachUpdated() { await InvokeAsync(() => { lastSearch = MService.SearchVal; StateHasChanged(); }); } #endregion Public Methods #region Protected Properties [Inject] protected MessageService MService { get; set; } = null!; #endregion Protected Properties #region Protected Methods protected override async Task OnInitializedAsync() { await Task.Delay(1); MService.EA_SearchUpdated += OnSeachUpdated; MService.HeadChanged += MService_HeadChanged; } #endregion Protected Methods #region Private Fields private static System.Timers.Timer? aTimer = null; #endregion Private Fields #region Private Properties private string lastSearch { get; set; } = ""; #endregion Private Properties #region Private Methods private void DisposeTimer() { if (aTimer != null) { aTimer.Stop(); aTimer.Dispose(); } } private void MService_HeadChanged() { lastSearch = MService.SearchVal; } private void reset() { MService.SearchVal = ""; searchVal = ""; } private async void TimerElapsed_TickAsync(object? sender, EventArgs e) { DisposeTimer(); await Task.Delay(1); MService.SearchVal = lastSearch; } #endregion Private Methods } }