155 lines
3.6 KiB
C#
155 lines
3.6 KiB
C#
using Microsoft.AspNetCore.Components;
|
|
using Microsoft.AspNetCore.Components.Server.ProtectedBrowserStorage;
|
|
using System.Reflection;
|
|
using System.Text.Json;
|
|
using System.Text.RegularExpressions;
|
|
|
|
namespace SummerBestWebForm2.AppState;
|
|
|
|
public partial class CascadingAppState : ComponentBase, IAppState
|
|
{
|
|
private readonly string StorageKey = "SummerBestWebForm2-MyCarHQ";
|
|
[Parameter]
|
|
public RenderFragment? ChildContent { get; set; }
|
|
[Inject]
|
|
ProtectedLocalStorage? localStorage { get; set; }
|
|
[Inject]
|
|
IHttpContextAccessor? httpContextAccessor { get; set; }
|
|
|
|
bool isLoaded = false;
|
|
|
|
public Guid SessionId { get; set; }
|
|
|
|
public bool isInit { get; set; }
|
|
|
|
//public CascadingAppState()
|
|
//{
|
|
// Load();
|
|
//}
|
|
|
|
private string? _myIpAddress = string.Empty;
|
|
public string? myIpAddress
|
|
{
|
|
get => _myIpAddress;
|
|
set
|
|
{
|
|
_myIpAddress = value;
|
|
Save();
|
|
}
|
|
}
|
|
|
|
private DateTimeOffset _DateCreated = DateTimeOffset.Now;
|
|
public DateTimeOffset DateCreated
|
|
{
|
|
get => _DateCreated;
|
|
set
|
|
{
|
|
_DateCreated = value;
|
|
Save();
|
|
}
|
|
}
|
|
private DateTimeOffset _DateExpires = DateTimeOffset.Now;
|
|
public DateTimeOffset DateExpires
|
|
{
|
|
get => _DateExpires;
|
|
set
|
|
{
|
|
_DateExpires = value;
|
|
Save();
|
|
}
|
|
}
|
|
|
|
// (o) (O) / (o) (O) / (o) (O) / (o) (O) / (o) (O) / (o) (O) / (o) (O) / (o) (O) / (o) (O) / (o) (O) / (o) (O) / (o) (O) / (o) (O) / (o) (O) / (o) (O) / (o) (O) / (o) (O) / (o) (O) / (o) (O) / (o) (O) / (o) (O)
|
|
|
|
protected override async Task OnAfterRenderAsync(bool firstRender)
|
|
{
|
|
await base.OnAfterRenderAsync(firstRender);
|
|
if (firstRender)
|
|
{
|
|
await LoadAsync();
|
|
StateHasChanged();
|
|
}
|
|
}
|
|
|
|
private void Save()
|
|
{
|
|
new Task(async () =>
|
|
{
|
|
await SaveAsync();
|
|
}).Start();
|
|
} //Save
|
|
|
|
public async Task SaveAsync()
|
|
{
|
|
if (!isLoaded) return;
|
|
|
|
// serialize
|
|
var state = (IAppState)this;
|
|
var json = JsonSerializer.Serialize(state);
|
|
// save
|
|
await localStorage.SetAsync(StorageKey, json);
|
|
} //SaveAsync
|
|
|
|
private void Load()
|
|
{
|
|
new Task(async () =>
|
|
{
|
|
await LoadAsync();
|
|
}).Start();
|
|
} //Load
|
|
|
|
public async Task LoadAsync()
|
|
{
|
|
string remoteIpAddr=string.Empty;
|
|
try
|
|
{
|
|
remoteIpAddr = httpContextAccessor.HttpContext.Connection.RemoteIpAddress?.ToString() ?? "";
|
|
var data = await localStorage.GetAsync<string>(StorageKey);
|
|
var state = JsonSerializer.Deserialize<MdlAppState>(data.Value);
|
|
|
|
if (state != null)
|
|
{
|
|
if (DateTimeOffset.Now < state.DateExpires)
|
|
{
|
|
// decide whether to set properties manually or with reflection
|
|
|
|
// comment to set properties manually
|
|
//this.Message = state.Message;
|
|
//this.Count = state.Count;
|
|
|
|
// set properties using Reflaction
|
|
var t = typeof(IAppState);
|
|
//var props = t.GetProperties();
|
|
PropertyInfo[] props = t.GetProperties();
|
|
foreach (var prop in props)
|
|
{
|
|
//if (!Regex.IsMatch(prop.Name, "isInit|SessionId|"))
|
|
{
|
|
var value = prop.GetValue(state, null);
|
|
prop.SetValue(this, value, null);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
// do something
|
|
}
|
|
isLoaded = true;
|
|
DateExpires = DateTimeOffset.Now.AddHours(36);
|
|
myIpAddress = remoteIpAddr;
|
|
if (!isInit)
|
|
{
|
|
DateCreated = DateTimeOffset.Now;
|
|
SessionId = Guid.NewGuid();
|
|
isInit = true;
|
|
await SaveAsync();
|
|
}
|
|
await InvokeAsync(() =>
|
|
{
|
|
StateHasChanged();
|
|
});
|
|
} //LoadAsync
|
|
}
|