using FoodsharingSiegen.Contracts; using FoodsharingSiegen.Contracts.Entity; using FoodsharingSiegen.Contracts.Enums; using FoodsharingSiegen.Contracts.Model; using FoodsharingSiegen.Server.Data.Service; using FoodsharingSiegen.Shared.Helper; using FoodsharingSiegen.Server.Dialogs; using FoodsharingSiegen.Server.Service; using Microsoft.AspNetCore.Components; namespace FoodsharingSiegen.Server.Pages { /// /// The prospects class (a. beging, 11.04.2022) /// public partial class Prospects { #region Dependencies [Inject] private ProspectService ProspectService { get; set; } = null!; /// /// Gets or sets the value of the user service (ab) /// [Inject] private UserService UserService { get; set; } = null!; #endregion #region Private Properties private ProspectFilter Filter { get; set; } = new(); /// /// Gets or sets the value of the prospect list (ab) /// private List ProspectList { get; set; } = []; private bool IsLoadingProspects { get; set; } private bool IsLoadingMoreProspects { get; set; } private bool HasMoreProspects { get; set; } private int CurrentPageSize { get; set; } = 50; private int CurrentSkip { get; set; } private ProspectSortOption CurrentSort { get; set; } = ProspectSortOption.NameAscending; #endregion #region Override InitializeDataAsync /// protected override async Task InitializeDataAsync() { var filter = await LocalStorageService.GetItem(StorageKeys.ProspectFilter); if (filter != null) Filter = filter; // Load prospects await LoadProspects(); } #endregion #region Private Method CreateProspectAsync private bool _isOpeningModal; /// /// Asynchronously creates a new prospect by displaying the AddProspectModal dialog and refreshing the prospect list. /// /// A task that represents the asynchronous operation. private async Task CreateProspectAsync() { if (_isOpeningModal) return; _isOpeningModal = true; try { await EditProspectDialog.ShowAsync(ModalService, LoadProspects); } finally { _isOpeningModal = false; } } #endregion #region Private Method FilterChangedAsync /// /// Updates the current filter with the specified ProspectFilter object. /// /// The ProspectFilter object containing the updated filter criteria. /// A task that represents the asynchronous operation. private async Task FilterChangedAsync(ProspectFilter arg) { Filter = arg; await LocalStorageService.SetItem(StorageKeys.ProspectFilter, Filter); CurrentSkip = 0; ProspectList = []; await LoadProspects(); } #endregion #region Private Method LoadProspects /// /// Loads the prospects (a. beging, 11.04.2022) /// private bool HasActiveFilter() { return !string.IsNullOrWhiteSpace(Filter.Text) || Filter.WithoutStepInBriefing || Filter.WithoutIdCheck || Filter.DeletedOnly || Filter.IdCheckPossible || Filter.NoActivity || Filter.RecentActivity; } private async Task LoadProspects() { if (IsLoadingProspects || IsLoadingMoreProspects) return; try { if (CurrentSkip == 0) { IsLoadingProspects = true; } else { IsLoadingMoreProspects = true; } await InvokeAsync(StateHasChanged); while (true) { var parameter = new GetProspectsParameter { Skip = CurrentSkip, Take = CurrentPageSize, CannotHaveInteractions = [InteractionType.Complete, InteractionType.Verify, InteractionType.ReleasedForVerification] }; var prospectsR = await ProspectService.GetProspectsAsync(parameter); if (!prospectsR.Success) { break; } var loadedProspects = prospectsR.Data ?? []; if (CurrentSkip == 0) { ProspectList = loadedProspects; } else { ProspectList = [.. ProspectList, .. loadedProspects]; } CurrentSkip += loadedProspects.Count; HasMoreProspects = loadedProspects.Count == CurrentPageSize; var filteredCount = ProspectList.ApplyFilter(Filter).Count; if (!HasActiveFilter() || filteredCount > 0 || !HasMoreProspects || loadedProspects.Count == 0) { break; } } await InvokeAsync(StateHasChanged); } catch (Exception ex) { await Notification.Error(ex.Message, "Fehler beim Laden"); } finally { IsLoadingProspects = false; IsLoadingMoreProspects = false; await InvokeAsync(StateHasChanged); } } private async Task LoadMoreProspects() { if (IsLoadingProspects || IsLoadingMoreProspects || !HasMoreProspects) return; await LoadProspects(); } #endregion } }