Add basic project management
5 files changed, 112 insertions, 0 deletions
diff --git a/BugMine.Web/Components/IssueImportWorker.razor b/BugMine.Web/Components/IssueImportWorker.razor
new file mode 100644
index 0000000..bc72156
--- /dev/null
+++ b/BugMine.Web/Components/IssueImportWorker.razor
@@ -0,0 +1,25 @@
+@using LibMatrix.Homeservers
+@inject ILogger<IssueImportWorker> Logger
+@if(Client == null) {
+ <span>Not logged in.</span>
+ <a href="/Auth/Login">Login</a>
+} else {
+
+ <span>Logged in as @Client.Homeserver.UserId</span>
+ <a href="/Auth/Logout">Logout</a>
+}
+
+@code {
+
+ private BugMineClient? Client { get; set; }
+ private string Status { get; set; } = "";
+ protected override async Task OnInitializedAsync() {
+ while(Client == null) {
+ Client = await BugMineStorage.GetCurrentSessionOrNull();
+ if(Client == null) {
+ await Task.Delay(1000);
+ }
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/BugMine.Web/Components/ProgressLog.razor b/BugMine.Web/Components/ProgressLog.razor
new file mode 100644
index 0000000..f149ac6
--- /dev/null
+++ b/BugMine.Web/Components/ProgressLog.razor
@@ -0,0 +1,16 @@
+@using System.Collections.ObjectModel
+
+
+@code {
+ private ObservableCollection<string> _messages = new ObservableCollection<string>();
+
+ private ObservableCollection<string> Messages {
+ get => _messages;
+ set {
+ _messages = value;
+ _messages.CollectionChanged += (_, _) => StateHasChanged();
+ StateHasChanged();
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/BugMine.Web/Components/SimpleSpinner.razor b/BugMine.Web/Components/SimpleSpinner.razor
new file mode 100644
index 0000000..920247d
--- /dev/null
+++ b/BugMine.Web/Components/SimpleSpinner.razor
@@ -0,0 +1,18 @@
+<pre style="width: fit-content; height: fit-content; background-color: transparent; color: white; rotate: @(i)deg;">|</pre>
+
+@code {
+ int i = 0;
+ protected override void OnInitialized()
+ {
+ base.OnInitialized();
+ Task.Run(async () =>
+ {
+ while (true)
+ {
+ await Task.Delay(12);
+ i+=10;
+ StateHasChanged();
+ }
+ });
+ }
+}
\ No newline at end of file
diff --git a/BugMine.Web/Components/UpdateAvailableDetector.razor b/BugMine.Web/Components/UpdateAvailableDetector.razor
new file mode 100644
index 0000000..5197a6f
--- /dev/null
+++ b/BugMine.Web/Components/UpdateAvailableDetector.razor
@@ -0,0 +1,38 @@
+@* Source: https://whuysentruit.medium.com/blazor-wasm-pwa-adding-a-new-update-available-notification-d9f65c4ad13 *@
+@inject IJSRuntime _jsRuntime
+
+@if (_newVersionAvailable)
+{
+ <button type="button" class="btn btn-warning shadow floating-update-button" onclick="window.location.reload()">
+ A new version of the application is available. Click here to reload.
+ </button>
+}
+
+@code {
+
+ private bool _newVersionAvailable = false;
+
+ protected override async Task OnInitializedAsync()
+ {
+ await RegisterForUpdateAvailableNotification();
+ }
+
+ private async Task RegisterForUpdateAvailableNotification()
+ {
+ await _jsRuntime.InvokeAsync<object>(
+ identifier: "registerForUpdateAvailableNotification",
+ DotNetObjectReference.Create(this),
+ nameof(OnUpdateAvailable));
+ }
+
+ [JSInvokable(nameof(OnUpdateAvailable))]
+ public Task OnUpdateAvailable()
+ {
+ _newVersionAvailable = true;
+
+ StateHasChanged();
+
+ return Task.CompletedTask;
+ }
+
+}
\ No newline at end of file
diff --git a/BugMine.Web/Components/UpdateAvailableDetector.razor.css b/BugMine.Web/Components/UpdateAvailableDetector.razor.css
new file mode 100644
index 0000000..047ea8d
--- /dev/null
+++ b/BugMine.Web/Components/UpdateAvailableDetector.razor.css
@@ -0,0 +1,15 @@
+.floating-update-button {
+ position: fixed;
+
+ right: 2rem;
+ bottom: 2rem;
+
+ padding: 1rem 1.5rem;
+
+ animation: fadein 2s ease-out;
+}
+
+@keyframes fadein {
+ from { right: -100%; }
+ to { right: 2rem; }
+}
|