using AyCode.Core.Consts; using AyCode.Core.Extensions; using AyCode.Core.Loggers; using AyCode.Services.SignalRs; using AyCode.Utils.Extensions; using DevExpress.Blazor; using FruitBank.Common.Dtos; using FruitBank.Common.Models; using FruitBank.Common.Models.SignalRs; using FruitBank.Common.SignalRs; using FruitBankHybrid.Shared.Pages; using FruitBankHybrid.Shared.Services.Loggers; using FruitBankHybrid.Shared.Services.SignalRs; using Mango.Nop.Core.Loggers; using MessagePack.Resolvers; using Microsoft.AspNetCore.Components; namespace FruitBankHybrid.Shared.Layout; public partial class MainLayout : LayoutComponentBase { [Inject] public required IEnumerable LogWriters { get; set; } [Inject] public required NavigationManager NavManager { get; set; } [Inject] public required LoggedInModel LoggedInModel { get; set; } [Inject] IToastNotificationService ToastService { get; set; } [Inject] public required FruitBankSignalRClient FruitBankSignalRClient { get; set; } private EventCallback RefreshMainLayoutEventCallback => EventCallback.Factory.Create(this, RefreshMainLayout); private NavMenu _navMenu = null!; private LoggerClient _logger = null!; // Toast fields private DxToast orderNotificationToast; private string toastTitle = "Értesítő!"; private string? toastMessage; private string? toastOrderNumber; private DateTime? toastDateOfReceipt; protected override void OnInitialized() { _logger = new LoggerClient(LogWriters.ToArray()); _logger.Info("OnInitializedAsync"); var loginUri = NavManager.ToAbsoluteUri("/Login").ToString(); FruitBankSignalRClient.OnMessageReceived += SignalRClientOnMessageReceived; if (!LoggedInModel.IsLoggedIn && NavManager.Uri != loginUri) { NavManager.NavigateTo("/Login"); } } private async Task SignalRClientOnMessageReceived(int messageTag, string? jsonMessage) { if (messageTag != SignalRTags.NotificationReceived || !LoggedInModel.IsLoggedIn) return; var notificationMessage = jsonMessage?.JsonTo>(); if (notificationMessage == null) { _logger.Error($"notificationMessage == null"); return; } toastOrderNumber = null; toastDateOfReceipt = null; toastMessage = notificationMessage.Message; var orderDto = notificationMessage.Content; var hasPermission = orderDto == null || (orderDto.HasMeasuringAccess(LoggedInModel.CustomerDto!.Id, LoggedInModel.IsRevisor) || orderDto.MeasurementOwnerId == 0); if (orderDto != null && hasPermission) { toastOrderNumber = orderDto.CustomOrderNumber; toastDateOfReceipt = orderDto.DateOfReceipt; } if (!hasPermission) return; _logger.Debug($"NotificationMessage received. {toastMessage}"); await InvokeAsync(() => { orderNotificationToast?.Show(); StateHasChanged(); }); } private void OnLogoutClick() { LoggedInModel.LogOut(); RefreshMainLayout(); NavManager.NavigateTo("/Login"); } public void RefreshMainLayout() { _navMenu.RefreshNavMenu(); StateHasChanged(); } }