Fix double init on calendar days.
This commit is contained in:
@@ -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<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<CalendarSettingsUpdatedMessage>(this);
|
||||
Messenger.Unregister<CalendarItemTappedMessage>(this);
|
||||
Messenger.Unregister<CalendarItemDoubleTappedMessage>(this);
|
||||
Messenger.Unregister<CalendarItemRightTappedMessage>(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)
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user