Fix double init on calendar days.

This commit is contained in:
Burak Kaan Köse
2026-02-19 01:37:43 +01:00
parent ab0810f710
commit 564cb0b16f
2 changed files with 52 additions and 22 deletions
@@ -168,29 +168,28 @@ public partial class CalendarPageViewModel : CalendarBaseViewModel,
AccountCalendarStateService.AccountCalendarSelectionStateChanged += UpdateAccountCalendarRequested; AccountCalendarStateService.AccountCalendarSelectionStateChanged += UpdateAccountCalendarRequested;
AccountCalendarStateService.CollectiveAccountGroupSelectionStateChanged += AccountCalendarStateCollectivelyChanged; AccountCalendarStateService.CollectiveAccountGroupSelectionStateChanged += AccountCalendarStateCollectivelyChanged;
// We don't register on navigation here. This page is cached.
RegisterRecipients();
} }
protected override void RegisterRecipients() protected override void RegisterRecipients()
{ {
base.RegisterRecipients(); base.RegisterRecipients();
Messenger.Register<LoadCalendarMessage>(this);
Messenger.Register<CalendarSettingsUpdatedMessage>(this);
Messenger.Register<CalendarItemTappedMessage>(this);
Messenger.Register<CalendarItemDoubleTappedMessage>(this);
Messenger.Register<CalendarItemRightTappedMessage>(this);
Messenger.Register<AccountRemovedMessage>(this);
}
protected override void UnregisterRecipients()
{
base.UnregisterRecipients();
Messenger.Unregister<LoadCalendarMessage>(this); Messenger.Unregister<LoadCalendarMessage>(this);
Messenger.Unregister<CalendarSettingsUpdatedMessage>(this); Messenger.Unregister<CalendarSettingsUpdatedMessage>(this);
Messenger.Unregister<CalendarItemTappedMessage>(this); Messenger.Unregister<CalendarItemTappedMessage>(this);
Messenger.Unregister<CalendarItemDoubleTappedMessage>(this); Messenger.Unregister<CalendarItemDoubleTappedMessage>(this);
Messenger.Unregister<CalendarItemRightTappedMessage>(this); Messenger.Unregister<CalendarItemRightTappedMessage>(this);
Messenger.Unregister<AccountRemovedMessage>(this); Messenger.Unregister<AccountRemovedMessage>(this);
Messenger.Register<LoadCalendarMessage>(this);
Messenger.Register<CalendarSettingsUpdatedMessage>(this);
Messenger.Register<CalendarItemTappedMessage>(this);
Messenger.Register<CalendarItemDoubleTappedMessage>(this);
Messenger.Register<CalendarItemRightTappedMessage>(this);
Messenger.Register<AccountRemovedMessage>(this);
} }
private void AccountCalendarStateCollectivelyChanged(object sender, GroupedAccountCalendarViewModel e) private void AccountCalendarStateCollectivelyChanged(object sender, GroupedAccountCalendarViewModel e)
@@ -234,19 +233,10 @@ public partial class CalendarPageViewModel : CalendarBaseViewModel,
public override void OnNavigatedTo(NavigationMode mode, object parameters) 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(); RefreshSettings();
if (mode == NavigationMode.Back) return;
// Automatically select the first primary calendar for quick event dialog. // Automatically select the first primary calendar for quick event dialog.
SelectedQuickEventAccountCalendar = AccountCalendarStateService.ActiveCalendars.FirstOrDefault(a => a.IsPrimary); SelectedQuickEventAccountCalendar = AccountCalendarStateService.ActiveCalendars.FirstOrDefault(a => a.IsPrimary);
} }
@@ -6,6 +6,7 @@ using Microsoft.UI.Xaml.Controls;
using Wino.Calendar.Views; using Wino.Calendar.Views;
using Wino.Core.Domain.Enums; using Wino.Core.Domain.Enums;
using Wino.Core.Domain.Interfaces; using Wino.Core.Domain.Interfaces;
using Wino.Core.Domain.Models.Calendar;
using Wino.Core.Domain.Models.Navigation; using Wino.Core.Domain.Models.Navigation;
using Wino.Helpers; using Wino.Helpers;
using Wino.Mail.ViewModels.Data; using Wino.Mail.ViewModels.Data;
@@ -15,6 +16,7 @@ using Wino.Mail.WinUI.Interfaces;
using Wino.Mail.WinUI.Services; using Wino.Mail.WinUI.Services;
using Wino.Mail.WinUI.Views.Calendar; using Wino.Mail.WinUI.Views.Calendar;
using Wino.Messaging.Client.Mails; using Wino.Messaging.Client.Mails;
using Wino.Messaging.Client.Calendar;
using Wino.Messaging.Client.Navigation; using Wino.Messaging.Client.Navigation;
using Wino.Views; using Wino.Views;
using Wino.Views.Account; using Wino.Views.Account;
@@ -136,6 +138,7 @@ public class NavigationService : NavigationServiceBase, INavigationService
NavigationTransitionType transition = NavigationTransitionType.None) NavigationTransitionType transition = NavigationTransitionType.None)
{ {
var pageType = GetPageType(page); var pageType = GetPageType(page);
if (pageType == null) return false;
var currentApplicationMode = GetCoreFrame(NavigationReferenceFrame.ShellFrame)?.Content?.GetType() == typeof(MailAppShell) var currentApplicationMode = GetCoreFrame(NavigationReferenceFrame.ShellFrame)?.Content?.GetType() == typeof(MailAppShell)
? WinoApplicationMode.Mail ? WinoApplicationMode.Mail
@@ -151,6 +154,30 @@ public class NavigationService : NavigationServiceBase, INavigationService
// Calendar navigations. // Calendar navigations.
if (currentApplicationMode == WinoApplicationMode.Calendar) 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); return innerShellFrame.Navigate(pageType, parameter);
} }
else else
@@ -221,6 +248,19 @@ public class NavigationService : NavigationServiceBase, INavigationService
return false; 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) public void GoBack(Core.Domain.Enums.NavigationTransitionEffect slideEffect = Core.Domain.Enums.NavigationTransitionEffect.FromRight)
{ {
// Check if we're navigating within ManageAccountsPage (applies to both modes) // Check if we're navigating within ManageAccountsPage (applies to both modes)