diff --git a/BugMine.Web/Components/ProjectContainer.razor b/BugMine.Web/Components/ProjectContainer.razor
new file mode 100644
index 0000000..f7621be
--- /dev/null
+++ b/BugMine.Web/Components/ProjectContainer.razor
@@ -0,0 +1,152 @@
+@using System.Text.Json.Serialization
+@using ArcaneLibs.Extensions
+@using BugMine.Web.Classes.Exceptions
+@using LibMatrix
+@inject ILogger<ProjectContainer> Logger
+
+@if (Constants.Debug) {
+ <p>Debug, beware: here be dragons!</p>
+ <p>ProjectContainer debug info:</p>
+ <pre>Slug: @ProjectSlug</pre>
+ <pre>Progress: @Progress.ToString()</pre>
+ @if (ProjectContext is null) {
+ <pre>ProjectContext is null!</pre>
+ }
+ else {
+ <details>
+ <summary>Context json dump</summary>
+ <pre>@ProjectContext.ToJson()</pre>
+ </details>
+ @if (ProjectContext?.Project?.Room is not null) {
+ <LinkButton OnClick="@ProjectContext.Project.Room.PermanentlyBrickRoomAsync">Dispose room</LinkButton>
+ }
+ }
+
+ <hr/>
+}
+@if (ProjectContext.Client is null) {
+ <p>Authenticating</p>
+}
+else if (ProjectContext?.Project is null) {
+ @if (Progress == Status.Loading) {
+ <p>Loading project <SimpleSpinner/></p>
+ }
+ else if (Progress == Status.NotInRoom) {
+ <p>You are not in the project room.</p>
+ <p>You must join before you can view or interact with this project.</p>
+ <LinkButton OnClick="TryJoin">Attempt to join</LinkButton>
+ }
+ else if (Progress == Status.RoomNotFound) {
+ <p>Project not found.</p>
+ <p>If you believe this is an error, please contact the project in order to obtain a new room.</p>
+ }
+}
+else {
+ @ChildContent
+}
+
+@code {
+ private Status? _progress = Status.Loading;
+
+ [Parameter]
+ public string ProjectSlug { get; set; } = null!;
+
+ [Parameter]
+ public ProjectContainerContext? ProjectContext { get; set; }
+
+ [Parameter]
+ public RenderFragment ChildContent { get; set; }
+
+ [Parameter]
+ public Func<Task>? Loaded { get; set; }
+
+ private Status? Progress {
+ get => _progress;
+ set {
+ _progress = value;
+ StateHasChanged();
+ }
+ }
+
+ protected override async Task OnInitializedAsync() {
+ if (ProjectContext is null) {
+ Logger.LogError("ProjectContext is null");
+ ProjectContext = new();
+ }
+
+ if (ProjectContext.Project != null) {
+ Logger.LogWarning("ProjectContext.Project is not null");
+ }
+
+ ProjectContext.Client ??= await BugMineStorage.GetCurrentSessionOrNavigate();
+ if (ProjectContext.Client == null) {
+ return;
+ }
+
+ Progress = Status.Loading;
+
+ try {
+ ProjectContext.Project = await ProjectContext.Client.GetProject(ProjectSlug);
+ }
+ catch (MatrixException e) {
+ if (e.ErrorCode == BugMineException.ErrorCodes.UserNotInRoom) {
+ Progress = Status.NotInRoom;
+ return;
+ }
+ else if (e.ErrorCode == BugMineException.ErrorCodes.ProjectNotFound) {
+ Progress = Status.RoomNotFound;
+ return;
+ }
+
+ throw;
+ }
+
+ Progress = Status.Done;
+ if (Loaded != null) {
+ await Loaded.Invoke();
+ }
+
+
+ StateHasChanged();
+ }
+
+ private async Task TryJoin() {
+ var room = await ProjectContext.Client.ResolveProjectSlug(ProjectSlug);
+ bool success = false;
+ while (!success) {
+ try {
+ await room.JoinAsync();
+ if (!string.IsNullOrWhiteSpace(room.RoomId)) {
+ success = true;
+ }
+ else {
+ await Task.Delay(1000);
+ }
+ }
+ catch (MatrixException e) {
+ // if (e.ErrorCode == MatrixException.ErrorCodes.) {
+ // await Task.Delay(1000);
+ // continue;
+ // }
+
+ throw;
+ }
+ }
+
+ await OnInitializedAsync();
+ }
+
+ public class ProjectContainerContext {
+ public BugMineClient? Client { get; set; }
+
+ public BugMineProject? Project { get; set; }
+ }
+
+ private enum Status {
+ Loading,
+ NotInRoom,
+ RoomNotFound,
+ Done
+ }
+
+}
\ No newline at end of file
diff --git a/BugMine.Web/Pages/Projects/Index.razor b/BugMine.Web/Pages/Projects/Index.razor
index 8f46d02..9755dc3 100644
--- a/BugMine.Web/Pages/Projects/Index.razor
+++ b/BugMine.Web/Pages/Projects/Index.razor
@@ -46,7 +46,7 @@ else {
int count = 0;
SemaphoreSlim semaphore = new(16, 16);
- await foreach (var project in Client.GetProjects(semaphore)) {
+ await foreach (var project in Client.GetProjects(semaphore, ignoreInvalidBoards: true)) {
Projects ??= [];
Projects.Add(project);
if(count++ <= 250 || count % 4 == 0)
diff --git a/BugMine.Web/Pages/Projects/Issues/NewIssue.razor b/BugMine.Web/Pages/Projects/Issues/NewIssue.razor
new file mode 100644
index 0000000..159e20d
--- /dev/null
+++ b/BugMine.Web/Pages/Projects/Issues/NewIssue.razor
@@ -0,0 +1,15 @@
+@page "/Projects/{ProjectSlug}/Issues/New"
+<h3>New issue</h3>
+
+<ProjectContainer ProjectSlug="@ProjectSlug" ProjectContext="@ProjectContext">
+ <h1>Hi from NewIssue!</h1>
+</ProjectContainer>
+
+@code {
+
+ [Parameter]
+ public string ProjectSlug { get; set; } = null!;
+
+ public ProjectContainer.ProjectContainerContext? ProjectContext { get; set; } = new();
+
+}
\ No newline at end of file
diff --git a/BugMine.Web/Pages/Projects/NewProject.razor b/BugMine.Web/Pages/Projects/NewProject.razor
index 00b7b21..f8c7dfd 100644
--- a/BugMine.Web/Pages/Projects/NewProject.razor
+++ b/BugMine.Web/Pages/Projects/NewProject.razor
@@ -1,5 +1,6 @@
@page "/Projects/New"
@using ArcaneLibs.Extensions
+@using LibMatrix
<h3>New project</h3>
<span>Project name: </span>
@@ -20,10 +21,25 @@
<br/>
}
-<LinkButton OnClick="@CreateProject">Create project</LinkButton>
+@if (!_busy) {
+ <LinkButton OnClick="@CreateProject">Create project</LinkButton>
+}
+else {
+ <p>Powering up the framework... <SimpleSpinner/></p>
+}
@code {
+ private bool _busy = false;
+
+ private bool Busy {
+ get => _busy;
+ set {
+ _busy = value;
+ StateHasChanged();
+ }
+ }
+
private BugMineClient? Client { get; set; }
private readonly ProjectInfo _request = new();
@@ -39,9 +55,15 @@
if (Client == null) {
return;
}
+ Busy = true;
+ try {
+ var proj = await Client.CreateProject(_request);
+ NavigationManager.NavigateTo($"/Projects/{proj.ProjectSlug}/");
- var proj = await Client.CreateProject(_request);
- NavigationManager.NavigateTo($"/Projects/{proj.ProjectSlug}/");
+ }
+ catch (MatrixException e) {
+
+ }
}
}
\ No newline at end of file
diff --git a/BugMine.Web/Pages/Projects/ViewProject.razor b/BugMine.Web/Pages/Projects/ViewProject.razor
index ec10d1c..91cc4d0 100644
--- a/BugMine.Web/Pages/Projects/ViewProject.razor
+++ b/BugMine.Web/Pages/Projects/ViewProject.razor
@@ -5,48 +5,30 @@
<ProgressLog ></ProgressLog>
-@if (Client is null) {
- <p>Authenticating</p>
-}
-else if (Project is null) {
- @if (Progress == "loading") {
- <p>Loading project <SimpleSpinner/></p>
- }
- else if (Progress == "not-in-room") {
- <p>You are not in the project room.</p>
- <p>You must join before you can view or interact with this project.</p>
- <LinkButton OnClick="TryJoin">Attempt to join</LinkButton>
- }
-}
-else {
- <h1>@Project.Info.Name</h1>
+<ProjectContainer ProjectSlug="@ProjectSlug" ProjectContext="@ProjectContext" Loaded="@OnProjectLoaded">
+ <h1>Hi from ViewProject!</h1>
+ <h1>@ProjectContext!.Project!.Info.Name</h1>
- @if (Constants.Debug) {
- <p>Debug, beware: here be dragons!</p>
- <LinkButton OnClick="@Project.Room.PermanentlyBrickRoomAsync">Dispose room</LinkButton>
- }
-
@if (Progress == "loading-issues") {
<p>Loading issues, got @(Issues?.Count ?? 0) so far... <SimpleSpinner/></p>
}
+
@* <p>@Project.Description</p> *@
@if (Issues != null) {
- @foreach(var issue in Issues) {
+ @foreach (var issue in Issues) {
<pre>@issue.Data.RawContent.ToJson()</pre>
}
}
-}
+</ProjectContainer>
@code {
private string? _progress = "loading";
+ public ProjectContainer.ProjectContainerContext? ProjectContext { get; set; } = new();
+
[Parameter]
public string ProjectSlug { get; set; } = null!;
- private BugMineClient? Client { get; set; }
-
- private BugMineProject? Project { get; set; }
-
private List<BugMineIssue>? Issues { get; set; }
private string? Progress {
@@ -57,64 +39,15 @@ else {
}
}
- protected override async Task OnInitializedAsync() {
- Client ??= await BugMineStorage.GetCurrentSessionOrNavigate();
- if (Client == null) {
- return;
- }
-
- Progress = "loading";
- StateHasChanged();
-
- try {
- Project = await Client.GetProject(ProjectSlug);
- }
- catch (MatrixException e) {
- if (e.ErrorCode == BugMineException.ErrorCodes.UserNotInRoom) {
- Progress = "not-in-room";
- StateHasChanged();
- return;
- }
-
- throw;
- }
-
+ protected async Task OnProjectLoaded() {
Progress = "loading-issues";
- await foreach (var issue in Project.GetIssues()) {
+ await foreach (var issue in ProjectContext.Project.GetIssues()) {
Issues ??= new List<BugMineIssue>();
Issues.Add(issue);
StateHasChanged();
}
-
StateHasChanged();
}
- private async Task TryJoin() {
- var room = await Client.ResolveProjectSlug(ProjectSlug);
- bool success = false;
- while (!success) {
- try {
- await room.JoinAsync();
- if (!string.IsNullOrWhiteSpace(room.RoomId)) {
- success = true;
- }
- else {
- await Task.Delay(1000);
- }
- }
- catch (MatrixException e) {
- // if (e.ErrorCode == MatrixException.ErrorCodes.) {
- // await Task.Delay(1000);
- // continue;
- // }
-
- throw;
- }
- }
-
- await OnInitializedAsync();
- }
-
-}
-
+}
\ No newline at end of file
|