From dcc8043cf60751e35e78579e749ca1bd4ce76a60 Mon Sep 17 00:00:00 2001 From: sbwalker Date: Thu, 15 Feb 2024 21:17:23 -0500 Subject: [PATCH] load PageState in App component and pass to SiteRouter to optimize data loading --- Oqtane.Client/UI/PageState.cs | 1 + Oqtane.Client/UI/Routes.razor | 24 +++--- Oqtane.Client/UI/SiteRouter.razor | 14 ++-- Oqtane.Maui/Main.razor | 4 - Oqtane.Maui/MauiProgram.cs | 2 +- Oqtane.Server/Components/App.razor | 129 ++++++++++++++++++----------- 6 files changed, 101 insertions(+), 73 deletions(-) diff --git a/Oqtane.Client/UI/PageState.cs b/Oqtane.Client/UI/PageState.cs index 7d8a5958..71a8ccf1 100644 --- a/Oqtane.Client/UI/PageState.cs +++ b/Oqtane.Client/UI/PageState.cs @@ -25,6 +25,7 @@ namespace Oqtane.UI public string ReturnUrl { get; set; } public bool IsInternalNavigation { get; set; } public Guid RenderId { get; set; } + public bool Refresh { get; set; } public List Pages { diff --git a/Oqtane.Client/UI/Routes.razor b/Oqtane.Client/UI/Routes.razor index 3b0f5191..5abd9703 100644 --- a/Oqtane.Client/UI/Routes.razor +++ b/Oqtane.Client/UI/Routes.razor @@ -16,8 +16,8 @@ @if (string.IsNullOrEmpty(_installation.Message)) {
- - + +
} @@ -32,7 +32,7 @@ @code { [Parameter] - public string AntiForgeryToken { get; set; } + public PageState PageState { get; set; } = null; [Parameter] public string RenderMode { get; set; } @@ -41,13 +41,10 @@ public string Runtime { get; set; } [Parameter] - public int VisitorId { get; set; } + public string AntiForgeryToken { get; set; } = ""; [Parameter] - public string RemoteIPAddress { get; set; } - - [Parameter] - public string AuthorizationToken { get; set; } + public string AuthorizationToken { get; set; } = ""; [CascadingParameter] HttpContext HttpContext { get; set; } @@ -56,18 +53,23 @@ private string _display = ""; private Installation _installation = new Installation { Success = false, Message = "" }; - private PageState PageState { get; set; } + private PageState _pageState { get; set; } protected override async Task OnParametersSetAsync() { + if (PageState != null) + { + _pageState = PageState; + } + if (RenderMode == RenderModes.Interactive) { _display = "display: none;"; } - SiteState.RemoteIPAddress = RemoteIPAddress; SiteState.AntiForgeryToken = AntiForgeryToken; SiteState.AuthorizationToken = AuthorizationToken; + SiteState.RemoteIPAddress = (_pageState != null) ? _pageState.RemoteIPAddress : ""; SiteState.IsPrerendering = (HttpContext != null) ? true : false; _installation = await InstallationService.IsInstalled(); @@ -90,7 +92,7 @@ private void ChangeState(PageState pageState) { - PageState = pageState; + _pageState = pageState; StateHasChanged(); } } diff --git a/Oqtane.Client/UI/SiteRouter.razor b/Oqtane.Client/UI/SiteRouter.razor index 3a0081a3..752ff996 100644 --- a/Oqtane.Client/UI/SiteRouter.razor +++ b/Oqtane.Client/UI/SiteRouter.razor @@ -35,9 +35,6 @@ [Parameter] public string Runtime { get; set; } - [Parameter] - public int VisitorId { get; set; } - [CascadingParameter] PageState PageState { get; set; } @@ -68,7 +65,7 @@ protected override async Task OnParametersSetAsync() { - if (PageState == null) + if (PageState == null || PageState.Refresh) { await Refresh(); } @@ -100,6 +97,7 @@ var editmode = false; var refresh = false; var lastsyncdate = DateTime.MinValue; + var visitorId = -1; _error = ""; Route route = new Route(_absoluteUri, SiteState.Alias.Path); @@ -148,6 +146,7 @@ { editmode = PageState.EditMode; lastsyncdate = PageState.LastSyncDate; + visitorId = PageState.VisitorId; } if (PageState?.Page.Path != route.PagePath) { @@ -159,7 +158,7 @@ } // get user - if (PageState == null || refresh || PageState.Alias.SiteId != SiteState.Alias.SiteId) + if (PageState == null || PageState.Refresh || refresh || PageState.Alias.SiteId != SiteState.Alias.SiteId) { var authState = await AuthenticationStateProvider.GetAuthenticationStateAsync(); // verify user is authenticated for current site @@ -293,11 +292,12 @@ LastSyncDate = lastsyncdate, RenderMode = RenderMode, Runtime = (Shared.Runtime)Enum.Parse(typeof(Shared.Runtime), Runtime), - VisitorId = VisitorId, + VisitorId = visitorId, RemoteIPAddress = SiteState.RemoteIPAddress, ReturnUrl = returnurl, IsInternalNavigation = _isInternalNavigation, - RenderId = Guid.NewGuid() + RenderId = Guid.NewGuid(), + Refresh = false }; OnStateChange?.Invoke(_pagestate); diff --git a/Oqtane.Maui/Main.razor b/Oqtane.Maui/Main.razor index a00a2e9b..bf24f4c2 100644 --- a/Oqtane.Maui/Main.razor +++ b/Oqtane.Maui/Main.razor @@ -19,12 +19,8 @@ else protected override void OnInitialized() { Parameters = new Dictionary(); - Parameters.Add(new KeyValuePair("AntiForgeryToken", "")); Parameters.Add(new KeyValuePair("RenderMode", RenderModes.Interactive)); Parameters.Add(new KeyValuePair("Runtime", Runtimes.Hybrid)); - Parameters.Add(new KeyValuePair("VisitorId", -1)); - Parameters.Add(new KeyValuePair("RemoteIPAddress", "")); - Parameters.Add(new KeyValuePair("AuthorizationToken", "")); if (MauiConstants.UseAppSettings) { diff --git a/Oqtane.Maui/MauiProgram.cs b/Oqtane.Maui/MauiProgram.cs index fe147872..cd81526b 100644 --- a/Oqtane.Maui/MauiProgram.cs +++ b/Oqtane.Maui/MauiProgram.cs @@ -47,7 +47,7 @@ public static class MauiProgram builder.Services.AddOqtaneAuthentication(); // register scoped core services - builder.Services.AddOqtaneScopedServices(); + builder.Services.AddOqtaneClientScopedServices(); var assemblies = AppDomain.CurrentDomain.GetOqtaneAssemblies(); foreach (var assembly in assemblies) diff --git a/Oqtane.Server/Components/App.razor b/Oqtane.Server/Components/App.razor index 83cc43f1..e8103ca2 100644 --- a/Oqtane.Server/Components/App.razor +++ b/Oqtane.Server/Components/App.razor @@ -20,7 +20,7 @@ @inject IAntiforgery Antiforgery @inject IConfigManager ConfigManager @inject ITenantManager TenantManager -@inject ISiteRepository SiteRepository +@inject ISiteService SiteService @inject IPageRepository PageRepository @inject IThemeRepository ThemeRepository @inject ILanguageRepository LanguageRepository @@ -31,63 +31,66 @@ @inject IVisitorRepository VisitorRepository @inject IJwtManager JwtManager - - - - - - - - - - @if (!string.IsNullOrEmpty(_PWAScript)) - { - - } - @((MarkupString)_styleSheets) - - - @if (_renderMode == RenderModes.Static) - { - - } - else - { - - } - @((MarkupString)_headResources) - - - @if (string.IsNullOrEmpty(_message)) - { +@if (_pageState != null) +{ + + + + + + + + + + @if (!string.IsNullOrEmpty(_PWAScript)) + { + + } + @((MarkupString)_styleSheets) + + @if (_renderMode == RenderModes.Static) { - + } else { - + } - - - - - @if (!string.IsNullOrEmpty(_reconnectScript)) + @((MarkupString)_headResources) + + + @if (string.IsNullOrEmpty(_message)) { - @((MarkupString)_reconnectScript) + @if (_renderMode == RenderModes.Static) + { + + } + else + { + + } + + + + + @if (!string.IsNullOrEmpty(_reconnectScript)) + { + @((MarkupString)_reconnectScript) + } + @if (!string.IsNullOrEmpty(_PWAScript)) + { + @((MarkupString)_PWAScript) + } + @((MarkupString)_bodyResources) } - @if (!string.IsNullOrEmpty(_PWAScript)) + else { - @((MarkupString)_PWAScript) +
@_message
} - @((MarkupString)_bodyResources) - } - else - { -
@_message
- } - - + + +} @code { private string _renderMode = RenderModes.Interactive; @@ -104,12 +107,13 @@ private string _PWAScript = ""; private string _reconnectScript = ""; private string _message = ""; + private PageState _pageState; // CascadingParameter is required to access HttpContext [CascadingParameter] HttpContext Context { get; set; } - protected override void OnInitialized() + protected override async Task OnInitializedAsync() { _antiForgeryToken = Antiforgery.GetAndStoreTokens(Context).RequestToken; _remoteIPAddress = Context.Connection.RemoteIpAddress?.ToString() ?? ""; @@ -127,7 +131,7 @@ HandleDefaultAliasRedirect(alias, url); } - var site = SiteRepository.GetSite(alias.SiteId); + var site = await SiteService.GetSiteAsync(alias.SiteId); if (site != null && (!site.IsDeleted || url.Contains("admin/site")) && site.RenderMode != RenderModes.Headless) { _renderMode = site.RenderMode; @@ -226,6 +230,31 @@ _language = culture.Split('|')[0]; _language = _language.Replace("c=", ""); } + + // create initial PageState + _pageState = new PageState + { + Alias = alias, + Site = site, + Page = page, + User = null, + Uri = new Uri(url, UriKind.Absolute), + Route = route, + QueryString = Utilities.ParseQueryString(route.Query), + UrlParameters = route.UrlParameters, + ModuleId = -1, + Action = "", + EditMode = false, + LastSyncDate = DateTime.MinValue, + RenderMode = _renderMode, + Runtime = (Shared.Runtime)Enum.Parse(typeof(Shared.Runtime), _runtime), + VisitorId = _visitorId, + RemoteIPAddress = _remoteIPAddress, + ReturnUrl = "", + IsInternalNavigation = false, + RenderId = Guid.NewGuid(), + Refresh = true + }; } else {