@page "/Projects/{ProjectSlug}/" @using System.Collections.Frozen @using System.Reflection @using ArcaneLibs.Extensions @using BugMine.Sdk.Events.Timeline @using BugMine.Web.Pages.Projects.Issues @using BugMine.Web.Components.ScopedContainers @using LibMatrix

@ProjectContext!.Project!.Info.Name

@Followers.Count followers - @Issues?.Count issues

New issue @if (Progress == Status.Loading) {

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

} @*

@Project.Description

*@ @if (Issues != null) { @foreach (var issue in Issues) { var issueData = issue.Data.TypedContent as BugMineIssueData;
@* Color based on tags... *@

@issueData.Name

} }
@code { private Status? _progress = Status.Loading; public ProjectContainer.ProjectContainerContext? ProjectContext { get; set; } = new(); [Parameter] public string ProjectSlug { get; set; } = null!; private List? Issues { get; set; } private FrozenSet Followers { get; set; } = FrozenSet.Empty; private Status? Progress { get => _progress; set { _progress = value; StateHasChanged(); } } protected async Task OnProjectLoaded() { Progress = Status.Loading; ProjectContext!.Project!.Room.GetMembersListAsync().ContinueWith(x => { Followers = x.Result; StateHasChanged(); }); await foreach (var issue in ProjectContext.Project.GetIssues(chunkLimit: 1000)) { Issues ??= new List(); Issues.Add(issue); // StateHasChanged(); if (Issues.Count % 1000 == 0) { StateHasChanged(); Console.WriteLine($"Got issue {Issues.Count} {issue.Data.RawContent.ToJson()}"); } } Progress = Status.Done; StateHasChanged(); } private enum Status { Loading, Done } private string GetIssueUrl(BugMineIssue issue) => typeof(ViewIssue).GetCustomAttributes().First().Template .Replace("{ProjectSlug}", ProjectSlug) .Replace("{IssueId}", issue.Data.EventId); }