blog3000/Blog3000/Client/Shared/TopicCloud.razor.cs

83 lines
2.1 KiB
C#

using Microsoft.AspNetCore.Components;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace Blog3000.Client.Shared
{
public partial class TopicCloud: IDisposable
{
public class Topic
{
public string DispId;
public int Count;
}
[Inject]
private BlogDb BlogDb { get; set; }
private List<Topic> topics = new List<Topic>();
[Parameter]
public EventCallback<string> OnTopicClick { get; set; }
public void Dispose()
{
BlogDb.BlogPostsChanged -= BlogDb_BlogPostsChanged;
}
protected override async Task OnInitializedAsync()
{
topics = await UpdateTopicsAsync();
BlogDb.BlogPostsChanged += BlogDb_BlogPostsChanged;
}
private async void BlogDb_BlogPostsChanged(object sender, EventArgs e)
{
topics = await UpdateTopicsAsync();
StateHasChanged();
}
private void TopicClicked(string topic)
{
//System.Diagnostics.Debug.WriteLine(topic);
OnTopicClick.InvokeAsync(topic);
}
private async Task<List<Topic>> UpdateTopicsAsync()
{
var dict = new Dictionary<string, Topic>();
foreach (var bp in await BlogDb.GetHeadersAsync().ToListAsync())
{
if (bp != null && bp.Topics != null)
{
foreach (var t in bp.Topics)
{
Topic tp;
if (!dict.TryGetValue(t, out tp))
{
tp = new Topic();
tp.DispId = t;
dict.Add(tp.DispId, tp);
}
tp.Count++;
}
}
}
return new List<Topic>(dict.Values
.OrderByDescending(t => t.Count)
.OrderBy(t => t.DispId)
);
}
}
}