From 564cb0b16f9196288523ca1cc6a1bce9fc15cd60 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Kaan=20K=C3=B6se?= Date: Thu, 19 Feb 2026 01:37:43 +0100 Subject: [PATCH] Fix double init on calendar days. --- .../CalendarPageViewModel.cs | 34 ++++++---------- Wino.Mail.WinUI/Services/NavigationService.cs | 40 +++++++++++++++++++ 2 files changed, 52 insertions(+), 22 deletions(-) diff --git a/Wino.Calendar.ViewModels/CalendarPageViewModel.cs b/Wino.Calendar.ViewModels/CalendarPageViewModel.cs index 862b76a3..269af68c 100644 --- a/Wino.Calendar.ViewModels/CalendarPageViewModel.cs +++ b/Wino.Calendar.ViewModels/CalendarPageViewModel.cs @@ -168,29 +168,28 @@ public partial class CalendarPageViewModel : CalendarBaseViewModel, AccountCalendarStateService.AccountCalendarSelectionStateChanged += UpdateAccountCalendarRequested; AccountCalendarStateService.CollectiveAccountGroupSelectionStateChanged += AccountCalendarStateCollectivelyChanged; + + // We don't register on navigation here. This page is cached. + RegisterRecipients(); } protected override void RegisterRecipients() { base.RegisterRecipients(); - Messenger.Register(this); - Messenger.Register(this); - Messenger.Register(this); - Messenger.Register(this); - Messenger.Register(this); - Messenger.Register(this); - } - protected override void UnregisterRecipients() - { - base.UnregisterRecipients(); - Messenger.Unregister(this); Messenger.Unregister(this); Messenger.Unregister(this); Messenger.Unregister(this); Messenger.Unregister(this); Messenger.Unregister(this); + + Messenger.Register(this); + Messenger.Register(this); + Messenger.Register(this); + Messenger.Register(this); + Messenger.Register(this); + Messenger.Register(this); } private void AccountCalendarStateCollectivelyChanged(object sender, GroupedAccountCalendarViewModel e) @@ -234,19 +233,10 @@ public partial class CalendarPageViewModel : CalendarBaseViewModel, public override void OnNavigatedTo(NavigationMode mode, object parameters) { - base.OnNavigatedTo(mode, parameters); - - if (mode == NavigationMode.Back) - { - // We unregister recipients on navigate-away, so mutations that happened while this page - // was not active (e.g. CalendarItemDeleted from details page) can be missed. - // Rehydrate currently visible ranges to guarantee UI and DB are consistent on return. - _ = RefreshVisibleRangesAsync(); - return; - } - RefreshSettings(); + if (mode == NavigationMode.Back) return; + // Automatically select the first primary calendar for quick event dialog. SelectedQuickEventAccountCalendar = AccountCalendarStateService.ActiveCalendars.FirstOrDefault(a => a.IsPrimary); } diff --git a/Wino.Mail.WinUI/Services/NavigationService.cs b/Wino.Mail.WinUI/Services/NavigationService.cs index 2d6b00e0..95b4c845 100644 --- a/Wino.Mail.WinUI/Services/NavigationService.cs +++ b/Wino.Mail.WinUI/Services/NavigationService.cs @@ -6,6 +6,7 @@ using Microsoft.UI.Xaml.Controls; using Wino.Calendar.Views; using Wino.Core.Domain.Enums; using Wino.Core.Domain.Interfaces; +using Wino.Core.Domain.Models.Calendar; using Wino.Core.Domain.Models.Navigation; using Wino.Helpers; using Wino.Mail.ViewModels.Data; @@ -15,6 +16,7 @@ using Wino.Mail.WinUI.Interfaces; using Wino.Mail.WinUI.Services; using Wino.Mail.WinUI.Views.Calendar; using Wino.Messaging.Client.Mails; +using Wino.Messaging.Client.Calendar; using Wino.Messaging.Client.Navigation; using Wino.Views; using Wino.Views.Account; @@ -136,6 +138,7 @@ public class NavigationService : NavigationServiceBase, INavigationService NavigationTransitionType transition = NavigationTransitionType.None) { var pageType = GetPageType(page); + if (pageType == null) return false; var currentApplicationMode = GetCoreFrame(NavigationReferenceFrame.ShellFrame)?.Content?.GetType() == typeof(MailAppShell) ? WinoApplicationMode.Mail @@ -151,6 +154,30 @@ public class NavigationService : NavigationServiceBase, INavigationService // Calendar navigations. if (currentApplicationMode == WinoApplicationMode.Calendar) { + var currentFrameType = GetCurrentFrameType(ref innerShellFrame); + + if (page == WinoPage.CalendarPage && + parameter is CalendarPageNavigationArgs calendarNavigationArgs) + { + var loadCalendarMessage = CreateLoadCalendarMessage(calendarNavigationArgs); + + // Date changes while CalendarPage is already active should not re-navigate the frame. + if (currentFrameType == pageType) + { + WeakReferenceMessenger.Default.Send(loadCalendarMessage); + return true; + } + + // If CalendarPage is the previous page, reuse it instead of creating a second instance. + var lastBackStackEntry = innerShellFrame.BackStack.Count > 0 ? innerShellFrame.BackStack[^1] : null; + if (innerShellFrame.CanGoBack && lastBackStackEntry?.SourcePageType == pageType) + { + innerShellFrame.GoBack(); + WeakReferenceMessenger.Default.Send(loadCalendarMessage); + return true; + } + } + return innerShellFrame.Navigate(pageType, parameter); } else @@ -221,6 +248,19 @@ public class NavigationService : NavigationServiceBase, INavigationService return false; } + private static LoadCalendarMessage CreateLoadCalendarMessage(CalendarPageNavigationArgs args) + { + var targetDate = args.RequestDefaultNavigation + ? DateTime.Now.Date + : args.NavigationDate; + + var initiative = args.RequestDefaultNavigation + ? CalendarInitInitiative.App + : CalendarInitInitiative.User; + + return new LoadCalendarMessage(targetDate, initiative); + } + public void GoBack(Core.Domain.Enums.NavigationTransitionEffect slideEffect = Core.Domain.Enums.NavigationTransitionEffect.FromRight) { // Check if we're navigating within ManageAccountsPage (applies to both modes)