wwwroot/js/theme.js now picks the theme. It sets data-theme (neo-light or neo-dark, or none when the OS decides) and the hue and chroma variables on <html>, using the same flag precedence as the old CascadingState branches. It also keeps <meta name="theme-color"> in sync. Because it runs in <head> from the settings saved in localStorage, a reload no longer flashes the default palette before Blazor boots. With system theming it also follows the OS when the colour scheme changes. CascadingState loses its ~200 lines of generated <style> and <Meta> tags. It now calls AppStatusService.ApplyTheme on load and whenever the settings change. The --fa-* icon colour variables are gone; nothing read them. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LsXgEaXee4GCU1hwYgPJXw
131 lines
3.2 KiB
Plaintext
131 lines
3.2 KiB
Plaintext
<CascadingValue IsFixed=false Value=this>
|
|
@ChildContent
|
|
</CascadingValue>
|
|
|
|
@code {
|
|
[Parameter] public RenderFragment ChildContent { get; set; }
|
|
[Inject] IStorage DbStorage { get; set; }
|
|
[Inject] ILocalStorageService Storage { get; set; }
|
|
[Inject] IJSRuntime JS { get; set; }
|
|
// [Inject] DataService DataService { get; set; }
|
|
[Inject] public AppStatusService Status { get; set; }
|
|
[Inject] ILogger<CascadingState> Logger { get; set; }
|
|
|
|
public bool IsOnline { get; set; } = true;
|
|
Timer IsOnlineTimer { get; set; }
|
|
public PublicCacheData PublicCacheData { get; set; }
|
|
public User User { get; set; }
|
|
|
|
DotNetObjectReference<CascadingState> cascadingStateReference;
|
|
|
|
protected override async Task OnInitializedAsync()
|
|
{
|
|
try
|
|
{
|
|
IsOnlineTimer = new Timer(async _ => await UpdateIsOnline(), new AutoResetEvent(false), 0, 10000);
|
|
cascadingStateReference = DotNetObjectReference.Create(this);
|
|
await JS.InvokeVoidAsync("cascadingStateInstanceReference", cascadingStateReference);
|
|
PublicCacheData = await Storage.GetItemAsync<PublicCacheData>(nameof(PublicCacheData));
|
|
if (PublicCacheData == null)
|
|
{
|
|
PublicCacheData = new();
|
|
await UpdatePublicCache(PublicCacheData);
|
|
}
|
|
else
|
|
Status.ApplyTheme(PublicCacheData.PageSettings);
|
|
|
|
User = new();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Logger.LogError(ex, $"{nameof(CascadingState)}.{nameof(OnInitializedAsync)}");
|
|
}
|
|
}
|
|
|
|
public async ValueTask UpdatePublicCache(PublicCacheData publicCacheData)
|
|
{
|
|
try
|
|
{
|
|
PublicCacheData = publicCacheData;
|
|
await Storage.SetItemAsync(nameof(PublicCacheData), PublicCacheData);
|
|
Status.ApplyTheme(PublicCacheData.PageSettings);
|
|
StateHasChanged();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Console.WriteLine($"{nameof(CascadingState)}.{nameof(UpdatePublicCache)}");
|
|
Console.WriteLine(ex.ToString());
|
|
}
|
|
}
|
|
|
|
[JSInvokable]
|
|
public async Task LogFromJs(string message, string where)
|
|
{
|
|
try
|
|
{
|
|
await ProcessError(new(message), where);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Logger.LogError(ex, $"{nameof(CascadingState)}.{nameof(LogFromJs)}");
|
|
}
|
|
}
|
|
|
|
async Task UpdateIsOnline()
|
|
{
|
|
try
|
|
{
|
|
var latestOnlineState = await Status.IsOnline();
|
|
|
|
//var latestOnlineState = Random.Shared.Next() % 2 == 0;
|
|
if (latestOnlineState != IsOnline)
|
|
{
|
|
IsOnline = latestOnlineState;
|
|
StateHasChanged();
|
|
}
|
|
// else
|
|
// {
|
|
// var pingIsOnline = await DataService.Ping();
|
|
// if (pingIsOnline != IsOnline)
|
|
// {
|
|
// IsOnline = pingIsOnline;
|
|
// StateHasChanged();
|
|
// }
|
|
// }
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Logger.LogError(ex, $"{nameof(CascadingState)}.{nameof(UpdateIsOnline)}");
|
|
}
|
|
}
|
|
|
|
public async ValueTask ProcessError(Exception ex, string where)
|
|
{
|
|
try
|
|
{
|
|
await DbStorage.AddLog(ex, where);
|
|
Logger.LogError(ex, where);
|
|
await Task.Run(() => {
|
|
});
|
|
}
|
|
catch (Exception exception)
|
|
{
|
|
Logger.LogError(exception, $"{nameof(CascadingState)}.{nameof(ProcessError)}");
|
|
}
|
|
}
|
|
|
|
public async ValueTask ProcessWarning(string message, string where)
|
|
{
|
|
try
|
|
{
|
|
await DbStorage.AddLog(message, where);
|
|
Logger.LogWarning("{where} - {message}", where, message);
|
|
await Task.Run(() => {
|
|
});
|
|
}
|
|
catch (Exception exception)
|
|
{
|
|
Logger.LogError(exception, $"{nameof(CascadingState)}.{nameof(ProcessWarning)}");
|
|
}
|
|
}
|
|
} |