about summary refs log tree commit diff
path: root/BugMine.Web/Pages/Projects/ViewProject.razor
blob: c1a2aa1bbe05822c4aac53a66cb494e29eafdcb3 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
@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

<ProgressLog ></ProgressLog>

<ProjectContainer ProjectSlug="@ProjectSlug" ProjectContext="@ProjectContext" Loaded="@OnProjectLoaded">
    <h3>@ProjectContext!.Project!.Info.Name</h3>
    <p>@Followers.Count followers - @Issues?.Count issues</p>
    <LinkButton href="@(typeof(NewIssue).GetCustomAttributes<RouteAttribute>().First().Template.Replace("{ProjectSlug}", ProjectSlug))">New issue</LinkButton>
    @if (Progress == Status.Loading) {
        <p>Loading issues, got @(Issues?.Count ?? 0) so far... <SimpleSpinner/></p>
    }

    @* <p>@Project.Description</p> *@
    @if (Issues != null) {
        @foreach (var issue in Issues) {
            var issueData = issue.Data.TypedContent as BugMineIssueData;
            <div class="issue-card" @onclick="@(() => { NavigationManager.NavigateTo(GetIssueUrl(issue)); })">
                <div style="width: 1em; height: 1em; background-color: #00FF00; display: inline-block;"></div> @* Color based on tags... *@
                <p>@issueData.Name</p>
            </div>
        }
    }
</ProjectContainer>

@code {
    private Status? _progress = Status.Loading;

    public ProjectContainer.ProjectContainerContext? ProjectContext { get; set; } = new();

    [Parameter]
    public string ProjectSlug { get; set; } = null!;

    private List<BugMineIssue>? Issues { get; set; }
    private FrozenSet<StateEventResponse> Followers { get; set; } = FrozenSet<StateEventResponse>.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<BugMineIssue>();
            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<RouteAttribute>().First().Template
            .Replace("{ProjectSlug}", ProjectSlug)
            .Replace("{IssueId}", issue.Data.EventId);

}