@using Blazored.LocalStorage; @using Microsoft.AspNetCore.Identity; @using MongoDB.Driver; @using Insight.Infrastructure @inject IServiceScopeFactory ServiceScopeFactory @inject ILocalStorageService LocalStorageService @inject IMongoDatabase Database @inject AuthenticationStateProvider AuthenticationStateProvider @if (DisableIcon is false) { } @code { [Parameter] public bool DisableIcon { get; set; } private MudTheme CurrentTheme { get; } = Themes.Default(); private bool DarkMode { get; set; } protected override async Task OnInitializedAsync() { await LoadDarkModeAsync(); } public async Task LoadDarkModeAsync() { // local storage var storageDarkMode = await LocalStorageService.GetItemAsync("darkmode"); if (storageDarkMode is bool darkmodeValue) DarkMode = darkmodeValue; // database override var state = await AuthenticationStateProvider.GetAuthenticationStateAsync(); if (state?.User.Identity is not null && state.User.Identity.IsAuthenticated) { using var scope = ServiceScopeFactory.CreateScope(); var userManager = scope.ServiceProvider.GetRequiredService>(); if (await userManager.FindByNameAsync(state.User.Identity.Name) is not InsightUser user) return; var userPrefs = await Database.UserPreference() .Find(p => p.User == user.Id.ToString()) .FirstOrDefaultAsync(); if (userPrefs is null) return; DarkMode = userPrefs.DarkMode; await LocalStorageService.SetItemAsync("darkmode", DarkMode); } } private async Task OnDarkModeToggleAsync() { // update current DarkMode = !DarkMode; // update local storage await LocalStorageService.SetItemAsync("darkmode", DarkMode); // update database var state = await AuthenticationStateProvider.GetAuthenticationStateAsync(); if (state?.User.Identity is not null && state.User.Identity.IsAuthenticated) { using var scope = ServiceScopeFactory.CreateScope(); var userManager = scope.ServiceProvider.GetRequiredService>(); if (await userManager.FindByNameAsync(state.User.Identity.Name) is not InsightUser user) return; var date = DateTime.Now; var userPrefs = await Database.UserPreference() .UpdateOneAsync(p => p.User == user.Id.ToString(), Builders.Update .SetOnInsert(p => p.User, user.Id.ToString()) .SetOnInsert(p => p.Insert, date) .Set(p => p.Update, date) .Set(p => p.DarkMode, DarkMode), new UpdateOptions { IsUpsert = true }); } await InvokeAsync(StateHasChanged); } }