load PageState in App component and pass to SiteRouter to optimize data loading

This commit is contained in:
sbwalker 2024-02-15 21:17:23 -05:00
parent ebadccbe25
commit dcc8043cf6
6 changed files with 101 additions and 73 deletions

View File

@ -25,6 +25,7 @@ namespace Oqtane.UI
public string ReturnUrl { get; set; } public string ReturnUrl { get; set; }
public bool IsInternalNavigation { get; set; } public bool IsInternalNavigation { get; set; }
public Guid RenderId { get; set; } public Guid RenderId { get; set; }
public bool Refresh { get; set; }
public List<Page> Pages public List<Page> Pages
{ {

View File

@ -16,8 +16,8 @@
@if (string.IsNullOrEmpty(_installation.Message)) @if (string.IsNullOrEmpty(_installation.Message))
{ {
<div style="@_display"> <div style="@_display">
<CascadingValue Value="@PageState"> <CascadingValue Value="@_pageState">
<SiteRouter RenderMode="@RenderMode" Runtime="@Runtime" VisitorId="@VisitorId" OnStateChange="@ChangeState" /> <SiteRouter RenderMode="@RenderMode" Runtime="@Runtime" OnStateChange="@ChangeState" />
</CascadingValue> </CascadingValue>
</div> </div>
} }
@ -32,7 +32,7 @@
@code { @code {
[Parameter] [Parameter]
public string AntiForgeryToken { get; set; } public PageState PageState { get; set; } = null;
[Parameter] [Parameter]
public string RenderMode { get; set; } public string RenderMode { get; set; }
@ -41,13 +41,10 @@
public string Runtime { get; set; } public string Runtime { get; set; }
[Parameter] [Parameter]
public int VisitorId { get; set; } public string AntiForgeryToken { get; set; } = "";
[Parameter] [Parameter]
public string RemoteIPAddress { get; set; } public string AuthorizationToken { get; set; } = "";
[Parameter]
public string AuthorizationToken { get; set; }
[CascadingParameter] [CascadingParameter]
HttpContext HttpContext { get; set; } HttpContext HttpContext { get; set; }
@ -56,18 +53,23 @@
private string _display = ""; private string _display = "";
private Installation _installation = new Installation { Success = false, Message = "" }; private Installation _installation = new Installation { Success = false, Message = "" };
private PageState PageState { get; set; } private PageState _pageState { get; set; }
protected override async Task OnParametersSetAsync() protected override async Task OnParametersSetAsync()
{ {
if (PageState != null)
{
_pageState = PageState;
}
if (RenderMode == RenderModes.Interactive) if (RenderMode == RenderModes.Interactive)
{ {
_display = "display: none;"; _display = "display: none;";
} }
SiteState.RemoteIPAddress = RemoteIPAddress;
SiteState.AntiForgeryToken = AntiForgeryToken; SiteState.AntiForgeryToken = AntiForgeryToken;
SiteState.AuthorizationToken = AuthorizationToken; SiteState.AuthorizationToken = AuthorizationToken;
SiteState.RemoteIPAddress = (_pageState != null) ? _pageState.RemoteIPAddress : "";
SiteState.IsPrerendering = (HttpContext != null) ? true : false; SiteState.IsPrerendering = (HttpContext != null) ? true : false;
_installation = await InstallationService.IsInstalled(); _installation = await InstallationService.IsInstalled();
@ -90,7 +92,7 @@
private void ChangeState(PageState pageState) private void ChangeState(PageState pageState)
{ {
PageState = pageState; _pageState = pageState;
StateHasChanged(); StateHasChanged();
} }
} }

View File

@ -35,9 +35,6 @@
[Parameter] [Parameter]
public string Runtime { get; set; } public string Runtime { get; set; }
[Parameter]
public int VisitorId { get; set; }
[CascadingParameter] [CascadingParameter]
PageState PageState { get; set; } PageState PageState { get; set; }
@ -68,7 +65,7 @@
protected override async Task OnParametersSetAsync() protected override async Task OnParametersSetAsync()
{ {
if (PageState == null) if (PageState == null || PageState.Refresh)
{ {
await Refresh(); await Refresh();
} }
@ -100,6 +97,7 @@
var editmode = false; var editmode = false;
var refresh = false; var refresh = false;
var lastsyncdate = DateTime.MinValue; var lastsyncdate = DateTime.MinValue;
var visitorId = -1;
_error = ""; _error = "";
Route route = new Route(_absoluteUri, SiteState.Alias.Path); Route route = new Route(_absoluteUri, SiteState.Alias.Path);
@ -148,6 +146,7 @@
{ {
editmode = PageState.EditMode; editmode = PageState.EditMode;
lastsyncdate = PageState.LastSyncDate; lastsyncdate = PageState.LastSyncDate;
visitorId = PageState.VisitorId;
} }
if (PageState?.Page.Path != route.PagePath) if (PageState?.Page.Path != route.PagePath)
{ {
@ -159,7 +158,7 @@
} }
// get user // 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(); var authState = await AuthenticationStateProvider.GetAuthenticationStateAsync();
// verify user is authenticated for current site // verify user is authenticated for current site
@ -293,11 +292,12 @@
LastSyncDate = lastsyncdate, LastSyncDate = lastsyncdate,
RenderMode = RenderMode, RenderMode = RenderMode,
Runtime = (Shared.Runtime)Enum.Parse(typeof(Shared.Runtime), Runtime), Runtime = (Shared.Runtime)Enum.Parse(typeof(Shared.Runtime), Runtime),
VisitorId = VisitorId, VisitorId = visitorId,
RemoteIPAddress = SiteState.RemoteIPAddress, RemoteIPAddress = SiteState.RemoteIPAddress,
ReturnUrl = returnurl, ReturnUrl = returnurl,
IsInternalNavigation = _isInternalNavigation, IsInternalNavigation = _isInternalNavigation,
RenderId = Guid.NewGuid() RenderId = Guid.NewGuid(),
Refresh = false
}; };
OnStateChange?.Invoke(_pagestate); OnStateChange?.Invoke(_pagestate);

View File

@ -19,12 +19,8 @@ else
protected override void OnInitialized() protected override void OnInitialized()
{ {
Parameters = new Dictionary<string, object>(); Parameters = new Dictionary<string, object>();
Parameters.Add(new KeyValuePair<string, object>("AntiForgeryToken", ""));
Parameters.Add(new KeyValuePair<string, object>("RenderMode", RenderModes.Interactive)); Parameters.Add(new KeyValuePair<string, object>("RenderMode", RenderModes.Interactive));
Parameters.Add(new KeyValuePair<string, object>("Runtime", Runtimes.Hybrid)); Parameters.Add(new KeyValuePair<string, object>("Runtime", Runtimes.Hybrid));
Parameters.Add(new KeyValuePair<string, object>("VisitorId", -1));
Parameters.Add(new KeyValuePair<string, object>("RemoteIPAddress", ""));
Parameters.Add(new KeyValuePair<string, object>("AuthorizationToken", ""));
if (MauiConstants.UseAppSettings) if (MauiConstants.UseAppSettings)
{ {

View File

@ -47,7 +47,7 @@ public static class MauiProgram
builder.Services.AddOqtaneAuthentication(); builder.Services.AddOqtaneAuthentication();
// register scoped core services // register scoped core services
builder.Services.AddOqtaneScopedServices(); builder.Services.AddOqtaneClientScopedServices();
var assemblies = AppDomain.CurrentDomain.GetOqtaneAssemblies(); var assemblies = AppDomain.CurrentDomain.GetOqtaneAssemblies();
foreach (var assembly in assemblies) foreach (var assembly in assemblies)

View File

@ -20,7 +20,7 @@
@inject IAntiforgery Antiforgery @inject IAntiforgery Antiforgery
@inject IConfigManager ConfigManager @inject IConfigManager ConfigManager
@inject ITenantManager TenantManager @inject ITenantManager TenantManager
@inject ISiteRepository SiteRepository @inject ISiteService SiteService
@inject IPageRepository PageRepository @inject IPageRepository PageRepository
@inject IThemeRepository ThemeRepository @inject IThemeRepository ThemeRepository
@inject ILanguageRepository LanguageRepository @inject ILanguageRepository LanguageRepository
@ -31,9 +31,11 @@
@inject IVisitorRepository VisitorRepository @inject IVisitorRepository VisitorRepository
@inject IJwtManager JwtManager @inject IJwtManager JwtManager
<!DOCTYPE html> @if (_pageState != null)
<html lang="@_language"> {
<head> <!DOCTYPE html>
<html lang="@_language">
<head>
<meta charset="utf-8" /> <meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<base href="/" /> <base href="/" />
@ -56,17 +58,17 @@
<Head @rendermode="InteractiveRenderMode.GetInteractiveRenderMode(_runtime, _prerender)" /> <Head @rendermode="InteractiveRenderMode.GetInteractiveRenderMode(_runtime, _prerender)" />
} }
@((MarkupString)_headResources) @((MarkupString)_headResources)
</head> </head>
<body> <body>
@if (string.IsNullOrEmpty(_message)) @if (string.IsNullOrEmpty(_message))
{ {
@if (_renderMode == RenderModes.Static) @if (_renderMode == RenderModes.Static)
{ {
<Routes AntiForgeryToken="@_antiForgeryToken" RenderMode="@_renderMode" Runtime="@_runtime" VisitorId="@_visitorId" RemoteIPAddress="@_remoteIPAddress" AuthorizationToken="@_authorizationToken" /> <Routes PageState="@_pageState" RenderMode="@_renderMode" Runtime="@_runtime" AntiForgeryToken="@_antiForgeryToken" AuthorizationToken="@_authorizationToken" />
} }
else else
{ {
<Routes AntiForgeryToken="@_antiForgeryToken" RenderMode="@_renderMode" Runtime="@_runtime" VisitorId="@_visitorId" RemoteIPAddress="@_remoteIPAddress" AuthorizationToken="@_authorizationToken" @rendermode="InteractiveRenderMode.GetInteractiveRenderMode(_runtime, _prerender)" /> <Routes PageState="@_pageState" RenderMode="@_renderMode" Runtime="@_runtime" AntiForgeryToken="@_antiForgeryToken" AuthorizationToken="@_authorizationToken" @rendermode="InteractiveRenderMode.GetInteractiveRenderMode(_runtime, _prerender)" />
} }
<script src="js/interop.js"></script> <script src="js/interop.js"></script>
@ -86,8 +88,9 @@
{ {
<div class="app-alert">@_message</div> <div class="app-alert">@_message</div>
} }
</body> </body>
</html> </html>
}
@code { @code {
private string _renderMode = RenderModes.Interactive; private string _renderMode = RenderModes.Interactive;
@ -104,12 +107,13 @@
private string _PWAScript = ""; private string _PWAScript = "";
private string _reconnectScript = ""; private string _reconnectScript = "";
private string _message = ""; private string _message = "";
private PageState _pageState;
// CascadingParameter is required to access HttpContext // CascadingParameter is required to access HttpContext
[CascadingParameter] [CascadingParameter]
HttpContext Context { get; set; } HttpContext Context { get; set; }
protected override void OnInitialized() protected override async Task OnInitializedAsync()
{ {
_antiForgeryToken = Antiforgery.GetAndStoreTokens(Context).RequestToken; _antiForgeryToken = Antiforgery.GetAndStoreTokens(Context).RequestToken;
_remoteIPAddress = Context.Connection.RemoteIpAddress?.ToString() ?? ""; _remoteIPAddress = Context.Connection.RemoteIpAddress?.ToString() ?? "";
@ -127,7 +131,7 @@
HandleDefaultAliasRedirect(alias, url); 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) if (site != null && (!site.IsDeleted || url.Contains("admin/site")) && site.RenderMode != RenderModes.Headless)
{ {
_renderMode = site.RenderMode; _renderMode = site.RenderMode;
@ -226,6 +230,31 @@
_language = culture.Split('|')[0]; _language = culture.Split('|')[0];
_language = _language.Replace("c=", ""); _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 else
{ {