@using MoonCore.Helpers @using MoonCore.PluginFramework.Services @using Moonlight.Client.Interfaces @using Moonlight.Client.UI.Partials @inherits LayoutComponentBase @inject ImplementationService ImplementationService @inject IServiceProvider ServiceProvider @inject ILogger Logger @if (IsLoading) {
} else if (CurrentScreen != null) { @CurrentScreen } else {
@Body
} @code { // Mobile navigation public event Func OnStateChanged; public bool ShowMobileNavigation { get; private set; } = false; public async Task ToggleMobileNavigation() { ShowMobileNavigation = !ShowMobileNavigation; await OnStateChanged(); } // App loaders & screens private bool IsLoading = true; private RenderFragment? CurrentScreen; protected override async Task OnAfterRenderAsync(bool firstRender) { if(!firstRender) return; await Load(); } public async Task Load() { IsLoading = true; await InvokeAsync(StateHasChanged); // await RunLoaders(); // Screens await RenderScreens(); // IsLoading = false; await InvokeAsync(StateHasChanged); } private async Task RunLoaders() { var appLoaders = ImplementationService .Get() .OrderBy(x => x.Priority); foreach (var loader in appLoaders) //TODO: Measure performance of every loader? { try { Logger.LogDebug("Running application loader '{name}'", loader.GetType().Name); await loader.Load(ServiceProvider); } catch (Exception e) { Logger.LogCritical("An app loader threw an unhandled exception: {e}", e); } } } public async Task RenderScreens() { CurrentScreen = null; var appScreens = ImplementationService .Get() .OrderBy(x => x.Priority); foreach (var screen in appScreens) { if (!await screen.ShouldRender(ServiceProvider)) continue; CurrentScreen = screen.Render(); await InvokeAsync(StateHasChanged); return; } await InvokeAsync(StateHasChanged); } }