RBLNews/RBLNews.Shared/Components/Pages/Feeds.razor
2024-09-19 15:14:28 +02:00

164 lines
4.1 KiB
Plaintext

@inherits RefreshablePageBase
@page "/"
@using RBLFeederCommon.Enums
@using RBLFeederCommon.Models.RssFeed
@using RBLNews.Shared.Components.Controls
@using RBLNews.Shared.Services
@inject IFeedDataService feedDataService
@inject AppLifecycleService appLifecycleService
@if (FeedGroups == null)
{
<div class="d-flex justify-content-center">
<Spinner Type="SpinnerType.Grow" Color="SpinnerColor.Primary" Size="SpinnerSize.Large"/>
</div>
}
else
{
<div id="feeds-page">
<div class="container-fluid">
<section id="filter">
@foreach (IGrouping<int, int> sGrouping in SourceGroupings)
{
<BadgeWithCounter
ShowCount="true"
Source="(RssFeedSources)sGrouping.Key"
OnClickedCallback="OnClicked"
Text="@GetRssSourceName((RssFeedSources)sGrouping.Key)"
Count="@sGrouping.Count()">
</BadgeWithCounter>
}
</section>
<section id="feeds-list">
@foreach (FeedGroupVM feedGrp in FeedGroups)
{
<h1>
<Icon Name="IconName.Calendar2Event"/> @feedGrp.PublishDate.ToLocalTime().ToString("dd.MM.yyyy")
</h1>
@foreach (FeedVM feed in feedGrp.Feeds)
{
<div class="col-xs-12 col-sm-12 col-md-8 col-lg-4">
<Card>
<CardBody>
<CardTitle>@feed.Title</CardTitle>
<CardText>@feed.Description</CardText>
<div class="row">
<Button Outline="true" Color="ButtonColor.Primary" Class="btn-sm align-self-end ml-auto" To="@feed.Link" Type="ButtonType.Link"><Icon Name="IconName.Link"/> Öffnen</Button>
</div>
</CardBody>
@* <ul class="list-group list-group-flush"> *@
@* <li class="list-group-item"> *@
@* <div class="row"> *@
@* <Button Outline="true" Color="ButtonColor.Primary" Class="btn-sm align-self-end ml-auto" To="@feed.Link" Type="ButtonType.Link"><Icon Name="IconName.Link"/> Öffnen</Button> *@
@* </div> *@
@* </li> *@
@* </ul> *@
<CardFooter>
@GetRssSourceName((RssFeedSources)@feed.Source) | @feed.PubDate?.ToLocalTime()
</CardFooter>
</Card>
<br/>
</div>
}
}
</section>
</div>
</div>
}
@code {
[Inject] private IFeedDataService FeedDataService { get; set; }
[Inject] private AppLifecycleService AppLifecycleService { get; set; }
private List<FeedGroupVM>? FeedGroups { get; set; }
private IEnumerable<IGrouping<int, int>> SourceGroupings { get; set; } = new List<IGrouping<int, int>>();
private List<RssFeedSources> activeFilters = new List<RssFeedSources>();
protected override void OnInitialized()
{
AppLifecycleService.OnActivated = LoadFeeds;
LoadFeeds();
}
private async void LoadFeeds()
{
// Copy feed list to keep original list
await FeedDataService.LoadFeeds();
FeedGroups = [.. FeedDataService.Feeds.FeedGroups];
List<FeedGroupVM> listTmp = [.. FeedDataService.Feeds.FeedGroups];
SourceGroupings = listTmp.SelectMany(fg => fg.Feeds.Select(f => f.Source)).GroupBy(sources => sources);
StateHasChanged();
}
private string GetRssSourceName(RssFeedSources source)
{
switch (source)
{
case RssFeedSources.RbLive:
case RssFeedSources.NitterRbLive:
return "RBLive!";
case RssFeedSources.NitterFabrizioRomano:
return "Fabrizio Romano";
case RssFeedSources.Lvz:
return "LVZ";
case RssFeedSources.Kicker:
return "Kicker";
case RssFeedSources.Bild:
return "BILD";
case RssFeedSources.Transfermarkt:
return "Transfermarkt";
default:
return "?";
}
}
private void OnClicked(RssFeedSources source)
{
if (activeFilters.Contains(source))
activeFilters.Remove(source);
else
{
activeFilters.Add(source);
}
if (!activeFilters.Any())
{
FeedGroups = [.. FeedDataService.Feeds.FeedGroups];
return;
}
FeedGroups = new List<FeedGroupVM>();
foreach (FeedGroupVM fg in FeedDataService.Feeds.FeedGroups)
{
List<FeedVM> feeds = fg.Feeds.Where(f => activeFilters.Contains((RssFeedSources)f.Source)).ToList();
if (feeds.Any())
{
FeedGroups.Add(
new FeedGroupVM
{
Feeds = feeds,
PublishDate = fg.PublishDate
});
}
}
StateHasChanged();
}
}