refresh on open app

This commit is contained in:
iTob 2024-09-16 09:10:31 +02:00
parent 51212f9354
commit b8eb4725a4
9 changed files with 102 additions and 18 deletions

View File

@ -1,12 +1,33 @@
namespace RBLNews.Maui using RBLNews.Shared.Services;
namespace RBLNews.Maui
{ {
public partial class App : Application public partial class App : Application
{ {
public App() private readonly AppLifecycleService _appLifecycleService;
public App(AppLifecycleService appLifecycleService)
{ {
_appLifecycleService = appLifecycleService;
InitializeComponent(); InitializeComponent();
MainPage = new MainPage(); MainPage = new MainPage();
} }
protected override Window CreateWindow(IActivationState activationState)
{
Window window = base.CreateWindow(activationState);
window.Activated += (sender, eventArgs) =>
{
_appLifecycleService.Activated();
};
window.Resumed += (sender, eventArgs) =>
{
_appLifecycleService.Resumed();
// take actions here...
};
return window;
}
} }
} }

View File

@ -5,11 +5,11 @@
xmlns:shared="clr-namespace:RBLNews.Shared;assembly=RBLNews.Shared" xmlns:shared="clr-namespace:RBLNews.Shared;assembly=RBLNews.Shared"
x:Class="RBLNews.Maui.MainPage" x:Class="RBLNews.Maui.MainPage"
BackgroundColor="{DynamicResource PageBackgroundColor}"> BackgroundColor="{DynamicResource PageBackgroundColor}">
<RefreshView x:Name="RefreshView" Refreshing="RefreshView_Refreshing">
<BlazorWebView x:Name="blazorWebView" HostPage="wwwroot/index.html"> <BlazorWebView x:Name="blazorWebView" HostPage="wwwroot/index.html">
<BlazorWebView.RootComponents> <BlazorWebView.RootComponents>
<RootComponent Selector="#app" ComponentType="{x:Type shared:Components.Routes}" /> <RootComponent Selector="#app" ComponentType="{x:Type shared:Components.Routes}" />
</BlazorWebView.RootComponents> </BlazorWebView.RootComponents>
</BlazorWebView> </BlazorWebView>
</RefreshView>
</ContentPage> </ContentPage>

View File

@ -1,4 +1,6 @@
namespace RBLNews.Maui using RBLNews.Shared.Components.Pages;
namespace RBLNews.Maui
{ {
public partial class MainPage : ContentPage public partial class MainPage : ContentPage
{ {
@ -6,5 +8,15 @@
{ {
InitializeComponent(); InitializeComponent();
} }
void RefreshView_Refreshing(object sender, EventArgs e)
{
if (RefreshablePageBase.Current?.NavigationManager != null)
{
var navigationManager = RefreshablePageBase.Current.NavigationManager;
navigationManager.NavigateTo(navigationManager.Uri, true, true);
RefreshView.IsRefreshing = false;
}
}
} }
} }

View File

@ -20,6 +20,7 @@ namespace RBLNews.Maui
builder.Services.AddBlazorBootstrap(); builder.Services.AddBlazorBootstrap();
builder.Services.AddSingleton<IFeedDataService, FeedDataService>(); builder.Services.AddSingleton<IFeedDataService, FeedDataService>();
builder.Services.AddSingleton<AppLifecycleService>();
#if DEBUG #if DEBUG
builder.Services.AddBlazorWebViewDeveloperTools(); builder.Services.AddBlazorWebViewDeveloperTools();

View File

@ -84,4 +84,6 @@
<Folder Include="IaC\" /> <Folder Include="IaC\" />
</ItemGroup> </ItemGroup>
<ProjectExtensions><VisualStudio><UserProperties XamarinHotReloadDebuggerTimeoutExceptionRBLNewsMauiHideInfoBar="True" /></VisualStudio></ProjectExtensions>
</Project> </Project>

View File

