SharpRSS/WebSharpRSS/Shared/SideGuide.razor

80 lines
3.3 KiB
Plaintext

@using SharpRss.Models;
@using MudBlazor.Utilities
@using Serilog
@using SharpRss.Services
@using WebSharpRSS.Models;
@using ToolQit.Extensions;
@inject RssService _rssService
@inject NavigationManager _navigation
<MudStack Spacing="2">
<MudTreeView Color="Color.Success" Items="_guideItems" @bind-SelectedValue="SelectedItem" Hover="true">
<ItemTemplate>
<MudTreeViewItem @bind-Expanded="@context.IsExpanded" Value="@context" Items="@context.Children" CanExpand="@context.HasChild" @onclick="ItemClicked">
<Content>
<div style="display: grid; grid-template-columns: 1fr auto; align-items: center; width: 100%">
<div style="justify-self: start;" class="d-flex align-center">
<MudTreeViewItemToggleButton ExpandedChanged="@(() => ExpandedChanged(context))" Loading="@context.Loading" Visible="@context.HasChild" LoadingIconColor="Color.Info" />
@if (context.FaviconUrl == null && context.Icon != null)
{
<MudIcon Icon="@context.Icon" Style="@($"color:{context.GroupModel?.HexColor ?? _theme.Palette.Primary.Value}")"/>
}
else
{
<MudImage Src="@context.FaviconUrl" ObjectFit="ObjectFit.ScaleDown"/>
}
<MudText Class="ml-2">@context.Title</MudText>
</div>
</div>
</Content>
</MudTreeViewItem>
</ItemTemplate>
</MudTreeView>
</MudStack>
@code {
private MudTheme _theme = new MudTheme();
private readonly HashSet<TreeItemData> _guideItems = new HashSet<TreeItemData>();
private TreeItemData? _selectedItem;
private TreeItemData? SelectedItem
{
get => _selectedItem;
set
{
_selectedItem = value;
ItemClicked();
}
}
private void ItemClicked()
{
if (_selectedItem == null) return;
if (_selectedItem.FeedModel != null)
{
_navigation.NavigateTo($"/list?fid={_selectedItem.FeedModel.OriginalUrl}");
}
else if (_selectedItem.GroupModel != null)
{
_navigation.NavigateTo($"/list?gid={_selectedItem.GroupModel.Id}");
}
}
private async void ExpandedChanged(TreeItemData treeItemData)
{
treeItemData.Loading = true;
var groupedItems = await _rssService.GetFeedsAsync(treeItemData.GroupModel?.Id);
treeItemData.Children = ModelToTreeItem(groupedItems);
treeItemData.IsExpanded = !treeItemData.IsExpanded;
treeItemData.Loading = false;
StateHasChanged();
}
protected override async void OnInitialized()
{
Log.Verbose("Loading guide data...");
HashSet<object> items = await _rssService.GetCategoriesFeedsAsync();
_guideItems.UnionWith(ModelToTreeItem(items));
StateHasChanged();
Log.Verbose("Guide initialized!");
}
private HashSet<TreeItemData> ModelToTreeItem<T>(HashSet<T> model) => model.Select(x => x is CategoryModel model ? new TreeItemData(model) : x is FeedModel feedModel ? new TreeItemData(feedModel) : throw new ArgumentException("Item arg is invalid!")).ToHashSet();
}