diff --git a/YouHaveIssues/Components/RepoView.razor b/YouHaveIssues/Components/RepoView.razor index 61e0a33..c6c4955 100644 --- a/YouHaveIssues/Components/RepoView.razor +++ b/YouHaveIssues/Components/RepoView.razor @@ -23,7 +23,6 @@ else
All
- @foreach (var a in Repository.AllAreas) {
@@ -39,12 +38,12 @@ else
@m.Name
-
@m.TotalCount
+
@m.TotalCount
@foreach (var a in Repository.AllAreas) {
-
@(m.Areas.TryGetValue(a, out var area) ? area.Count : 0)
+
@(m.Areas.TryGetValue(a, out var area) ? area.Count : 0)
} @@ -53,32 +52,34 @@ else

- Refreshed @Repository.RefreshTime.Humanize() | Rate Limit: @Repository.RateLimit.Remaining / @Repository.RateLimit.Limit (Resets in @((Repository.RateLimit.Reset - DateTimeOffset.UtcNow).Humanize())) | - @GetBuildInfo() + Refreshed @Repository.RefreshTime.Humanize() | Rate Limit: @RateLimitInfo(Repository) | @GetBuildInfo()

} @code { - [Parameter] public string Organization { get; set; } + [Parameter] public string? Organization { get; set; } - [Parameter] public string Name { get; set; } + [Parameter] public string? Name { get; set; } - protected Repository Repository { get; private set; } + protected Repository? Repository { get; private set; } protected override async Task OnInitializedAsync() { - Repository = await IssuesByRepository.GetRepository(Organization, Name); + if (Organization != null && Name != null) + { + Repository = await IssuesByRepository.GetRepository(Organization, Name); + } } - private string AreaName(string name) + private static string AreaName(string name) { return name.StartsWith("area-") ? name.Substring("area-".Length) : name; } - private string BackgroundFor(Milestone milestone, string areaName) + private static string? BackgroundFor(Milestone milestone, string areaName) { if (!milestone.Areas.TryGetValue(areaName, out var query)) { @@ -88,37 +89,37 @@ else return null; } - private string BackgroundFor(int count) + private static string? BackgroundFor(int count) { return count == 0 ? "bg-success" : null; } - private string LinkFor(Milestone milestone) + private static string LinkFor(Repository repository, Milestone milestone) { var m = milestone.Name == IssuesByRepository.NoMilestone ? $"no%3Amilestone" : $"milestone%3A{Escape(milestone.Name)}"; - return $"https://github.com/{Repository.Organization}/{Repository.Name}/issues?q=is%3Aopen+is%3Aissue+{m}"; + return $"https://github.com/{repository.Organization}/{repository.Name}/issues?q=is%3Aopen+is%3Aissue+{m}"; } - private string LinkFor(Milestone milestone, string areaName) + private static string LinkFor(Repository repository, Milestone milestone, string areaName) { var a = areaName == IssuesByRepository.NoArea - ? $"-label%3A{string.Join("+-label%3A", Repository.AllAreas.Except(new[] {IssuesByRepository.NoArea}).Select(a => Escape(a)))}" + ? $"-label%3A{string.Join("+-label%3A", repository.AllAreas.Except(new[] {IssuesByRepository.NoArea}).Select(a => Escape(a)))}" : $"label%3A{areaName}"; - return $"{LinkFor(milestone)}+{a}"; + return $"{LinkFor(repository, milestone)}+{a}"; } - private string Escape(string s) + private static string Escape(string s) { return s.Contains(' ') ? $"\"{s.Replace(' ', '+')}\"" : s; } - private string GetBuildInfo() + private static string GetBuildInfo() { if (Program.SourceVersion == null) { @@ -133,4 +134,14 @@ else var sha = Program.SourceVersion?.Substring(0, 6); return $"Built for branch {branch}@{sha}"; } + + private static string RateLimitInfo(Repository repository) + { + if (repository.RateLimit == null) + { + return "unknown"; + } + + return $"{repository.RateLimit.Remaining} / {repository.RateLimit.Limit}(Resets in {(repository.RateLimit.Reset - DateTimeOffset.UtcNow).Humanize()})"; + } } diff --git a/YouHaveIssues/Data/IssuesByRepository.cs b/YouHaveIssues/Data/IssuesByRepository.cs index ea906c6..1c7faeb 100644 --- a/YouHaveIssues/Data/IssuesByRepository.cs +++ b/YouHaveIssues/Data/IssuesByRepository.cs @@ -86,7 +86,7 @@ private async Task GetRepositoryCore(string organization, string nam } catch (Exception e) { - return new Repository(e); + return new Repository(organization, name, e); } foreach (var issue in issues) diff --git a/YouHaveIssues/Data/Repository.cs b/YouHaveIssues/Data/Repository.cs index 4cea039..3083012 100644 --- a/YouHaveIssues/Data/Repository.cs +++ b/YouHaveIssues/Data/Repository.cs @@ -10,14 +10,14 @@ public class Repository { private readonly Lazy> allAreas; - public Exception Exception { get; } + public Exception? Exception { get; } public string Organization { get; } public string Name { get; } public IList Milestones { get; } - public RateLimit RateLimit { get; } + public RateLimit? RateLimit { get; } public DateTimeOffset RefreshTime { get; } public IEnumerable AllAreas => allAreas.Value; @@ -33,9 +33,14 @@ public Repository(string organization, string name, IList milestones, new HashSet(Milestones.SelectMany(m => m.Areas.Keys).OrderBy(a => a).ToList())); } - public Repository(Exception exception) + public Repository(string organization, string name, Exception exception) { + Organization = organization; + Name = name; this.Exception = exception; + + Milestones = Array.Empty(); + allAreas = new Lazy>(() => Enumerable.Empty()); } } } diff --git a/YouHaveIssues/Shared/NavMenu.razor b/YouHaveIssues/Shared/NavMenu.razor index 6cea8a0..ffcadc4 100644 --- a/YouHaveIssues/Shared/NavMenu.razor +++ b/YouHaveIssues/Shared/NavMenu.razor @@ -33,7 +33,7 @@ @code { private bool collapseNavMenu = true; - private string NavMenuCssClass => collapseNavMenu ? "collapse" : null; + private string? NavMenuCssClass => collapseNavMenu ? "collapse" : null; private void ToggleNavMenu() { diff --git a/YouHaveIssues/YouHaveIssues.csproj b/YouHaveIssues/YouHaveIssues.csproj index 4b504a3..d86a47f 100644 --- a/YouHaveIssues/YouHaveIssues.csproj +++ b/YouHaveIssues/YouHaveIssues.csproj @@ -4,6 +4,7 @@ netcoreapp3.1 0d46fac9-2d16-49df-8482-5e8849e105a0 Linux + enable