@ -1,14 +1,16 @@
@page "/" @inherits RefreshablePageBase
@page "/"
@using RBLFeederCommon.Enums @using RBLFeederCommon.Enums
@using RBLFeederCommon.Models.RssFeed @using RBLFeederCommon.Models.RssFeed
@using RBLNews.Shared.Services @using RBLNews.Shared.Services
@inject IFeedDataService feedDataService @inject IFeedDataService feedDataService
@inject AppLifecycleService appLifecycleService
@if (FeedDataService.Feeds == null) @if (FeedDataService.Feeds == null)
{ {
<div class="d-flex justify-content-center"> <div class="d-flex justify-content-center">
Lade Feeds ...<br/> Lade Feeds ...<br/><br/>
<Spinner Type="SpinnerType.Grow" Color="SpinnerColor.Primary" Size="SpinnerSize.Large" /> <Spinner Type="SpinnerType.Grow" Color="SpinnerColor.Primary" Size="SpinnerSize.Large" />
</div> </div>
} }
@ -19,7 +21,7 @@ else
<div class="container"> <div class="container">
@foreach (FeedGroupVM feedGrp in this.FeedDataService.Feeds.FeedGroups) @foreach (FeedGroupVM feedGrp in this.FeedDataService.Feeds.FeedGroups)
{ {
<h4><Icon Name="IconName.Calendar2Event" /> @feedGrp.PublishDate.ToString("dd.MM.yyyy")</h4> <h4><Icon Name="IconName.Calendar2Event" /> @feedGrp.PublishDate.ToLocalTime().ToString("dd.MM.yyyy")</h4>
@foreach (FeedVM feed in feedGrp.Feeds) @foreach (FeedVM feed in feedGrp.Feeds)
{ {
<div class="col-xs-12 col-sm-12 col-md-8 col-lg-4"> <div class="col-xs-12 col-sm-12 col-md-8 col-lg-4">
@ -30,7 +32,7 @@ else
</CardBody> </CardBody>
<ul class="list-group list-group-flush"> <ul class="list-group list-group-flush">
<li class="list-group-item"> <li class="list-group-item">
@GetRssSourceName((RssFeedSources)@feed.Source) | @feed.PubDate @GetRssSourceName((RssFeedSources)@feed.Source) | @feed.PubDate?.ToLocalTime()
</li> </li>
</ul> </ul>
<CardFooter> <CardFooter>
@ -52,9 +54,20 @@ else
[Inject] [Inject]
private IFeedDataService FeedDataService { get; set; } private IFeedDataService FeedDataService { get; set; }
protected async override Task OnInitializedAsync() [Inject]
private AppLifecycleService AppLifecycleService { get; set; }
protected override void OnInitialized()
{
AppLifecycleService.OnActivated = LoadFeeds;
LoadFeeds();
}
private async void LoadFeeds()
{ {
await FeedDataService.LoadFeeds(); await FeedDataService.LoadFeeds();
StateHasChanged();
} }
private string GetRssSourceName(RssFeedSources source) private string GetRssSourceName(RssFeedSources source)

View File

@ -0,0 +1,18 @@

using Microsoft.AspNetCore.Components;
namespace RBLNews.Shared.Components.Pages
{
public abstract class RefreshablePageBase : ComponentBase
{
public static RefreshablePageBase Current;
[Inject]
public NavigationManager NavigationManager { get; set; }
protected RefreshablePageBase()
{
Current = this;
}
}
}

View File

@ -0,0 +1,17 @@
namespace RBLNews.Shared.Services
{
public class AppLifecycleService
{
internal Action OnResumed;
internal Action OnActivated;
public void Resumed()
{
OnResumed?.Invoke();
}
public void Activated()
{
OnActivated?.Invoke();
}
}
}

View File

@ -5,9 +5,9 @@ VisualStudioVersion = 17.11.35222.181
MinimumVisualStudioVersion = 10.0.40219.1 MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RBLNews.Maui", "RBLNews.Maui\RBLNews.Maui.csproj", "{671920E6-6BE5-4F41-8F85-EB029567866E}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RBLNews.Maui", "RBLNews.Maui\RBLNews.Maui.csproj", "{671920E6-6BE5-4F41-8F85-EB029567866E}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RBLNews.Web", "RBLNews.Web\RBLNews.Web.csproj", "{0409A1B9-73D9-477E-91C9-80AE3C25C4E9}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RBLNews.Web", "RBLNews.Web\RBLNews.Web.csproj", "{0409A1B9-73D9-477E-91C9-80AE3C25C4E9}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RBLNews.Shared", "RBLNews.Shared\RBLNews.Shared.csproj", "{1A0120DC-700A-4C8E-BC3A-ECFFBE973563}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RBLNews.Shared", "RBLNews.Shared\RBLNews.Shared.csproj", "{1A0120DC-700A-4C8E-BC3A-ECFFBE973563}"
EndProject EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution