@page "/Projects/{ProjectSlug}/" @using LibMatrix @using BugMine.Web.Classes.Exceptions @using ArcaneLibs.Extensions @if (Client is null) {

Authenticating

} else if (Project is null) { @if (Progress == "loading") {

Loading project

} else if (Progress == "not-in-room") {

You are not in the project room.

You must join before you can view or interact with this project.

Attempt to join } } else {

@Project.Info.Name

@if (Constants.Debug) {

Debug, beware: here be dragons!

Dispose room } @if (Progress == "loading-issues") {

Loading issues, got @(Issues?.Count ?? 0) so far...

} @*

@Project.Description

*@ @if (Issues != null) { @foreach(var issue in Issues) {
@issue.Data.RawContent.ToJson()
} } } @code { private string? _progress = "loading"; [Parameter] public string ProjectSlug { get; set; } = null!; private BugMineClient? Client { get; set; } private BugMineProject? Project { get; set; } private List? Issues { get; set; } private string? Progress { get => _progress; set { _progress = value; StateHasChanged(); } } 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; } Progress = "loading-issues"; await foreach (var issue in Project.GetIssues()) { Issues ??= new List(); 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(); } }