@page "/settings"
@attribute [Authorize]
@inject IUserSessionService Session
@inject IUserContextAccessor UserContext
@inject IJSRuntime JS
@inject TranslationSource T
@rendermode InteractiveServer
@using Microsoft.JSInterop
@using SharepointToolbox.Web.Core.Models
@using SharepointToolbox.Web.Services.Session
@T["tab.settings"]
@T["settings.section.display"]
@if (UserContext.Role == UserRole.Admin)
{
@* MSP branding is shared (global settings file) — only Admins set it for everyone. *@
@T["settings.section.branding"]
}
@if (_saved) { @T["settings.saved"]
}
@code {
private string _lang = "en", _theme = "System";
private bool _autoTakeOwnership, _saved;
private LogoData? _mspLogo;
protected override void OnInitialized()
{
var s = Session.Settings;
// Read the persisted language directly — the interactive circuit doesn't reliably inherit
// ambient CurrentUICulture (see TranslationSource), so reading it here shows the wrong value.
_lang = s.Lang is "fr" or "en" ? s.Lang : "fr";
_theme = s.Theme is "System" or "Light" or "Dark" ? s.Theme : "System";
_autoTakeOwnership = s.AutoTakeOwnership;
_mspLogo = s.MspLogo;
}
private async Task OnMspLogoChanged(LogoData? logo)
{
_mspLogo = logo;
await Save();
}
private async Task Save()
{
var langChanged = !string.Equals(Session.Settings.Lang, _lang, StringComparison.Ordinal);
Session.UpdateSettings(new AppSettings { Lang = _lang, Theme = _theme, AutoTakeOwnership = _autoTakeOwnership, MspLogo = _mspLogo });
T.SetCulture(_lang);
await JS.InvokeVoidAsync("sptb.setTheme", _theme);
// Persisted above. A full reload restarts the circuit; MainLayout then applies the new
// language (from the just-saved settings) before anything renders.
if (langChanged)
{
await JS.InvokeVoidAsync("location.reload");
return;
}
_saved = true;
StateHasChanged();
_ = Task.Delay(2000).ContinueWith(_ => { _saved = false; InvokeAsync(StateHasChanged); });
}
}