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 topics = new List(); [Parameter] public EventCallback 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> UpdateTopicsAsync() { var dict = new Dictionary(); 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(dict.Values .OrderByDescending(t => t.Count) .OrderBy(t => t.DispId) ); } } }