Added event system, soft error handler and added some things from helio

This commit is contained in:
Marcel Baumgartner
2023-10-13 21:42:12 +02:00
parent afb3a7f3a3
commit 3bb4e7daab
22 changed files with 699 additions and 9 deletions

View File

@@ -0,0 +1,66 @@
@if (ShowConfirm)
{
<div class="btn-group">
<button class="btn btn-success me-2 rounded-end" @onclick="Do">Confirm</button>
<button class="btn btn-danger rounded-start" @onclick="() => SetConfirm(false)">Cancel</button>
</div>
}
else
{
if (Working)
{
<button class="btn @(CssClasses) disabled" disabled="">
<span class="spinner-border spinner-border-sm align-middle me-2"></span>
@WorkingText
</button>
}
else
{
<button class="btn @(CssClasses)" @onclick="() => SetConfirm(true)">
@Text
@ChildContent
</button>
}
}
@code
{
private bool Working { get; set; } = false;
private bool ShowConfirm = false;
[Parameter]
public string CssClasses { get; set; } = "btn-primary";
[Parameter]
public string Text { get; set; } = "";
[Parameter]
public string WorkingText { get; set; } = "";
[Parameter]
public Func<Task>? OnClick { get; set; }
[Parameter]
public RenderFragment ChildContent { get; set; }
private async Task SetConfirm(bool b)
{
ShowConfirm = b;
await InvokeAsync(StateHasChanged);
}
private async Task Do()
{
Working = true;
ShowConfirm = false;
StateHasChanged();
await Task.Run(async () =>
{
if (OnClick != null)
await OnClick.Invoke();
Working = false;
await InvokeAsync(StateHasChanged);
});
}
}

View File

@@ -0,0 +1,48 @@
@if (!Working)
{
<button class="btn @(CssClasses)" @onclick="Do">
@Text
@ChildContent
</button>
}
else
{
<button class="btn @(CssClasses) disabled" disabled="">
<span class="spinner-border spinner-border-sm align-middle me-2"></span>
@WorkingText
</button>
}
@code
{
private bool Working { get; set; } = false;
[Parameter]
public string CssClasses { get; set; } = "btn-primary";
[Parameter]
public string Text { get; set; } = "";
[Parameter]
public string WorkingText { get; set; } = "";
[Parameter]
public Func<Task>? OnClick { get; set; }
[Parameter]
public RenderFragment ChildContent { get; set; }
private async Task Do()
{
Working = true;
StateHasChanged();
await Task.Run(async () =>
{
if (OnClick != null)
await OnClick.Invoke();
Working = false;
await InvokeAsync(StateHasChanged);
});
}
}

View File

@@ -1,4 +1,5 @@
@using Moonlight.Shared.Layouts
<div class="app-sidebar flex-column @(Layout.ShowMobileSidebar ? "drawer drawer-start drawer-on" : "")">
<div class="app-sidebar-header d-flex flex-stack d-none d-lg-flex pt-8 pb-2">
<a href="/metronic8/demo38/../demo38/index.html" class="app-sidebar-logo">

View File

@@ -0,0 +1,70 @@
@using System.Diagnostics
@using Moonlight.App.Exceptions
@inherits ErrorBoundaryBase
@if (Crashed)
{
if (Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") == "Development") // TODO: Add check for admin perms to show exceptions to admins
{
if (Exception != null)
{
<div class="card border border-danger">
<div class="card-header">
<span class="card-title text-danger fw-bold fs-3">An unhandled exception occured</span>
</div>
<div class="card-body fw-bold">
@(Formatter.FormatLineBreaks(Exception.ToStringDemystified()))
</div>
</div>
}
}
else
{
<h1>Crashed lol :c</h1>
}
}
else
{
if (ErrorMessages.Any())
{
foreach (var errorMessage in ErrorMessages)
{
<div class="alert alert-danger bg-danger text-white p-3 mb-5 fw-bold">
@errorMessage
</div>
}
}
@ChildContent
}
@code
{
private bool Crashed = false;
private List<string> ErrorMessages = new();
private Exception? Exception;
protected override Task OnErrorAsync(Exception exception)
{
if (exception is DisplayException displayException)
{
ErrorMessages.Add(displayException.Message);
Task.Run(async () =>
{
await Task.Delay(TimeSpan.FromSeconds(5));
ErrorMessages.Remove(displayException.Message);
await InvokeAsync(StateHasChanged);
});
}
else
{
Exception = exception;
Crashed = true;
}
Recover();
return Task.CompletedTask;
}
}

View File

@@ -1,5 +1,7 @@
@inherits LayoutComponentBase
<DefaultLayout>
@Body
<SoftErrorHandler>
@Body
</SoftErrorHandler>
</DefaultLayout>

View File

@@ -1,3 +1,20 @@
@page "/"
@using Moonlight.App.Exceptions
<h1>Hello, world!</h1>
<h1>Hello, world!</h1>
<ConfirmButton Text="Crash" WorkingText="Crashing" CssClasses="btn-danger" OnClick="Do" />
<ConfirmButton Text="Crash" WorkingText="Crashing" CssClasses="btn-danger" OnClick="Do2" />
@code
{
private async Task Do()
{
throw new DisplayException("LOL");
}
private async Task Do2()
{
throw new FormatException("LOL");
}
}