83 lines
2.1 KiB
C#
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)
|
|
);
|
|
}
|
|
}
|
|
}
|
|
|