@using System.Text.Json @using Microsoft.AspNetCore.Authorization @using Microsoft.AspNetCore.Components.Authorization @using Moonlight.Frontend.Interfaces @using Moonlight.Frontend.Models @using Moonlight.Frontend.Services @using ShadcnBlazor.Sidebars @inject NavigationManager Navigation @inject IAuthorizationService AuthorizationService @inject FrontendService FrontendService @inject IEnumerable Providers @implements IDisposable @{ var url = new Uri(Navigation.Uri); } Logo @FrontendConfiguration?.Name @foreach (var group in Items.GroupBy(x => x.Group)) { @if (!string.IsNullOrWhiteSpace(group.Key)) { @group.Key } @foreach (var item in group.OrderBy(x => x.Order)) { var isActive = item.IsExactPath ? item.Path == url.LocalPath : url.LocalPath.StartsWith(item.Path, StringComparison.OrdinalIgnoreCase); @item.Name } } @code { [CascadingParameter] public Task AuthState { get; set; } private readonly List Items = new(); private FrontendConfiguration? FrontendConfiguration; protected override async Task OnInitializedAsync() { var authState = await AuthState; foreach (var provider in Providers) { var items = await provider.GetItemsAsync(); foreach (var item in items) { if (!string.IsNullOrWhiteSpace(item.Policy)) { var result = await AuthorizationService.AuthorizeAsync(authState.User, item.Policy); if(!result.Succeeded) continue; } Items.Add(item); } } Navigation.LocationChanged += OnLocationChanged; FrontendConfiguration = await FrontendService.GetConfigurationAsync(); Console.WriteLine(JsonSerializer.Serialize(FrontendConfiguration)); } private async void OnLocationChanged(object? sender, LocationChangedEventArgs e) { try { await InvokeAsync(StateHasChanged); } catch (Exception) { // Ignored } } public void Dispose() { Navigation.LocationChanged -= OnLocationChanged; } }