Files
Wino-Mail/Wino.Mail.WinUI/Views/SettingsPage.xaml.cs
T

290 lines
9.8 KiB
C#
Raw Normal View History

2025-11-15 14:52:01 +01:00
using System.Collections.ObjectModel;
using System.Linq;
2026-03-12 19:04:47 +01:00
using System.Threading.Tasks;
2025-11-15 14:52:01 +01:00
using CommunityToolkit.Mvvm.Messaging;
using Microsoft.UI.Xaml.Media.Animation;
using Microsoft.UI.Xaml.Navigation;
using Wino.Core.Domain;
2026-04-16 13:45:11 +02:00
using Wino.Core.Domain.Entities.Shared;
2025-11-15 14:52:01 +01:00
using Wino.Core.Domain.Enums;
2026-03-12 19:04:47 +01:00
using Wino.Core.Domain.Models.Settings;
2026-03-08 13:21:42 +01:00
using Wino.Helpers;
2025-11-15 14:52:01 +01:00
using Wino.Mail.ViewModels.Data;
2026-03-25 09:45:49 +01:00
using Wino.Mail.WinUI.Interfaces;
using Wino.Mail.WinUI.Models;
2025-11-15 14:52:01 +01:00
using Wino.Messaging.Client.Navigation;
2026-03-12 14:55:07 +01:00
using Wino.Messaging.UI;
2025-11-15 14:52:01 +01:00
using Wino.Views.Abstract;
using Wino.Views.Settings;
namespace Wino.Views;
public sealed partial class SettingsPage : SettingsPageAbstract,
IRecipient<BreadcrumbNavigationRequested>,
2026-03-12 14:55:07 +01:00
IRecipient<BackBreadcrumNavigationRequested>,
2026-03-12 19:04:47 +01:00
IRecipient<SettingsRootNavigationRequested>,
2026-03-12 14:55:07 +01:00
IRecipient<MergedInboxRenamed>,
2026-03-25 09:45:49 +01:00
IRecipient<AccountUpdatedMessage>,
ITitleBarSearchHost
2025-11-15 14:52:01 +01:00
{
public ObservableCollection<BreadcrumbNavigationItemViewModel> PageHistory { get; set; } = [];
2026-03-25 09:45:49 +01:00
public ObservableCollection<TitleBarSearchSuggestion> SearchSuggestions { get; } = [];
public string SearchText { get; set; } = string.Empty;
public string SearchPlaceholderText => Translator.SettingsHome_SearchPlaceholder;
2025-11-15 14:52:01 +01:00
public SettingsPage()
{
InitializeComponent();
}
protected override void OnNavigatedTo(NavigationEventArgs e)
{
base.OnNavigatedTo(e);
// Register for frame navigation events to track back button visibility
SettingsFrame.Navigated -= SettingsFrameNavigated;
SettingsFrame.Navigated += SettingsFrameNavigated;
2025-11-15 14:52:01 +01:00
2026-03-12 19:04:47 +01:00
var initialPage = e.Parameter as WinoPage? ?? WinoPage.SettingOptionsPage;
NavigateToRootPage(initialPage);
2025-11-15 14:52:01 +01:00
}
public override void OnLanguageChanged()
{
base.OnLanguageChanged();
// Update Settings header in breadcrumb.
var settingsHeader = PageHistory.FirstOrDefault();
if (settingsHeader == null) return;
settingsHeader.Title = Translator.MenuSettings;
2026-03-12 14:55:07 +01:00
var manageAccountsEntry = PageHistory.FirstOrDefault(a =>
a.Request.PageType == WinoPage.ManageAccountsPage || a.Request.PageType == WinoPage.AccountManagementPage);
if (manageAccountsEntry != null)
{
manageAccountsEntry.Title = Translator.SettingsManageAccountSettings_Title;
}
2026-03-18 09:00:26 +01:00
var winoAccountEntry = PageHistory.FirstOrDefault(a => a.Request.PageType == WinoPage.WinoAccountManagementPage);
if (winoAccountEntry != null)
{
winoAccountEntry.Title = Translator.WinoAccount_SettingsSection_Title;
}
2026-03-12 19:04:47 +01:00
_ = RefreshCurrentPageStateAsync();
UpdateWindowTitle();
2025-11-15 14:52:01 +01:00
}
protected override void OnNavigatingFrom(NavigatingCancelEventArgs e)
{
// Unregister frame navigation event
SettingsFrame.Navigated -= SettingsFrameNavigated;
2025-11-15 14:52:01 +01:00
base.OnNavigatingFrom(e);
}
protected override void RegisterRecipients()
{
base.RegisterRecipients();
2025-11-15 14:52:01 +01:00
WeakReferenceMessenger.Default.Register<BreadcrumbNavigationRequested>(this);
WeakReferenceMessenger.Default.Register<BackBreadcrumNavigationRequested>(this);
2026-03-12 19:04:47 +01:00
WeakReferenceMessenger.Default.Register<SettingsRootNavigationRequested>(this);
2026-03-12 14:55:07 +01:00
WeakReferenceMessenger.Default.Register<MergedInboxRenamed>(this);
WeakReferenceMessenger.Default.Register<AccountUpdatedMessage>(this);
2025-11-15 14:52:01 +01:00
}
protected override void UnregisterRecipients()
{
base.UnregisterRecipients();
2025-11-15 14:52:01 +01:00
WeakReferenceMessenger.Default.Unregister<BreadcrumbNavigationRequested>(this);
WeakReferenceMessenger.Default.Unregister<BackBreadcrumNavigationRequested>(this);
2026-03-12 19:04:47 +01:00
WeakReferenceMessenger.Default.Unregister<SettingsRootNavigationRequested>(this);
2026-03-12 14:55:07 +01:00
WeakReferenceMessenger.Default.Unregister<MergedInboxRenamed>(this);
WeakReferenceMessenger.Default.Unregister<AccountUpdatedMessage>(this);
2025-11-15 14:52:01 +01:00
}
void IRecipient<BreadcrumbNavigationRequested>.Receive(BreadcrumbNavigationRequested message)
{
2026-03-12 14:55:07 +01:00
NavigateBreadcrumb(message);
2025-11-15 14:52:01 +01:00
}
private void SettingsFrameNavigated(object sender, NavigationEventArgs e)
{
2026-03-12 19:04:47 +01:00
UpdateBackNavigationState();
_ = RefreshCurrentPageStateAsync();
}
private void GoBackFrame(Core.Domain.Enums.NavigationTransitionEffect slideEffect)
{
2026-03-08 13:21:42 +01:00
if (!BreadcrumbNavigationHelper.GoBack(SettingsFrame, PageHistory, slideEffect))
return;
2026-03-12 19:04:47 +01:00
UpdateBackNavigationState();
_ = RefreshCurrentPageStateAsync();
2026-03-08 13:21:42 +01:00
UpdateWindowTitle();
}
2025-11-15 14:52:01 +01:00
private void BreadItemClicked(Microsoft.UI.Xaml.Controls.BreadcrumbBar sender, Microsoft.UI.Xaml.Controls.BreadcrumbBarItemClickedEventArgs args)
{
2026-03-08 13:21:42 +01:00
if (!BreadcrumbNavigationHelper.NavigateTo(SettingsFrame, PageHistory, args.Index))
return;
2025-11-15 14:52:01 +01:00
2026-03-12 19:04:47 +01:00
UpdateBackNavigationState();
_ = RefreshCurrentPageStateAsync();
2026-03-08 13:21:42 +01:00
UpdateWindowTitle();
2025-11-15 14:52:01 +01:00
}
public void Receive(BackBreadcrumNavigationRequested message)
{
GoBackFrame(message.SlideEffect);
}
2026-03-12 19:04:47 +01:00
public void Receive(SettingsRootNavigationRequested message)
{
var currentRootPage = SettingsNavigationInfoProvider.GetRootPage(PageHistory.LastOrDefault()?.Request.PageType ?? WinoPage.SettingOptionsPage);
if (message.PageType != WinoPage.SettingOptionsPage && currentRootPage == message.PageType)
return;
NavigateToRootPage(message.PageType);
}
2026-03-12 14:55:07 +01:00
public void Receive(AccountUpdatedMessage message)
{
var activePage = PageHistory.LastOrDefault(a => a.Request.PageType == WinoPage.AccountDetailsPage);
if (activePage == null)
return;
DispatcherQueue.TryEnqueue(() =>
{
2026-04-16 13:45:11 +02:00
activePage.Title = GetAccountDetailsTitle(message.Account);
2026-03-12 19:04:47 +01:00
_ = RefreshCurrentPageStateAsync();
2026-03-12 14:55:07 +01:00
UpdateWindowTitle();
});
}
public void Receive(MergedInboxRenamed message)
{
var activePage = PageHistory.LastOrDefault(a => a.Request.PageType == WinoPage.MergedAccountDetailsPage);
if (activePage == null)
return;
DispatcherQueue.TryEnqueue(() =>
{
activePage.Title = message.NewName;
2026-03-12 19:04:47 +01:00
_ = RefreshCurrentPageStateAsync();
2026-03-12 14:55:07 +01:00
UpdateWindowTitle();
});
}
private void NavigateBreadcrumb(BreadcrumbNavigationRequested message)
{
if (!BreadcrumbNavigationHelper.Navigate(SettingsFrame, PageHistory, message, ViewModel.NavigationService.GetPageType))
return;
2026-03-12 19:04:47 +01:00
UpdateBackNavigationState();
_ = RefreshCurrentPageStateAsync();
2026-03-12 14:55:07 +01:00
UpdateWindowTitle();
}
2026-03-12 19:04:47 +01:00
private void NavigateToRootPage(WinoPage targetPage)
{
PageHistory.Clear();
SettingsFrame.BackStack.Clear();
SettingsFrame.ForwardStack.Clear();
NavigateBreadcrumb(new BreadcrumbNavigationRequested(Translator.MenuSettings, WinoPage.SettingOptionsPage));
if (targetPage != WinoPage.SettingOptionsPage)
{
NavigateBreadcrumb(new BreadcrumbNavigationRequested(
SettingsNavigationInfoProvider.GetPageTitle(targetPage),
targetPage));
return;
}
UpdateWindowTitle();
}
2026-03-14 14:14:58 +01:00
public void ResetForModeSwitch()
{
while (PageHistory.Count > 1 && SettingsFrame.CanGoBack)
{
if (!BreadcrumbNavigationHelper.GoBack(SettingsFrame, PageHistory, Core.Domain.Enums.NavigationTransitionEffect.FromRight))
break;
}
SettingsFrame.ForwardStack.Clear();
UpdateBackNavigationState();
_ = RefreshCurrentPageStateAsync();
UpdateWindowTitle();
}
2026-03-12 19:04:47 +01:00
private void UpdateBackNavigationState()
{
2026-03-24 18:05:09 +01:00
WeakReferenceMessenger.Default.Send(new TitleBarShellContentUpdated());
2026-03-12 19:04:47 +01:00
}
2026-03-24 18:05:09 +01:00
public bool CanNavigateBack => PageHistory.Count > 1 && SettingsFrame.CanGoBack;
2026-03-12 19:04:47 +01:00
private async Task RefreshCurrentPageStateAsync()
{
var activePage = PageHistory.LastOrDefault()?.Request.PageType ?? WinoPage.SettingOptionsPage;
var rootPage = SettingsNavigationInfoProvider.GetRootPage(activePage);
await ViewModel.UpdateActivePageAsync(rootPage);
WeakReferenceMessenger.Default.Send(new ActiveSettingsPageChanged(rootPage));
}
private void UpdateWindowTitle()
{
var activeTitle = PageHistory.LastOrDefault()?.Title;
ViewModel.StatePersistenceService.CoreWindowTitle = string.IsNullOrWhiteSpace(activeTitle)
? Translator.MenuSettings
: activeTitle;
}
2026-03-25 09:45:49 +01:00
2026-04-16 13:45:11 +02:00
private static string GetAccountDetailsTitle(MailAccount account)
=> !string.IsNullOrWhiteSpace(account?.Address)
? string.Format(Translator.SettingsAccountDetails_NavigationTitle, account.Address)
: account?.Name ?? Translator.AccountDetailsPage_Title;
2026-03-25 09:45:49 +01:00
public Task OnTitleBarSearchTextChangedAsync()
{
SearchSuggestions.Clear();
foreach (var item in SettingsNavigationInfoProvider.Search(SearchText, ViewModel.ManageAccountsDescription).Take(6))
{
SearchSuggestions.Add(new TitleBarSearchSuggestion(item.Title, item.Description, item));
}
return Task.CompletedTask;
}
public void OnTitleBarSearchSuggestionChosen(TitleBarSearchSuggestion suggestion)
{
SearchText = suggestion.Title;
}
public Task OnTitleBarSearchSubmittedAsync(string queryText, TitleBarSearchSuggestion? chosenSuggestion)
{
SearchText = queryText;
var selectedSetting = chosenSuggestion?.Tag as SettingsNavigationItemInfo
?? SettingsNavigationInfoProvider.Search(queryText, ViewModel.ManageAccountsDescription).FirstOrDefault();
if (selectedSetting?.PageType is WinoPage pageType)
{
Receive(new SettingsRootNavigationRequested(pageType));
}
return Task.CompletedTask;
}
2025-11-15 14:52:01 +01:00
}